summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 02:37:40 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-01-20 02:37:40 +0000
commit9ad5c7b5e23b4940e7a3ea3ca3a6fb77e6a8fab0 (patch)
treed088b5210e77d9fa91d954d8550e00e372b47378
downloadktorrent-9ad5c7b5e23b4940e7a3ea3ca3a6fb77e6a8fab0.tar.gz
ktorrent-9ad5c7b5e23b4940e7a3ea3ca3a6fb77e6a8fab0.zip
Updated to final KDE3 ktorrent release (2.2.6)
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/ktorrent@1077377 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
-rw-r--r--AUTHORS8
-rw-r--r--COPYING340
-rw-r--r--COPYING-DOCS397
-rw-r--r--ChangeLog195
-rw-r--r--Doxyfile275
-rw-r--r--INSTALL167
-rw-r--r--Makefile.am14
-rw-r--r--NEWS0
-rw-r--r--README18
-rw-r--r--TODO11
-rw-r--r--acinclude.m411945
-rw-r--r--aclocal.m41033
-rw-r--r--apps/Makefile.am1
-rw-r--r--apps/ktcachecheck/Makefile.am12
-rw-r--r--apps/ktcachecheck/cachecheck.cpp102
-rw-r--r--apps/ktcachecheck/cachechecker.cpp110
-rw-r--r--apps/ktcachecheck/cachechecker.h61
-rw-r--r--apps/ktcachecheck/multicachechecker.cpp143
-rw-r--r--apps/ktcachecheck/multicachechecker.h44
-rw-r--r--apps/ktcachecheck/singlecachechecker.cpp110
-rw-r--r--apps/ktcachecheck/singlecachechecker.h43
-rw-r--r--apps/ktorrent/Makefile.am65
-rw-r--r--apps/ktorrent/README81
-rw-r--r--apps/ktorrent/addpeerwidget.cpp111
-rw-r--r--apps/ktorrent/addpeerwidget.h93
-rw-r--r--apps/ktorrent/addpeerwidgetbase.ui164
-rw-r--r--apps/ktorrent/advancedpref.ui656
-rw-r--r--apps/ktorrent/custom_widgets.cw68
-rw-r--r--apps/ktorrent/dcopinterface.h69
-rw-r--r--apps/ktorrent/downloadpref.ui735
-rw-r--r--apps/ktorrent/fileselectdlg.cpp297
-rw-r--r--apps/ktorrent/fileselectdlg.h84
-rw-r--r--apps/ktorrent/fileselectdlgbase.ui384
-rw-r--r--apps/ktorrent/filterbar.cpp126
-rw-r--r--apps/ktorrent/filterbar.h70
-rw-r--r--apps/ktorrent/generalpref.ui475
-rw-r--r--apps/ktorrent/groups/Makefile.am15
-rw-r--r--apps/ktorrent/groups/activedownloadsgroup.cpp49
-rw-r--r--apps/ktorrent/groups/activedownloadsgroup.h45
-rw-r--r--apps/ktorrent/groups/activegroup.cpp49
-rw-r--r--apps/ktorrent/groups/activegroup.h45
-rw-r--r--apps/ktorrent/groups/activeuploadsgroup.cpp50
-rw-r--r--apps/ktorrent/groups/activeuploadsgroup.h45
-rw-r--r--apps/ktorrent/groups/allgroup.cpp41
-rw-r--r--apps/ktorrent/groups/allgroup.h43
-rw-r--r--apps/ktorrent/groups/downloadgroup.cpp45
-rw-r--r--apps/ktorrent/groups/downloadgroup.h43
-rw-r--r--apps/ktorrent/groups/group.cpp61
-rw-r--r--apps/ktorrent/groups/group.h133
-rw-r--r--apps/ktorrent/groups/groupmanager.cpp221
-rw-r--r--apps/ktorrent/groups/groupmanager.h132
-rw-r--r--apps/ktorrent/groups/groupview.cpp360
-rw-r--r--apps/ktorrent/groups/groupview.h125
-rw-r--r--apps/ktorrent/groups/inactivedownloadsgroup.cpp50
-rw-r--r--apps/ktorrent/groups/inactivedownloadsgroup.h45
-rw-r--r--apps/ktorrent/groups/inactivegroup.cpp49
-rw-r--r--apps/ktorrent/groups/inactivegroup.h45
-rw-r--r--apps/ktorrent/groups/inactiveuploadsgroup.cpp50
-rw-r--r--apps/ktorrent/groups/inactiveuploadsgroup.h45
-rw-r--r--apps/ktorrent/groups/queueddownloadsgroup.cpp47
-rw-r--r--apps/ktorrent/groups/queueddownloadsgroup.h44
-rw-r--r--apps/ktorrent/groups/queueduploadsgroup.cpp47
-rw-r--r--apps/ktorrent/groups/queueduploadsgroup.h44
-rw-r--r--apps/ktorrent/groups/torrentdrag.cpp37
-rw-r--r--apps/ktorrent/groups/torrentdrag.h43
-rw-r--r--apps/ktorrent/groups/torrentgroup.cpp147
-rw-r--r--apps/ktorrent/groups/torrentgroup.h56
-rw-r--r--apps/ktorrent/groups/uploadgroup.cpp45
-rw-r--r--apps/ktorrent/groups/uploadgroup.h43
-rw-r--r--apps/ktorrent/groups/userdownloadsgroup.cpp47
-rw-r--r--apps/ktorrent/groups/userdownloadsgroup.h44
-rw-r--r--apps/ktorrent/groups/useruploadsgroup.cpp47
-rw-r--r--apps/ktorrent/groups/useruploadsgroup.h44
-rw-r--r--apps/ktorrent/hi128-app-ktorrent.pngbin0 -> 26977 bytes
-rw-r--r--apps/ktorrent/hi128-mime-torrent.pngbin0 -> 18661 bytes
-rw-r--r--apps/ktorrent/hi16-app-ktorrent.pngbin0 -> 3734 bytes
-rw-r--r--apps/ktorrent/hi16-mime-torrent.pngbin0 -> 863 bytes
-rw-r--r--apps/ktorrent/hi22-action-ktencrypted.pngbin0 -> 653 bytes
-rw-r--r--apps/ktorrent/hi22-action-ktremove.pngbin0 -> 1526 bytes
-rw-r--r--apps/ktorrent/hi22-action-ktstart.pngbin0 -> 1232 bytes
-rw-r--r--apps/ktorrent/hi22-action-ktstart_all.pngbin0 -> 1399 bytes
-rw-r--r--apps/ktorrent/hi22-action-ktstop.pngbin0 -> 963 bytes
-rw-r--r--apps/ktorrent/hi22-action-ktstop_all.pngbin0 -> 1128 bytes
-rw-r--r--apps/ktorrent/hi22-app-ktorrent.pngbin0 -> 4369 bytes
-rw-r--r--apps/ktorrent/hi22-mime-torrent.pngbin0 -> 1344 bytes
-rw-r--r--apps/ktorrent/hi32-app-ktorrent.pngbin0 -> 5646 bytes
-rw-r--r--apps/ktorrent/hi32-mime-torrent.pngbin0 -> 2064 bytes
-rw-r--r--apps/ktorrent/hi48-action-ktplugins.pngbin0 -> 3101 bytes
-rw-r--r--apps/ktorrent/hi48-app-ktorrent.pngbin0 -> 8190 bytes
-rw-r--r--apps/ktorrent/hi48-mime-torrent.pngbin0 -> 3790 bytes
-rw-r--r--apps/ktorrent/hi64-action-ktinfowidget.pngbin0 -> 1776 bytes
-rw-r--r--apps/ktorrent/hi64-action-ktqueuemanager.pngbin0 -> 5596 bytes
-rw-r--r--apps/ktorrent/hi64-action-ktupnp.pngbin0 -> 5209 bytes
-rw-r--r--apps/ktorrent/hi64-app-ktorrent.pngbin0 -> 11144 bytes
-rw-r--r--apps/ktorrent/hi64-filesys-ktprefdownloads.pngbin0 -> 6781 bytes
-rw-r--r--apps/ktorrent/hi64-mime-torrent.pngbin0 -> 6005 bytes
-rw-r--r--apps/ktorrent/hisc-app-ktorrent.svgzbin0 -> 6674 bytes
-rw-r--r--apps/ktorrent/hisc-mime-torrent.svgzbin0 -> 10113 bytes
-rw-r--r--apps/ktorrent/ipfilterwidget.cpp194
-rw-r--r--apps/ktorrent/ipfilterwidget.h48
-rw-r--r--apps/ktorrent/ipfilterwidgetbase.ui368
-rw-r--r--apps/ktorrent/ktorrent.cpp1017
-rw-r--r--apps/ktorrent/ktorrent.desktop85
-rw-r--r--apps/ktorrent/ktorrent.h238
-rw-r--r--apps/ktorrent/ktorrent.lsm16
-rw-r--r--apps/ktorrent/ktorrentapp.cpp80
-rw-r--r--apps/ktorrent/ktorrentapp.h38
-rw-r--r--apps/ktorrent/ktorrentcore.cpp1145
-rw-r--r--apps/ktorrent/ktorrentcore.h357
-rw-r--r--apps/ktorrent/ktorrentdcop.cpp254
-rw-r--r--apps/ktorrent/ktorrentdcop.h75
-rw-r--r--apps/ktorrent/ktorrentplugin.desktop33
-rw-r--r--apps/ktorrent/ktorrentui.rc44
-rw-r--r--apps/ktorrent/ktorrentview.cpp912
-rw-r--r--apps/ktorrent/ktorrentview.h216
-rw-r--r--apps/ktorrent/ktorrentviewitem.cpp354
-rw-r--r--apps/ktorrent/ktorrentviewitem.h58
-rw-r--r--apps/ktorrent/ktorrentviewmenu.cpp217
-rw-r--r--apps/ktorrent/ktorrentviewmenu.h76
-rw-r--r--apps/ktorrent/leaktrace.cpp295
-rw-r--r--apps/ktorrent/main.cpp201
-rw-r--r--apps/ktorrent/newui/Makefile.am8
-rw-r--r--apps/ktorrent/newui/button.cpp351
-rw-r--r--apps/ktorrent/newui/button.h108
-rw-r--r--apps/ktorrent/newui/buttonbar.cpp346
-rw-r--r--apps/ktorrent/newui/buttonbar.h112
-rw-r--r--apps/ktorrent/newui/comdefs.h30
-rw-r--r--apps/ktorrent/newui/ddockwindow.cpp418
-rw-r--r--apps/ktorrent/newui/ddockwindow.h116
-rw-r--r--apps/ktorrent/newui/dmainwindow.cpp320
-rw-r--r--apps/ktorrent/newui/dmainwindow.h113
-rw-r--r--apps/ktorrent/newui/docksplitter.cpp175
-rw-r--r--apps/ktorrent/newui/docksplitter.h62
-rw-r--r--apps/ktorrent/newui/dtabwidget.cpp111
-rw-r--r--apps/ktorrent/newui/dtabwidget.h58
-rw-r--r--apps/ktorrent/pastedialog.cpp62
-rw-r--r--apps/ktorrent/pastedialog.h44
-rw-r--r--apps/ktorrent/pastedlgbase.ui142
-rw-r--r--apps/ktorrent/pref.cpp508
-rw-r--r--apps/ktorrent/pref.h121
-rw-r--r--apps/ktorrent/queuedialog.cpp391
-rw-r--r--apps/ktorrent/queuedialog.h83
-rw-r--r--apps/ktorrent/queuedlg.ui726
-rw-r--r--apps/ktorrent/scandialog.cpp202
-rw-r--r--apps/ktorrent/scandialog.h87
-rw-r--r--apps/ktorrent/scandlgbase.ui193
-rw-r--r--apps/ktorrent/speedlimitsdlg.cpp63
-rw-r--r--apps/ktorrent/speedlimitsdlg.h47
-rw-r--r--apps/ktorrent/speedlimitsdlgbase.ui196
-rw-r--r--apps/ktorrent/torrentcreatordlg.cpp152
-rw-r--r--apps/ktorrent/torrentcreatordlg.h39
-rw-r--r--apps/ktorrent/torrentcreatordlgbase.ui533
-rw-r--r--apps/ktorrent/trayhoverpopup.cpp136
-rw-r--r--apps/ktorrent/trayhoverpopup.h71
-rw-r--r--apps/ktorrent/trayicon.cpp380
-rw-r--r--apps/ktorrent/trayicon.h141
-rw-r--r--apps/ktorrent/viewmanager.cpp265
-rw-r--r--apps/ktorrent/viewmanager.h114
-rw-r--r--apps/ktorrent/x-bittorrent.desktop39
-rw-r--r--apps/kttorinfo/Makefile.am10
-rw-r--r--apps/kttorinfo/main.cpp54
-rw-r--r--apps/ktupnptest/Makefile.am9
-rw-r--r--apps/ktupnptest/main.cpp98
-rw-r--r--apps/ktupnptest/mainwidget.ui76
-rw-r--r--apps/ktupnptest/upnptestapp.cpp87
-rw-r--r--apps/ktupnptest/upnptestapp.h58
-rw-r--r--config.h.in300
-rw-r--r--configure.files3
-rw-r--r--configure.in456
-rw-r--r--configure.in.bot20
-rw-r--r--configure.in.in204
-rw-r--r--estimation-scripts/EstimationResults.rb100
-rw-r--r--estimation-scripts/Estimators.rb90
-rw-r--r--estimation-scripts/README40
-rw-r--r--estimation-scripts/Sample.rb64
-rw-r--r--estimation-scripts/demo.rb18
-rw-r--r--estimation-scripts/enable-logging.diff224
-rw-r--r--estimation-scripts/processlog.rb63
-rw-r--r--inst-apps5
-rw-r--r--ktorrent.kdevelop314
-rw-r--r--libktorrent/Makefile.am22
-rw-r--r--libktorrent/datachecker/Makefile.am8
-rw-r--r--libktorrent/datachecker/datachecker.cpp34
-rw-r--r--libktorrent/datachecker/datachecker.h78
-rw-r--r--libktorrent/datachecker/datacheckerlistener.cpp33
-rw-r--r--libktorrent/datachecker/datacheckerlistener.h80
-rw-r--r--libktorrent/datachecker/datacheckerthread.cpp58
-rw-r--r--libktorrent/datachecker/datacheckerthread.h61
-rw-r--r--libktorrent/datachecker/multidatachecker.cpp201
-rw-r--r--libktorrent/datachecker/multidatachecker.h49
-rw-r--r--libktorrent/datachecker/singledatachecker.cpp103
-rw-r--r--libktorrent/datachecker/singledatachecker.h44
-rw-r--r--libktorrent/expandablewidget.cpp179
-rw-r--r--libktorrent/expandablewidget.h89
-rw-r--r--libktorrent/functions.cpp40
-rw-r--r--libktorrent/functions.h35
-rw-r--r--libktorrent/interfaces/Makefile.am15
-rw-r--r--libktorrent/interfaces/chunkdownloadinterface.cpp33
-rw-r--r--libktorrent/interfaces/chunkdownloadinterface.h62
-rw-r--r--libktorrent/interfaces/coreinterface.cpp33
-rw-r--r--libktorrent/interfaces/coreinterface.h258
-rw-r--r--libktorrent/interfaces/exitoperation.cpp47
-rw-r--r--libktorrent/interfaces/exitoperation.h67
-rw-r--r--libktorrent/interfaces/filetreediritem.cpp295
-rw-r--r--libktorrent/interfaces/filetreediritem.h140
-rw-r--r--libktorrent/interfaces/filetreeitem.cpp182
-rw-r--r--libktorrent/interfaces/filetreeitem.h91
-rw-r--r--libktorrent/interfaces/functions.cpp62
-rw-r--r--libktorrent/interfaces/functions.h47
-rw-r--r--libktorrent/interfaces/guiinterface.cpp54
-rw-r--r--libktorrent/interfaces/guiinterface.h218
-rw-r--r--libktorrent/interfaces/ipblockinginterface.cpp33
-rw-r--r--libktorrent/interfaces/ipblockinginterface.h48
-rw-r--r--libktorrent/interfaces/logmonitorinterface.cpp33
-rw-r--r--libktorrent/interfaces/logmonitorinterface.h50
-rw-r--r--libktorrent/interfaces/monitorinterface.cpp33
-rw-r--r--libktorrent/interfaces/monitorinterface.h79
-rw-r--r--libktorrent/interfaces/peerinterface.cpp33
-rw-r--r--libktorrent/interfaces/peerinterface.h91
-rw-r--r--libktorrent/interfaces/peersource.cpp64
-rw-r--r--libktorrent/interfaces/peersource.h118
-rw-r--r--libktorrent/interfaces/plugin.cpp49
-rw-r--r--libktorrent/interfaces/plugin.h152
-rw-r--r--libktorrent/interfaces/prefpageinterface.cpp32
-rw-r--r--libktorrent/interfaces/prefpageinterface.h84
-rw-r--r--libktorrent/interfaces/torrentfileinterface.cpp44
-rw-r--r--libktorrent/interfaces/torrentfileinterface.h131
-rw-r--r--libktorrent/interfaces/torrentinterface.cpp43
-rw-r--r--libktorrent/interfaces/torrentinterface.h509
-rw-r--r--libktorrent/interfaces/trackerslist.cpp51
-rw-r--r--libktorrent/interfaces/trackerslist.h89
-rw-r--r--libktorrent/kademlia/Makefile.am12
-rw-r--r--libktorrent/kademlia/announcetask.cpp154
-rw-r--r--libktorrent/kademlia/announcetask.h74
-rw-r--r--libktorrent/kademlia/database.cpp186
-rw-r--r--libktorrent/kademlia/database.h129
-rw-r--r--libktorrent/kademlia/dht.cpp378
-rw-r--r--libktorrent/kademlia/dht.h136
-rw-r--r--libktorrent/kademlia/dhtbase.cpp37
-rw-r--r--libktorrent/kademlia/dhtbase.h129
-rw-r--r--libktorrent/kademlia/dhttrackerbackend.cpp154
-rw-r--r--libktorrent/kademlia/dhttrackerbackend.h75
-rw-r--r--libktorrent/kademlia/kbucket.cpp355
-rw-r--r--libktorrent/kademlia/kbucket.h212
-rw-r--r--libktorrent/kademlia/kclosestnodessearch.cpp84
-rw-r--r--libktorrent/kademlia/kclosestnodessearch.h90
-rw-r--r--libktorrent/kademlia/key.cpp110
-rw-r--r--libktorrent/kademlia/key.h129
-rw-r--r--libktorrent/kademlia/node.cpp287
-rw-r--r--libktorrent/kademlia/node.h103
-rw-r--r--libktorrent/kademlia/nodelookup.cpp98
-rw-r--r--libktorrent/kademlia/nodelookup.h52
-rw-r--r--libktorrent/kademlia/pack.cpp62
-rw-r--r--libktorrent/kademlia/pack.h48
-rw-r--r--libktorrent/kademlia/rpccall.cpp79
-rw-r--r--libktorrent/kademlia/rpccall.h110
-rw-r--r--libktorrent/kademlia/rpcmsg.cpp596
-rw-r--r--libktorrent/kademlia/rpcmsg.h269
-rw-r--r--libktorrent/kademlia/rpcserver.cpp243
-rw-r--r--libktorrent/kademlia/rpcserver.h122
-rw-r--r--libktorrent/kademlia/task.cpp134
-rw-r--r--libktorrent/kademlia/task.h174
-rw-r--r--libktorrent/kademlia/taskmanager.cpp79
-rw-r--r--libktorrent/kademlia/taskmanager.h69
-rw-r--r--libktorrent/ktorrent.kcfg233
-rw-r--r--libktorrent/ktversion.h36
-rw-r--r--libktorrent/labelview.cpp257
-rw-r--r--libktorrent/labelview.h125
-rw-r--r--libktorrent/labelviewitembase.ui73
-rw-r--r--libktorrent/migrate/Makefile.am7
-rw-r--r--libktorrent/migrate/cachemigrate.cpp120
-rw-r--r--libktorrent/migrate/cachemigrate.h34
-rw-r--r--libktorrent/migrate/ccmigrate.cpp167
-rw-r--r--libktorrent/migrate/ccmigrate.h36
-rw-r--r--libktorrent/migrate/migrate.cpp75
-rw-r--r--libktorrent/migrate/migrate.h53
-rw-r--r--libktorrent/mse/Makefile.am9
-rw-r--r--libktorrent/mse/bigint.cpp100
-rw-r--r--libktorrent/mse/bigint.h98
-rw-r--r--libktorrent/mse/encryptedauthenticate.cpp302
-rw-r--r--libktorrent/mse/encryptedauthenticate.h82
-rw-r--r--libktorrent/mse/encryptedserverauthenticate.cpp354
-rw-r--r--libktorrent/mse/encryptedserverauthenticate.h80
-rw-r--r--libktorrent/mse/functions.cpp74
-rw-r--r--libktorrent/mse/functions.h39
-rw-r--r--libktorrent/mse/rc4encryptor.cpp100
-rw-r--r--libktorrent/mse/rc4encryptor.h96
-rw-r--r--libktorrent/mse/streamsocket.cpp326
-rw-r--r--libktorrent/mse/streamsocket.h185
-rw-r--r--libktorrent/net/Makefile.am10
-rw-r--r--libktorrent/net/address.cpp67
-rw-r--r--libktorrent/net/address.h60
-rw-r--r--libktorrent/net/bufferedsocket.cpp217
-rw-r--r--libktorrent/net/bufferedsocket.h150
-rw-r--r--libktorrent/net/circularbuffer.cpp146
-rw-r--r--libktorrent/net/circularbuffer.h89
-rw-r--r--libktorrent/net/downloadthread.cpp137
-rw-r--r--libktorrent/net/downloadthread.h64
-rw-r--r--libktorrent/net/networkthread.cpp165
-rw-r--r--libktorrent/net/networkthread.h113
-rw-r--r--libktorrent/net/portlist.cpp73
-rw-r--r--libktorrent/net/portlist.h103
-rw-r--r--libktorrent/net/socket.cpp326
-rw-r--r--libktorrent/net/socket.h83
-rw-r--r--libktorrent/net/socketgroup.cpp186
-rw-r--r--libktorrent/net/socketgroup.h90
-rw-r--r--libktorrent/net/socketmonitor.cpp173
-rw-r--r--libktorrent/net/socketmonitor.h118
-rw-r--r--libktorrent/net/speed.cpp78
-rw-r--r--libktorrent/net/speed.h51
-rw-r--r--libktorrent/net/uploadthread.cpp91
-rw-r--r--libktorrent/net/uploadthread.h61
-rw-r--r--libktorrent/pluginmanager.cpp312
-rw-r--r--libktorrent/pluginmanager.h118
-rw-r--r--libktorrent/pluginmanagerprefpage.cpp213
-rw-r--r--libktorrent/pluginmanagerprefpage.h70
-rw-r--r--libktorrent/pluginmanagerwidget.ui127
-rw-r--r--libktorrent/settings.kcfgc6
-rw-r--r--libktorrent/torrent/Makefile.am33
-rw-r--r--libktorrent/torrent/advancedchokealgorithm.cpp259
-rw-r--r--libktorrent/torrent/advancedchokealgorithm.h52
-rw-r--r--libktorrent/torrent/announcelist.cpp195
-rw-r--r--libktorrent/torrent/announcelist.h107
-rw-r--r--libktorrent/torrent/authenticate.cpp156
-rw-r--r--libktorrent/torrent/authenticate.h98
-rw-r--r--libktorrent/torrent/authenticatebase.cpp159
-rw-r--r--libktorrent/torrent/authenticatebase.h125
-rw-r--r--libktorrent/torrent/authenticationmonitor.cpp149
-rw-r--r--libktorrent/torrent/authenticationmonitor.h80
-rw-r--r--libktorrent/torrent/bdecoder.cpp224
-rw-r--r--libktorrent/torrent/bdecoder.h70
-rw-r--r--libktorrent/torrent/bencoder.cpp137
-rw-r--r--libktorrent/torrent/bencoder.h150
-rw-r--r--libktorrent/torrent/bnode.cpp177
-rw-r--r--libktorrent/torrent/bnode.h210
-rw-r--r--libktorrent/torrent/cache.cpp55
-rw-r--r--libktorrent/torrent/cache.h165
-rw-r--r--libktorrent/torrent/cachefile.cpp507
-rw-r--r--libktorrent/torrent/cachefile.h149
-rw-r--r--libktorrent/torrent/cap.cpp123
-rw-r--r--libktorrent/torrent/cap.h113
-rw-r--r--libktorrent/torrent/choker.cpp86
-rw-r--r--libktorrent/torrent/choker.h123
-rw-r--r--libktorrent/torrent/chunk.cpp81
-rw-r--r--libktorrent/torrent/chunk.h165
-rw-r--r--libktorrent/torrent/chunkcounter.cpp80
-rw-r--r--libktorrent/torrent/chunkcounter.h83
-rw-r--r--libktorrent/torrent/chunkdownload.cpp484
-rw-r--r--libktorrent/torrent/chunkdownload.h207
-rw-r--r--libktorrent/torrent/chunkmanager.cpp1157
-rw-r--r--libktorrent/torrent/chunkmanager.h366
-rw-r--r--libktorrent/torrent/chunkselector.cpp185
-rw-r--r--libktorrent/torrent/chunkselector.h80
-rw-r--r--libktorrent/torrent/dndfile.cpp268
-rw-r--r--libktorrent/torrent/dndfile.h89
-rw-r--r--libktorrent/torrent/downloadcap.cpp43
-rw-r--r--libktorrent/torrent/downloadcap.h48
-rw-r--r--libktorrent/torrent/downloader.cpp688
-rw-r--r--libktorrent/torrent/downloader.h221
-rw-r--r--libktorrent/torrent/globals.cpp97
-rw-r--r--libktorrent/torrent/globals.h78
-rw-r--r--libktorrent/torrent/httptracker.cpp462
-rw-r--r--libktorrent/torrent/httptracker.h77
-rw-r--r--libktorrent/torrent/ipblocklist.cpp400
-rw-r--r--libktorrent/torrent/ipblocklist.h175
-rw-r--r--libktorrent/torrent/movedatafilesjob.cpp103
-rw-r--r--libktorrent/torrent/movedatafilesjob.h68
-rw-r--r--libktorrent/torrent/multifilecache.cpp867
-rw-r--r--libktorrent/torrent/multifilecache.h74
-rw-r--r--libktorrent/torrent/newchokealgorithm.cpp345
-rw-r--r--libktorrent/torrent/newchokealgorithm.h54
-rw-r--r--libktorrent/torrent/oldchokealgorithm.cpp223
-rw-r--r--libktorrent/torrent/oldchokealgorithm.h54
-rw-r--r--libktorrent/torrent/packet.cpp175
-rw-r--r--libktorrent/torrent/packet.h91
-rw-r--r--libktorrent/torrent/packetreader.cpp247
-rw-r--r--libktorrent/torrent/packetreader.h68
-rw-r--r--libktorrent/torrent/packetwriter.cpp399
-rw-r--r--libktorrent/torrent/packetwriter.h185
-rw-r--r--libktorrent/torrent/peer.cpp593
-rw-r--r--libktorrent/torrent/peer.h324
-rw-r--r--libktorrent/torrent/peerdownloader.cpp311
-rw-r--r--libktorrent/torrent/peerdownloader.h231
-rw-r--r--libktorrent/torrent/peerid.cpp253
-rw-r--r--libktorrent/torrent/peerid.h61
-rw-r--r--libktorrent/torrent/peermanager.cpp607
-rw-r--r--libktorrent/torrent/peermanager.h251
-rw-r--r--libktorrent/torrent/peersourcemanager.cpp556
-rw-r--r--libktorrent/torrent/peersourcemanager.h182
-rw-r--r--libktorrent/torrent/peeruploader.cpp130
-rw-r--r--libktorrent/torrent/peeruploader.h93
-rw-r--r--libktorrent/torrent/piece.cpp34
-rw-r--r--libktorrent/torrent/piece.h44
-rw-r--r--libktorrent/torrent/preallocationthread.cpp134
-rw-r--r--libktorrent/torrent/preallocationthread.h94
-rw-r--r--libktorrent/torrent/queuemanager.cpp811
-rw-r--r--libktorrent/torrent/queuemanager.h173
-rw-r--r--libktorrent/torrent/request.cpp52
-rw-r--r--libktorrent/torrent/request.h96
-rw-r--r--libktorrent/torrent/server.cpp200
-rw-r--r--libktorrent/torrent/server.h125
-rw-r--r--libktorrent/torrent/serverauthenticate.cpp126
-rw-r--r--libktorrent/torrent/serverauthenticate.h72
-rw-r--r--libktorrent/torrent/singlefilecache.cpp232
-rw-r--r--libktorrent/torrent/singlefilecache.h64
-rw-r--r--libktorrent/torrent/speedestimater.cpp105
-rw-r--r--libktorrent/torrent/speedestimater.h55
-rw-r--r--libktorrent/torrent/statsfile.cpp120
-rw-r--r--libktorrent/torrent/statsfile.h91
-rw-r--r--libktorrent/torrent/timeestimator.cpp278
-rw-r--r--libktorrent/torrent/timeestimator.h119
-rw-r--r--libktorrent/torrent/torrent.cpp449
-rw-r--r--libktorrent/torrent/torrent.h218
-rw-r--r--libktorrent/torrent/torrentcontrol.cpp1770
-rw-r--r--libktorrent/torrent/torrentcontrol.h394
-rw-r--r--libktorrent/torrent/torrentcreator.cpp388
-rw-r--r--libktorrent/torrent/torrentcreator.h114
-rw-r--r--libktorrent/torrent/torrentfile.cpp200
-rw-r--r--libktorrent/torrent/torrentfile.h158
-rw-r--r--libktorrent/torrent/torrentmonitor.cpp33
-rw-r--r--libktorrent/torrent/torrentmonitor.h47
-rw-r--r--libktorrent/torrent/tracker.cpp93
-rw-r--r--libktorrent/torrent/tracker.h136
-rw-r--r--libktorrent/torrent/udptracker.cpp291
-rw-r--r--libktorrent/torrent/udptracker.h105
-rw-r--r--libktorrent/torrent/udptrackersocket.cpp222
-rw-r--r--libktorrent/torrent/udptrackersocket.h139
-rw-r--r--libktorrent/torrent/uploadcap.cpp46
-rw-r--r--libktorrent/torrent/uploadcap.h56
-rw-r--r--libktorrent/torrent/uploader.cpp67
-rw-r--r--libktorrent/torrent/uploader.h75
-rw-r--r--libktorrent/torrent/upspeedestimater.cpp148
-rw-r--r--libktorrent/torrent/upspeedestimater.h86
-rw-r--r--libktorrent/torrent/utpex.cpp155
-rw-r--r--libktorrent/torrent/utpex.h71
-rw-r--r--libktorrent/torrent/value.cpp91
-rw-r--r--libktorrent/torrent/value.h67
-rw-r--r--libktorrent/util/Makefile.am18
-rw-r--r--libktorrent/util/array.cpp27
-rw-r--r--libktorrent/util/array.h73
-rw-r--r--libktorrent/util/autorotatelogjob.cpp88
-rw-r--r--libktorrent/util/autorotatelogjob.h59
-rw-r--r--libktorrent/util/bitset.cpp111
-rw-r--r--libktorrent/util/bitset.h157
-rw-r--r--libktorrent/util/constants.h96
-rw-r--r--libktorrent/util/error.cpp33
-rw-r--r--libktorrent/util/error.h44
-rw-r--r--libktorrent/util/file.cpp150
-rw-r--r--libktorrent/util/file.h114
-rw-r--r--libktorrent/util/fileops.cpp466
-rw-r--r--libktorrent/util/fileops.h165
-rw-r--r--libktorrent/util/functions.cpp239
-rw-r--r--libktorrent/util/functions.h72
-rw-r--r--libktorrent/util/httprequest.cpp122
-rw-r--r--libktorrent/util/httprequest.h98
-rw-r--r--libktorrent/util/log.cpp249
-rw-r--r--libktorrent/util/log.h209
-rw-r--r--libktorrent/util/mmapfile.cpp294
-rw-r--r--libktorrent/util/mmapfile.h146
-rw-r--r--libktorrent/util/profiler.cpp138
-rw-r--r--libktorrent/util/profiler.h108
-rw-r--r--libktorrent/util/ptrmap.cpp24
-rw-r--r--libktorrent/util/ptrmap.h181
-rw-r--r--libktorrent/util/sha1hash.cpp131
-rw-r--r--libktorrent/util/sha1hash.h148
-rw-r--r--libktorrent/util/sha1hashgen.cpp340
-rw-r--r--libktorrent/util/sha1hashgen.h90
-rw-r--r--libktorrent/util/timer.cpp64
-rw-r--r--libktorrent/util/timer.h49
-rw-r--r--libktorrent/util/urlencoder.cpp92
-rw-r--r--libktorrent/util/urlencoder.h40
-rw-r--r--libktorrent/util/waitjob.cpp86
-rw-r--r--libktorrent/util/waitjob.h78
-rw-r--r--plugins/Makefile.am4
-rw-r--r--plugins/infowidget/GeoIP.c825
-rw-r--r--plugins/infowidget/GeoIP.h161
-rw-r--r--plugins/infowidget/Makefile.am40
-rw-r--r--plugins/infowidget/availabilitychunkbar.cpp50
-rw-r--r--plugins/infowidget/availabilitychunkbar.h43
-rw-r--r--plugins/infowidget/chunkbar.cpp312
-rw-r--r--plugins/infowidget/chunkbar.h77
-rw-r--r--plugins/infowidget/chunkdownloadview.cpp166
-rw-r--r--plugins/infowidget/chunkdownloadview.h70
-rw-r--r--plugins/infowidget/chunkdownloadviewbase.ui345
-rw-r--r--plugins/infowidget/downloadedchunkbar.cpp47
-rw-r--r--plugins/infowidget/downloadedchunkbar.h42
-rw-r--r--plugins/infowidget/fileview.cpp447
-rw-r--r--plugins/infowidget/fileview.h76
-rw-r--r--plugins/infowidget/flagdb.cpp119
-rw-r--r--plugins/infowidget/flagdb.h68
-rw-r--r--plugins/infowidget/floatspinbox.cpp226
-rw-r--r--plugins/infowidget/floatspinbox.h93
-rw-r--r--plugins/infowidget/geoip/FLAGS_LICENCE2
-rw-r--r--plugins/infowidget/geoip/GeoIP-LICENSE.txt74
-rw-r--r--plugins/infowidget/geoip/Makefile.am41
-rw-r--r--plugins/infowidget/geoip/ad.pngbin0 -> 569 bytes
-rw-r--r--plugins/infowidget/geoip/ae.pngbin0 -> 410 bytes
-rw-r--r--plugins/infowidget/geoip/af.pngbin0 -> 593 bytes
-rw-r--r--plugins/infowidget/geoip/ag.pngbin0 -> 669 bytes
-rw-r--r--plugins/infowidget/geoip/ai.pngbin0 -> 669 bytes
-rw-r--r--plugins/infowidget/geoip/al.pngbin0 -> 571 bytes
-rw-r--r--plugins/infowidget/geoip/am.pngbin0 -> 573 bytes
-rw-r--r--plugins/infowidget/geoip/an.pngbin0 -> 577 bytes
-rw-r--r--plugins/infowidget/geoip/ao.pngbin0 -> 587 bytes
-rw-r--r--plugins/infowidget/geoip/aq.pngbin0 -> 609 bytes
-rw-r--r--plugins/infowidget/geoip/ar.pngbin0 -> 577 bytes
-rw-r--r--plugins/infowidget/geoip/as.pngbin0 -> 652 bytes
-rw-r--r--plugins/infowidget/geoip/at.pngbin0 -> 550 bytes
-rw-r--r--plugins/infowidget/geoip/au.pngbin0 -> 633 bytes
-rw-r--r--plugins/infowidget/geoip/aw.pngbin0 -> 572 bytes
-rw-r--r--plugins/infowidget/geoip/az.pngbin0 -> 602 bytes
-rw-r--r--plugins/infowidget/geoip/ba.pngbin0 -> 618 bytes
-rw-r--r--plugins/infowidget/geoip/bb.pngbin0 -> 573 bytes
-rw-r--r--plugins/infowidget/geoip/bd.pngbin0 -> 571 bytes
-rw-r--r--plugins/infowidget/geoip/be.pngbin0 -> 533 bytes
-rw-r--r--plugins/infowidget/geoip/bf.pngbin0 -> 567 bytes
-rw-r--r--plugins/infowidget/geoip/bg.pngbin0 -> 554 bytes
-rw-r--r--plugins/infowidget/geoip/bh.pngbin0 -> 513 bytes
-rw-r--r--plugins/infowidget/geoip/bi.pngbin0 -> 667 bytes
-rw-r--r--plugins/infowidget/geoip/bj.pngbin0 -> 543 bytes
-rw-r--r--plugins/infowidget/geoip/bm.pngbin0 -> 614 bytes
-rw-r--r--plugins/infowidget/geoip/bn.pngbin0 -> 632 bytes
-rw-r--r--plugins/infowidget/geoip/bo.pngbin0 -> 582 bytes
-rw-r--r--plugins/infowidget/geoip/br.pngbin0 -> 664 bytes
-rw-r--r--plugins/infowidget/geoip/bs.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/bt.pngbin0 -> 613 bytes
-rw-r--r--plugins/infowidget/geoip/bv.pngbin0 -> 603 bytes
-rw-r--r--plugins/infowidget/geoip/bw.pngbin0 -> 565 bytes
-rw-r--r--plugins/infowidget/geoip/by.pngbin0 -> 555 bytes
-rw-r--r--plugins/infowidget/geoip/bz.pngbin0 -> 617 bytes
-rw-r--r--plugins/infowidget/geoip/ca.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/cc.pngbin0 -> 667 bytes
-rw-r--r--plugins/infowidget/geoip/cd.pngbin0 -> 607 bytes
-rw-r--r--plugins/infowidget/geoip/cf.pngbin0 -> 610 bytes
-rw-r--r--plugins/infowidget/geoip/cg.pngbin0 -> 557 bytes
-rw-r--r--plugins/infowidget/geoip/ch.pngbin0 -> 580 bytes
-rw-r--r--plugins/infowidget/geoip/ci.pngbin0 -> 532 bytes
-rw-r--r--plugins/infowidget/geoip/ck.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/cl.pngbin0 -> 480 bytes
-rw-r--r--plugins/infowidget/geoip/cm.pngbin0 -> 547 bytes
-rw-r--r--plugins/infowidget/geoip/cn.pngbin0 -> 481 bytes
-rw-r--r--plugins/infowidget/geoip/co.pngbin0 -> 572 bytes
-rw-r--r--plugins/infowidget/geoip/cr.pngbin0 -> 592 bytes
-rw-r--r--plugins/infowidget/geoip/cs.pngbin0 -> 441 bytes
-rw-r--r--plugins/infowidget/geoip/cu.pngbin0 -> 623 bytes
-rw-r--r--plugins/infowidget/geoip/cv.pngbin0 -> 602 bytes
-rw-r--r--plugins/infowidget/geoip/cx.pngbin0 -> 626 bytes
-rw-r--r--plugins/infowidget/geoip/cy.pngbin0 -> 563 bytes
-rw-r--r--plugins/infowidget/geoip/cz.pngbin0 -> 581 bytes
-rw-r--r--plugins/infowidget/geoip/de.pngbin0 -> 539 bytes
-rw-r--r--plugins/infowidget/geoip/dj.pngbin0 -> 508 bytes
-rw-r--r--plugins/infowidget/geoip/dk.pngbin0 -> 561 bytes
-rw-r--r--plugins/infowidget/geoip/dm.pngbin0 -> 680 bytes
-rw-r--r--plugins/infowidget/geoip/do.pngbin0 -> 606 bytes
-rw-r--r--plugins/infowidget/geoip/dz.pngbin0 -> 566 bytes
-rw-r--r--plugins/infowidget/geoip/ec.pngbin0 -> 606 bytes
-rw-r--r--plugins/infowidget/geoip/ee.pngbin0 -> 542 bytes
-rw-r--r--plugins/infowidget/geoip/eg.pngbin0 -> 558 bytes
-rw-r--r--plugins/infowidget/geoip/eh.pngbin0 -> 551 bytes
-rw-r--r--plugins/infowidget/geoip/er.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/es.pngbin0 -> 588 bytes
-rw-r--r--plugins/infowidget/geoip/et.pngbin0 -> 606 bytes
-rw-r--r--plugins/infowidget/geoip/eu.pngbin0 -> 631 bytes
-rw-r--r--plugins/infowidget/geoip/fi.pngbin0 -> 568 bytes
-rw-r--r--plugins/infowidget/geoip/fj.pngbin0 -> 611 bytes
-rw-r--r--plugins/infowidget/geoip/fk.pngbin0 -> 683 bytes
-rw-r--r--plugins/infowidget/geoip/fm.pngbin0 -> 571 bytes
-rw-r--r--plugins/infowidget/geoip/fo.pngbin0 -> 582 bytes
-rw-r--r--plugins/infowidget/geoip/fr.pngbin0 -> 521 bytes
-rw-r--r--plugins/infowidget/geoip/ga.pngbin0 -> 579 bytes
-rw-r--r--plugins/infowidget/geoip/gb.pngbin0 -> 678 bytes
-rw-r--r--plugins/infowidget/geoip/gd.pngbin0 -> 598 bytes
-rw-r--r--plugins/infowidget/geoip/ge.pngbin0 -> 494 bytes
-rw-r--r--plugins/infowidget/geoip/geoip.datbin0 -> 1025467 bytes
-rw-r--r--plugins/infowidget/geoip/gf.pngbin0 -> 513 bytes
-rw-r--r--plugins/infowidget/geoip/gh.pngbin0 -> 455 bytes
-rw-r--r--plugins/infowidget/geoip/gi.pngbin0 -> 560 bytes
-rw-r--r--plugins/infowidget/geoip/gl.pngbin0 -> 573 bytes
-rw-r--r--plugins/infowidget/geoip/gm.pngbin0 -> 456 bytes
-rw-r--r--plugins/infowidget/geoip/gn.pngbin0 -> 542 bytes
-rw-r--r--plugins/infowidget/geoip/gp.pngbin0 -> 576 bytes
-rw-r--r--plugins/infowidget/geoip/gq.pngbin0 -> 584 bytes
-rw-r--r--plugins/infowidget/geoip/gr.pngbin0 -> 584 bytes
-rw-r--r--plugins/infowidget/geoip/gs.pngbin0 -> 660 bytes
-rw-r--r--plugins/infowidget/geoip/gt.pngbin0 -> 594 bytes
-rw-r--r--plugins/infowidget/geoip/gu.pngbin0 -> 578 bytes
-rw-r--r--plugins/infowidget/geoip/gw.pngbin0 -> 460 bytes
-rw-r--r--plugins/infowidget/geoip/gy.pngbin0 -> 534 bytes
-rw-r--r--plugins/infowidget/geoip/hk.pngbin0 -> 608 bytes
-rw-r--r--plugins/infowidget/geoip/hm.pngbin0 -> 650 bytes
-rw-r--r--plugins/infowidget/geoip/hn.pngbin0 -> 577 bytes
-rw-r--r--plugins/infowidget/geoip/hr.pngbin0 -> 603 bytes
-rw-r--r--plugins/infowidget/geoip/ht.pngbin0 -> 586 bytes
-rw-r--r--plugins/infowidget/geoip/hu.pngbin0 -> 551 bytes
-rw-r--r--plugins/infowidget/geoip/id.pngbin0 -> 534 bytes
-rw-r--r--plugins/infowidget/geoip/ie.pngbin0 -> 517 bytes
-rw-r--r--plugins/infowidget/geoip/il.pngbin0 -> 589 bytes
-rw-r--r--plugins/infowidget/geoip/in.pngbin0 -> 577 bytes
-rw-r--r--plugins/infowidget/geoip/io.pngbin0 -> 759 bytes
-rw-r--r--plugins/infowidget/geoip/iq.pngbin0 -> 582 bytes
-rw-r--r--plugins/infowidget/geoip/ir.pngbin0 -> 572 bytes
-rw-r--r--plugins/infowidget/geoip/is.pngbin0 -> 607 bytes
-rw-r--r--plugins/infowidget/geoip/it.pngbin0 -> 503 bytes
-rw-r--r--plugins/infowidget/geoip/jm.pngbin0 -> 662 bytes
-rw-r--r--plugins/infowidget/geoip/jo.pngbin0 -> 596 bytes
-rw-r--r--plugins/infowidget/geoip/jp.pngbin0 -> 555 bytes
-rw-r--r--plugins/infowidget/geoip/ke.pngbin0 -> 613 bytes
-rw-r--r--plugins/infowidget/geoip/kg.pngbin0 -> 562 bytes
-rw-r--r--plugins/infowidget/geoip/kh.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/ki.pngbin0 -> 607 bytes
-rw-r--r--plugins/infowidget/geoip/km.pngbin0 -> 561 bytes
-rw-r--r--plugins/infowidget/geoip/kn.pngbin0 -> 610 bytes
-rw-r--r--plugins/infowidget/geoip/kp.pngbin0 -> 623 bytes
-rw-r--r--plugins/infowidget/geoip/kr.pngbin0 -> 610 bytes
-rw-r--r--plugins/infowidget/geoip/kw.pngbin0 -> 455 bytes
-rw-r--r--plugins/infowidget/geoip/ky.pngbin0 -> 604 bytes
-rw-r--r--plugins/infowidget/geoip/kz.pngbin0 -> 602 bytes
-rw-r--r--plugins/infowidget/geoip/la.pngbin0 -> 527 bytes
-rw-r--r--plugins/infowidget/geoip/lb.pngbin0 -> 593 bytes
-rw-r--r--plugins/infowidget/geoip/lc.pngbin0 -> 612 bytes
-rw-r--r--plugins/infowidget/geoip/li.pngbin0 -> 480 bytes
-rw-r--r--plugins/infowidget/geoip/lk.pngbin0 -> 598 bytes
-rw-r--r--plugins/infowidget/geoip/lr.pngbin0 -> 566 bytes
-rw-r--r--plugins/infowidget/geoip/ls.pngbin0 -> 667 bytes
-rw-r--r--plugins/infowidget/geoip/lt.pngbin0 -> 530 bytes
-rw-r--r--plugins/infowidget/geoip/lu.pngbin0 -> 553 bytes
-rw-r--r--plugins/infowidget/geoip/lv.pngbin0 -> 564 bytes
-rw-r--r--plugins/infowidget/geoip/ly.pngbin0 -> 462 bytes
-rw-r--r--plugins/infowidget/geoip/ma.pngbin0 -> 526 bytes
-rw-r--r--plugins/infowidget/geoip/mc.pngbin0 -> 518 bytes
-rw-r--r--plugins/infowidget/geoip/md.pngbin0 -> 576 bytes
-rw-r--r--plugins/infowidget/geoip/mg.pngbin0 -> 547 bytes
-rw-r--r--plugins/infowidget/geoip/mh.pngbin0 -> 679 bytes
-rw-r--r--plugins/infowidget/geoip/mk.pngbin0 -> 656 bytes
-rw-r--r--plugins/infowidget/geoip/ml.pngbin0 -> 435 bytes
-rw-r--r--plugins/infowidget/geoip/mm.pngbin0 -> 527 bytes
-rw-r--r--plugins/infowidget/geoip/mn.pngbin0 -> 559 bytes
-rw-r--r--plugins/infowidget/geoip/mo.pngbin0 -> 589 bytes
-rw-r--r--plugins/infowidget/geoip/mp.pngbin0 -> 622 bytes
-rw-r--r--plugins/infowidget/geoip/mq.pngbin0 -> 513 bytes
-rw-r--r--plugins/infowidget/geoip/mr.pngbin0 -> 509 bytes
-rw-r--r--plugins/infowidget/geoip/ms.pngbin0 -> 616 bytes
-rw-r--r--plugins/infowidget/geoip/mt.pngbin0 -> 496 bytes
-rw-r--r--plugins/infowidget/geoip/mu.pngbin0 -> 418 bytes
-rw-r--r--plugins/infowidget/geoip/mv.pngbin0 -> 589 bytes
-rw-r--r--plugins/infowidget/geoip/mw.pngbin0 -> 462 bytes
-rw-r--r--plugins/infowidget/geoip/mx.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/my.pngbin0 -> 596 bytes
-rw-r--r--plugins/infowidget/geoip/mz.pngbin0 -> 601 bytes
-rw-r--r--plugins/infowidget/geoip/na.pngbin0 -> 652 bytes
-rw-r--r--plugins/infowidget/geoip/nc.pngbin0 -> 620 bytes
-rw-r--r--plugins/infowidget/geoip/ne.pngbin0 -> 526 bytes
-rw-r--r--plugins/infowidget/geoip/nf.pngbin0 -> 582 bytes
-rw-r--r--plugins/infowidget/geoip/ng.pngbin0 -> 512 bytes
-rw-r--r--plugins/infowidget/geoip/ni.pngbin0 -> 523 bytes
-rw-r--r--plugins/infowidget/geoip/nl.pngbin0 -> 553 bytes
-rw-r--r--plugins/infowidget/geoip/no.pngbin0 -> 614 bytes
-rw-r--r--plugins/infowidget/geoip/np.pngbin0 -> 530 bytes
-rw-r--r--plugins/infowidget/geoip/nr.pngbin0 -> 577 bytes
-rw-r--r--plugins/infowidget/geoip/nu.pngbin0 -> 530 bytes
-rw-r--r--plugins/infowidget/geoip/nz.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/om.pngbin0 -> 550 bytes
-rw-r--r--plugins/infowidget/geoip/pa.pngbin0 -> 586 bytes
-rw-r--r--plugins/infowidget/geoip/pe.pngbin0 -> 582 bytes
-rw-r--r--plugins/infowidget/geoip/pf.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/pg.pngbin0 -> 556 bytes
-rw-r--r--plugins/infowidget/geoip/ph.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/pk.pngbin0 -> 615 bytes
-rw-r--r--plugins/infowidget/geoip/pl.pngbin0 -> 513 bytes
-rw-r--r--plugins/infowidget/geoip/pm.pngbin0 -> 652 bytes
-rw-r--r--plugins/infowidget/geoip/pn.pngbin0 -> 692 bytes
-rw-r--r--plugins/infowidget/geoip/pr.pngbin0 -> 606 bytes
-rw-r--r--plugins/infowidget/geoip/ps.pngbin0 -> 480 bytes
-rw-r--r--plugins/infowidget/geoip/pt.pngbin0 -> 572 bytes
-rw-r--r--plugins/infowidget/geoip/pw.pngbin0 -> 570 bytes
-rw-r--r--plugins/infowidget/geoip/py.pngbin0 -> 578 bytes
-rw-r--r--plugins/infowidget/geoip/qa.pngbin0 -> 519 bytes
-rw-r--r--plugins/infowidget/geoip/re.pngbin0 -> 513 bytes
-rw-r--r--plugins/infowidget/geoip/ro.pngbin0 -> 541 bytes
-rw-r--r--plugins/infowidget/geoip/ru.pngbin0 -> 549 bytes
-rw-r--r--plugins/infowidget/geoip/rw.pngbin0 -> 470 bytes
-rw-r--r--plugins/infowidget/geoip/sa.pngbin0 -> 557 bytes
-rw-r--r--plugins/infowidget/geoip/sb.pngbin0 -> 636 bytes
-rw-r--r--plugins/infowidget/geoip/sc.pngbin0 -> 645 bytes
-rw-r--r--plugins/infowidget/geoip/sd.pngbin0 -> 578 bytes
-rw-r--r--plugins/infowidget/geoip/se.pngbin0 -> 607 bytes
-rw-r--r--plugins/infowidget/geoip/sg.pngbin0 -> 556 bytes
-rw-r--r--plugins/infowidget/geoip/sh.pngbin0 -> 631 bytes
-rw-r--r--plugins/infowidget/geoip/si.pngbin0 -> 575 bytes
-rw-r--r--plugins/infowidget/geoip/sj.pngbin0 -> 603 bytes
-rw-r--r--plugins/infowidget/geoip/sk.pngbin0 -> 595 bytes
-rw-r--r--plugins/infowidget/geoip/sl.pngbin0 -> 559 bytes
-rw-r--r--plugins/infowidget/geoip/sm.pngbin0 -> 590 bytes
-rw-r--r--plugins/infowidget/geoip/sn.pngbin0 -> 493 bytes
-rw-r--r--plugins/infowidget/geoip/so.pngbin0 -> 557 bytes
-rw-r--r--plugins/infowidget/geoip/sr.pngbin0 -> 524 bytes
-rw-r--r--plugins/infowidget/geoip/st.pngbin0 -> 525 bytes
-rw-r--r--plugins/infowidget/geoip/sv.pngbin0 -> 542 bytes
-rw-r--r--plugins/infowidget/geoip/sy.pngbin0 -> 447 bytes
-rw-r--r--plugins/infowidget/geoip/sz.pngbin0 -> 722 bytes
-rw-r--r--plugins/infowidget/geoip/tc.pngbin0 -> 608 bytes
-rw-r--r--plugins/infowidget/geoip/td.pngbin0 -> 559 bytes
-rw-r--r--plugins/infowidget/geoip/tf.pngbin0 -> 547 bytes
-rw-r--r--plugins/infowidget/geoip/tg.pngbin0 -> 595 bytes
-rw-r--r--plugins/infowidget/geoip/th.pngbin0 -> 573 bytes
-rw-r--r--plugins/infowidget/geoip/tj.pngbin0 -> 523 bytes
-rw-r--r--plugins/infowidget/geoip/tk.pngbin0 -> 684 bytes
-rw-r--r--plugins/infowidget/geoip/tl.pngbin0 -> 519 bytes
-rw-r--r--plugins/infowidget/geoip/tm.pngbin0 -> 547 bytes
-rw-r--r--plugins/infowidget/geoip/tn.pngbin0 -> 600 bytes
-rw-r--r--plugins/infowidget/geoip/to.pngbin0 -> 542 bytes
-rw-r--r--plugins/infowidget/geoip/tp.pngbin0 -> 581 bytes
-rw-r--r--plugins/infowidget/geoip/tr.pngbin0 -> 550 bytes
-rw-r--r--plugins/infowidget/geoip/tt.pngbin0 -> 663 bytes
-rw-r--r--plugins/infowidget/geoip/tv.pngbin0 -> 605 bytes
-rw-r--r--plugins/infowidget/geoip/tw.pngbin0 -> 524 bytes
-rw-r--r--plugins/infowidget/geoip/tz.pngbin0 -> 620 bytes
-rw-r--r--plugins/infowidget/geoip/ua.pngbin0 -> 550 bytes
-rw-r--r--plugins/infowidget/geoip/ug.pngbin0 -> 606 bytes
-rw-r--r--plugins/infowidget/geoip/um.pngbin0 -> 598 bytes
-rw-r--r--plugins/infowidget/geoip/us.pngbin0 -> 569 bytes
-rw-r--r--plugins/infowidget/geoip/uy.pngbin0 -> 559 bytes
-rw-r--r--plugins/infowidget/geoip/uz.pngbin0 -> 535 bytes
-rw-r--r--plugins/infowidget/geoip/va.pngbin0 -> 573 bytes
-rw-r--r--plugins/infowidget/geoip/vc.pngbin0 -> 547 bytes
-rw-r--r--plugins/infowidget/geoip/ve.pngbin0 -> 578 bytes
-rw-r--r--plugins/infowidget/geoip/vg.pngbin0 -> 612 bytes
-rw-r--r--plugins/infowidget/geoip/vi.pngbin0 -> 645 bytes
-rw-r--r--plugins/infowidget/geoip/vn.pngbin0 -> 565 bytes
-rw-r--r--plugins/infowidget/geoip/vu.pngbin0 -> 571 bytes
-rw-r--r--plugins/infowidget/geoip/wf.pngbin0 -> 513 bytes
-rw-r--r--plugins/infowidget/geoip/ws.pngbin0 -> 536 bytes
-rw-r--r--plugins/infowidget/geoip/ye.pngbin0 -> 542 bytes
-rw-r--r--plugins/infowidget/geoip/yt.pngbin0 -> 513 bytes
-rw-r--r--plugins/infowidget/geoip/yu.pngbin0 -> 566 bytes
-rw-r--r--plugins/infowidget/geoip/za.pngbin0 -> 661 bytes
-rw-r--r--plugins/infowidget/geoip/zm.pngbin0 -> 524 bytes
-rw-r--r--plugins/infowidget/geoip/zw.pngbin0 -> 617 bytes
-rw-r--r--plugins/infowidget/infowidgetplugin.cpp244
-rw-r--r--plugins/infowidget/infowidgetplugin.h77
-rw-r--r--plugins/infowidget/infowidgetpluginsettings.kcfgc7
-rw-r--r--plugins/infowidget/infowidgetprefpage.cpp74
-rw-r--r--plugins/infowidget/infowidgetprefpage.h52
-rw-r--r--plugins/infowidget/iwfiletreediritem.cpp224
-rw-r--r--plugins/infowidget/iwfiletreediritem.h80
-rw-r--r--plugins/infowidget/iwfiletreeitem.cpp166
-rw-r--r--plugins/infowidget/iwfiletreeitem.h64
-rw-r--r--plugins/infowidget/iwpref.ui69
-rw-r--r--plugins/infowidget/ktinfowidgetplugin.desktop29
-rw-r--r--plugins/infowidget/ktinfowidgetplugin.kcfg22
-rw-r--r--plugins/infowidget/ktorrentmonitor.cpp88
-rw-r--r--plugins/infowidget/ktorrentmonitor.h58
-rw-r--r--plugins/infowidget/localefloatvalidator.cpp39
-rw-r--r--plugins/infowidget/localefloatvalidator.h45
-rw-r--r--plugins/infowidget/peerview.cpp357
-rw-r--r--plugins/infowidget/peerview.h81
-rw-r--r--plugins/infowidget/statustab.cpp267
-rw-r--r--plugins/infowidget/statustab.h55
-rw-r--r--plugins/infowidget/statustabbase.ui667
-rw-r--r--plugins/infowidget/trackerview.cpp243
-rw-r--r--plugins/infowidget/trackerview.h62
-rw-r--r--plugins/infowidget/trackerviewbase.ui317
-rw-r--r--plugins/ipfilter/Makefile.am31
-rw-r--r--plugins/ipfilter/antip2p.cpp237
-rw-r--r--plugins/ipfilter/antip2p.h117
-rw-r--r--plugins/ipfilter/convert_dlg.ui157
-rw-r--r--plugins/ipfilter/convertdialog.cpp262
-rw-r--r--plugins/ipfilter/convertdialog.h52
-rw-r--r--plugins/ipfilter/ipblockingpref.ui204
-rw-r--r--plugins/ipfilter/ipblockingprefpage.cpp258
-rw-r--r--plugins/ipfilter/ipblockingprefpage.h83
-rw-r--r--plugins/ipfilter/ipfilterplugin.cpp129
-rw-r--r--plugins/ipfilter/ipfilterplugin.h73
-rw-r--r--plugins/ipfilter/ipfilterpluginsettings.kcfgc7
-rw-r--r--plugins/ipfilter/ktipfilterplugin.desktop56
-rw-r--r--plugins/ipfilter/ktipfilterplugin.kcfg18
-rw-r--r--plugins/logviewer/Makefile.am33
-rw-r--r--plugins/logviewer/ktlogviewerplugin.desktop26
-rw-r--r--plugins/logviewer/ktlogviewerplugin.kcfg71
-rw-r--r--plugins/logviewer/logflags.cpp170
-rw-r--r--plugins/logviewer/logflags.h91
-rw-r--r--plugins/logviewer/logprefpage.cpp63
-rw-r--r--plugins/logviewer/logprefpage.h51
-rw-r--r--plugins/logviewer/logprefwidget.cpp123
-rw-r--r--plugins/logviewer/logprefwidget.h39
-rw-r--r--plugins/logviewer/logprefwidgetbase.ui648
-rw-r--r--plugins/logviewer/logviewer.cpp110
-rw-r--r--plugins/logviewer/logviewer.h50
-rw-r--r--plugins/logviewer/logviewerplugin.cpp84
-rw-r--r--plugins/logviewer/logviewerplugin.h52
-rw-r--r--plugins/logviewer/logviewerpluginsettings.kcfgc7
-rw-r--r--plugins/partfileimport/Makefile.am27
-rw-r--r--plugins/partfileimport/importdialog.cpp389
-rw-r--r--plugins/partfileimport/importdialog.h78
-rw-r--r--plugins/partfileimport/importdlgbase.ui163
-rw-r--r--plugins/partfileimport/ktpartfileimportplugin.desktop25
-rw-r--r--plugins/partfileimport/ktpartfileimportpluginui.rc8
-rw-r--r--plugins/partfileimport/partfileimportplugin.cpp78
-rw-r--r--plugins/partfileimport/partfileimportplugin.h52
-rw-r--r--plugins/rssfeed/Makefile.am30
-rw-r--r--plugins/rssfeed/ktrssfeedplugin.desktop22
-rw-r--r--plugins/rssfeed/ktrssfeedplugin.kcfg14
-rw-r--r--plugins/rssfeed/rss/COPYING20
-rw-r--r--plugins/rssfeed/rss/Makefile.am20
-rw-r--r--plugins/rssfeed/rss/README6
-rw-r--r--plugins/rssfeed/rss/article.cpp270
-rw-r--r--plugins/rssfeed/rss/article.h159
-rw-r--r--plugins/rssfeed/rss/document.cpp619
-rw-r--r--plugins/rssfeed/rss/document.h237
-rw-r--r--plugins/rssfeed/rss/global.h145
-rw-r--r--plugins/rssfeed/rss/image.cpp167
-rw-r--r--plugins/rssfeed/rss/image.h173
-rw-r--r--plugins/rssfeed/rss/librss.doxyfile921
-rw-r--r--plugins/rssfeed/rss/librss.h22
-rw-r--r--plugins/rssfeed/rss/loader.cpp425
-rw-r--r--plugins/rssfeed/rss/loader.h339
-rw-r--r--plugins/rssfeed/rss/rss-faq.html396
-rw-r--r--plugins/rssfeed/rss/testlibrss.cpp75
-rw-r--r--plugins/rssfeed/rss/testlibrss.h25
-rw-r--r--plugins/rssfeed/rss/textinput.cpp96
-rw-r--r--plugins/rssfeed/rss/textinput.h121
-rw-r--r--plugins/rssfeed/rss/tools_p.cpp51
-rw-r--r--plugins/rssfeed/rss/tools_p.h34
-rw-r--r--plugins/rssfeed/rssarticle.cpp103
-rw-r--r--plugins/rssfeed/rssarticle.h82
-rw-r--r--plugins/rssfeed/rssfeed.cpp359
-rw-r--r--plugins/rssfeed/rssfeed.h127
-rw-r--r--plugins/rssfeed/rssfeedmanager.cpp1318
-rw-r--r--plugins/rssfeed/rssfeedmanager.h130
-rw-r--r--plugins/rssfeed/rssfeedplugin.cpp86
-rw-r--r--plugins/rssfeed/rssfeedplugin.h55
-rw-r--r--plugins/rssfeed/rssfeedwidget.ui969
-rw-r--r--plugins/rssfeed/rssfilter.cpp423
-rw-r--r--plugins/rssfeed/rssfilter.h151
-rw-r--r--plugins/rssfeed/rsslinkdownloader.cpp202
-rw-r--r--plugins/rssfeed/rsslinkdownloader.h82
-rw-r--r--plugins/scanfolder/Makefile.am31
-rw-r--r--plugins/scanfolder/ktscanfolderplugin.desktop26
-rw-r--r--plugins/scanfolder/ktscanfolderplugin.kcfg53
-rw-r--r--plugins/scanfolder/scanfolder.cpp273
-rw-r--r--plugins/scanfolder/scanfolder.h111
-rw-r--r--plugins/scanfolder/scanfolderplugin.cpp187
-rw-r--r--plugins/scanfolder/scanfolderplugin.h61
-rw-r--r--plugins/scanfolder/scanfolderpluginsettings.kcfgc7
-rw-r--r--plugins/scanfolder/scanfolderprefpage.cpp66
-rw-r--r--plugins/scanfolder/scanfolderprefpage.h53
-rw-r--r--plugins/scanfolder/scanfolderprefpagewidget.cpp107
-rw-r--r--plugins/scanfolder/scanfolderprefpagewidget.h36
-rw-r--r--plugins/scanfolder/sfprefwidgetbase.ui272
-rw-r--r--plugins/scheduler/Makefile.am36
-rw-r--r--plugins/scheduler/bwscheduler.cpp282
-rw-r--r--plugins/scheduler/bwscheduler.h173
-rw-r--r--plugins/scheduler/bwspage.ui877
-rw-r--r--plugins/scheduler/bwsprefpage.cpp0
-rw-r--r--plugins/scheduler/bwsprefpage.h0
-rw-r--r--plugins/scheduler/bwsprefpagewidget.cpp291
-rw-r--r--plugins/scheduler/bwsprefpagewidget.h84
-rw-r--r--plugins/scheduler/bwswidget.cpp334
-rw-r--r--plugins/scheduler/bwswidget.h107
-rw-r--r--plugins/scheduler/cell-a-0000.pngbin0 -> 700 bytes
-rw-r--r--plugins/scheduler/cell-a-0001.pngbin0 -> 1003 bytes
-rw-r--r--plugins/scheduler/cell-a-0002.pngbin0 -> 1102 bytes
-rw-r--r--plugins/scheduler/cell-a-0003.pngbin0 -> 1174 bytes
-rw-r--r--plugins/scheduler/cell-a-0004.pngbin0 -> 744 bytes
-rw-r--r--plugins/scheduler/cell-b-0000.pngbin0 -> 672 bytes
-rw-r--r--plugins/scheduler/cell-b-0001.pngbin0 -> 979 bytes
-rw-r--r--plugins/scheduler/cell-b-0002.pngbin0 -> 1063 bytes
-rw-r--r--plugins/scheduler/cell-b-0003.pngbin0 -> 1119 bytes
-rw-r--r--plugins/scheduler/cell-b-0004.pngbin0 -> 728 bytes
-rw-r--r--plugins/scheduler/ktschedulerplugin.desktop26
-rw-r--r--plugins/scheduler/ktschedulerplugin.kcfg18
-rw-r--r--plugins/scheduler/ktschedulerpluginui.rc12
-rw-r--r--plugins/scheduler/schedulerpage.ui146
-rw-r--r--plugins/scheduler/schedulerplugin.cpp152
-rw-r--r--plugins/scheduler/schedulerplugin.h70
-rw-r--r--plugins/scheduler/schedulerpluginsettings.kcfgc7
-rw-r--r--plugins/scheduler/schedulerprefpage.cpp64
-rw-r--r--plugins/scheduler/schedulerprefpage.h53
-rw-r--r--plugins/scheduler/schedulerprefpagewidget.cpp83
-rw-r--r--plugins/scheduler/schedulerprefpagewidget.h50
-rw-r--r--plugins/search/Makefile.am28
-rw-r--r--plugins/search/htmlpart.cpp198
-rw-r--r--plugins/search/htmlpart.h72
-rw-r--r--plugins/search/ktsearchplugin.desktop60
-rw-r--r--plugins/search/ktsearchplugin.kcfg30
-rw-r--r--plugins/search/searchbar.ui99
-rw-r--r--plugins/search/searchenginelist.cpp134
-rw-r--r--plugins/search/searchenginelist.h60
-rw-r--r--plugins/search/searchplugin.cpp157
-rw-r--r--plugins/search/searchplugin.h66
-rw-r--r--plugins/search/searchpluginsettings.kcfgc7
-rw-r--r--plugins/search/searchpref.ui320
-rw-r--r--plugins/search/searchprefpage.cpp289
-rw-r--r--plugins/search/searchprefpage.h78
-rw-r--r--plugins/search/searchtab.cpp169
-rw-r--r--plugins/search/searchtab.h77
-rw-r--r--plugins/search/searchwidget.cpp272
-rw-r--r--plugins/search/searchwidget.h89
-rw-r--r--plugins/stats/ChartDrawer.cc473
-rw-r--r--plugins/stats/ChartDrawer.h281
-rw-r--r--plugins/stats/ChartDrawerData.cc100
-rw-r--r--plugins/stats/ChartDrawerData.h123
-rw-r--r--plugins/stats/Makefile.am18
-rw-r--r--plugins/stats/PeerMonitor.cc187
-rw-r--r--plugins/stats/PeerMonitor.h123
-rw-r--r--plugins/stats/StatsCon.cc113
-rw-r--r--plugins/stats/StatsCon.h94
-rw-r--r--plugins/stats/StatsPluginPrefs.cc88
-rw-r--r--plugins/stats/StatsPluginPrefs.h66
-rw-r--r--plugins/stats/StatsPluginPrefsPage.cc29
-rw-r--r--plugins/stats/StatsPluginPrefsPage.h44
-rw-r--r--plugins/stats/StatsSpd.cc138
-rw-r--r--plugins/stats/StatsSpd.h113
-rw-r--r--plugins/stats/ktstatsplugin.desktop24
-rw-r--r--plugins/stats/ktstatsplugin.kcfg60
-rw-r--r--plugins/stats/sprefwgt.ui517
-rw-r--r--plugins/stats/statsconwgt.ui48
-rw-r--r--plugins/stats/statsplugin.cc321
-rw-r--r--plugins/stats/statsplugin.h153
-rw-r--r--plugins/stats/statspluginsettings.kcfgc7
-rw-r--r--plugins/stats/statsspdwgt.ui56
-rw-r--r--plugins/upnp/Makefile.am38
-rw-r--r--plugins/upnp/ktupnpplugin.desktop26
-rw-r--r--plugins/upnp/ktupnpplugin.kcfg13
-rw-r--r--plugins/upnp/soap.cpp53
-rw-r--r--plugins/upnp/soap.h62
-rw-r--r--plugins/upnp/upnpdescriptionparser.cpp220
-rw-r--r--plugins/upnp/upnpdescriptionparser.h49
-rw-r--r--plugins/upnp/upnpmcastsocket.cpp312
-rw-r--r--plugins/upnp/upnpmcastsocket.h91
-rw-r--r--plugins/upnp/upnpplugin.cpp95
-rw-r--r--plugins/upnp/upnpplugin.h51
-rw-r--r--plugins/upnp/upnppluginsettings.kcfgc7
-rw-r--r--plugins/upnp/upnpprefpage.cpp67
-rw-r--r--plugins/upnp/upnpprefpage.h58
-rw-r--r--plugins/upnp/upnpprefwidget.cpp253
-rw-r--r--plugins/upnp/upnpprefwidget.h83
-rw-r--r--plugins/upnp/upnprouter.cpp459
-rw-r--r--plugins/upnp/upnprouter.h223
-rw-r--r--plugins/upnp/upnpwidget.ui139
-rw-r--r--plugins/webinterface/Makefile.am34
-rw-r--r--plugins/webinterface/httpclienthandler.cpp237
-rw-r--r--plugins/webinterface/httpclienthandler.h86
-rw-r--r--plugins/webinterface/httpresponseheader.cpp78
-rw-r--r--plugins/webinterface/httpresponseheader.h51
-rw-r--r--plugins/webinterface/httpserver.cpp553
-rw-r--r--plugins/webinterface/httpserver.h104
-rw-r--r--plugins/webinterface/ktwebinterfaceplugin.desktop22
-rw-r--r--plugins/webinterface/ktwebinterfaceplugin.kcfg41
-rw-r--r--plugins/webinterface/php_handler.cpp121
-rw-r--r--plugins/webinterface/php_handler.h57
-rw-r--r--plugins/webinterface/php_interface.cpp486
-rw-r--r--plugins/webinterface/php_interface.h68
-rw-r--r--plugins/webinterface/webinterfaceplugin.cpp128
-rw-r--r--plugins/webinterface/webinterfaceplugin.h54
-rw-r--r--plugins/webinterface/webinterfacepluginsettings.kcfgc7
-rw-r--r--plugins/webinterface/webinterfacepref.ui256
-rw-r--r--plugins/webinterface/webinterfaceprefpage.cpp60
-rw-r--r--plugins/webinterface/webinterfaceprefpage.h55
-rw-r--r--plugins/webinterface/webinterfaceprefwidget.cpp137
-rw-r--r--plugins/webinterface/webinterfaceprefwidget.h41
-rw-r--r--plugins/webinterface/www/Makefile.am5
-rw-r--r--plugins/webinterface/www/coldmilk/Makefile.am8
-rw-r--r--plugins/webinterface/www/coldmilk/favicon.icobin0 -> 1406 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icon.pngbin0 -> 26977 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/16x16/Makefile.am6
-rw-r--r--plugins/webinterface/www/coldmilk/icons/16x16/edit_user.pngbin0 -> 954 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/16x16/high_priority.pngbin0 -> 232 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/16x16/low_priority.pngbin0 -> 242 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/16x16/normal_priority.pngbin0 -> 215 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/16x16/only_seed.pngbin0 -> 237 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/22x22/Makefile.am6
-rw-r--r--plugins/webinterface/www/coldmilk/icons/22x22/exit.pngbin0 -> 1397 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/22x22/ktstart_all.pngbin0 -> 1399 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/22x22/ktstop_all.pngbin0 -> 1128 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/22x22/remove.pngbin0 -> 1526 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/22x22/start.pngbin0 -> 1232 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/22x22/stop.pngbin0 -> 963 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/32x32/Makefile.am6
-rw-r--r--plugins/webinterface/www/coldmilk/icons/32x32/configure.pngbin0 -> 1838 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/32x32/extender_opened.pngbin0 -> 1627 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/32x32/fileopen.pngbin0 -> 2231 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/32x32/folder1.pngbin0 -> 2698 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/48x48/Makefile.am6
-rw-r--r--plugins/webinterface/www/coldmilk/icons/48x48/exit.pngbin0 -> 3109 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/48x48/switchuser.pngbin0 -> 3164 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/64x64/Makefile.am6
-rw-r--r--plugins/webinterface/www/coldmilk/icons/64x64/down.pngbin0 -> 5486 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/64x64/folder1_man.pngbin0 -> 6388 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/64x64/looknfeel.pngbin0 -> 5512 bytes
-rw-r--r--plugins/webinterface/www/coldmilk/icons/Makefile.am1
-rw-r--r--plugins/webinterface/www/coldmilk/interface.js44
-rw-r--r--plugins/webinterface/www/coldmilk/interface.php251
-rw-r--r--plugins/webinterface/www/coldmilk/login.html55
-rw-r--r--plugins/webinterface/www/coldmilk/page_update.js429
-rw-r--r--plugins/webinterface/www/coldmilk/rest.php265
-rw-r--r--plugins/webinterface/www/coldmilk/shutdown.php21
-rw-r--r--plugins/webinterface/www/coldmilk/style.css212
-rw-r--r--plugins/webinterface/www/default/Makefile.am9
-rw-r--r--plugins/webinterface/www/default/details.php89
-rw-r--r--plugins/webinterface/www/default/favicon.icobin0 -> 1406 bytes
-rw-r--r--plugins/webinterface/www/default/grad1.jpgbin0 -> 367 bytes
-rw-r--r--plugins/webinterface/www/default/grad2.jpgbin0 -> 362 bytes
-rw-r--r--plugins/webinterface/www/default/header_tile.pngbin0 -> 180 bytes
-rw-r--r--plugins/webinterface/www/default/high_priority.pngbin0 -> 232 bytes
-rw-r--r--plugins/webinterface/www/default/icon.pngbin0 -> 26977 bytes
-rw-r--r--plugins/webinterface/www/default/interface.php152
-rw-r--r--plugins/webinterface/www/default/ktorrentwebinterfacelogo.pngbin0 -> 97320 bytes
-rw-r--r--plugins/webinterface/www/default/login.html29
-rw-r--r--plugins/webinterface/www/default/low_priority.pngbin0 -> 242 bytes
-rw-r--r--plugins/webinterface/www/default/menu_bg.pngbin0 -> 249 bytes
-rw-r--r--plugins/webinterface/www/default/normal_priority.pngbin0 -> 215 bytes
-rw-r--r--plugins/webinterface/www/default/only_seed.pngbin0 -> 237 bytes
-rw-r--r--plugins/webinterface/www/default/remove.pngbin0 -> 1039 bytes
-rw-r--r--plugins/webinterface/www/default/shutdown.php13
-rw-r--r--plugins/webinterface/www/default/start.pngbin0 -> 868 bytes
-rw-r--r--plugins/webinterface/www/default/stop.pngbin0 -> 711 bytes
-rw-r--r--plugins/webinterface/www/default/style.css13
-rw-r--r--plugins/webinterface/www/default/stylen.css164
-rw-r--r--plugins/webinterface/www/default/wz_tooltip.js509
-rw-r--r--plugins/webinterface/www/mobile/Makefile.am8
-rw-r--r--plugins/webinterface/www/mobile/favicon.icobin0 -> 1406 bytes
-rw-r--r--plugins/webinterface/www/mobile/interface.php113
-rw-r--r--plugins/webinterface/www/mobile/ktorrentwebinterfacelogo.pngbin0 -> 97320 bytes
-rw-r--r--plugins/webinterface/www/mobile/login.html24
-rw-r--r--plugins/webinterface/www/mobile/remove.pngbin0 -> 1039 bytes
-rw-r--r--plugins/webinterface/www/mobile/settings.php44
-rw-r--r--plugins/webinterface/www/mobile/start.pngbin0 -> 868 bytes
-rw-r--r--plugins/webinterface/www/mobile/stop.pngbin0 -> 711 bytes
-rw-r--r--plugins/webinterface/www/mobile/torrent.php91
-rw-r--r--plugins/zeroconf/Makefile.am22
-rw-r--r--plugins/zeroconf/avahiservice.cpp341
-rw-r--r--plugins/zeroconf/avahiservice.h113
-rw-r--r--plugins/zeroconf/ktzeroconfplugin.desktop22
-rw-r--r--plugins/zeroconf/localbrowser.cpp47
-rw-r--r--plugins/zeroconf/localbrowser.h39
-rw-r--r--plugins/zeroconf/zeroconfplugin.cpp135
-rw-r--r--plugins/zeroconf/zeroconfplugin.h71
-rw-r--r--scripts/Makefile.am1
-rwxr-xr-xscripts/ktshell400
-rw-r--r--stamp-h.in0
-rw-r--r--subdirs5
-rw-r--r--templates/cpp19
-rw-r--r--templates/h19
-rw-r--r--translations/Makefile.am1
-rw-r--r--translations/ar/Makefile.am1
-rw-r--r--translations/ar/messages/Makefile.am3
-rw-r--r--translations/ar/messages/ktorrent.po4827
-rw-r--r--translations/bg/Makefile.am1
-rw-r--r--translations/bg/messages/Makefile.am3
-rw-r--r--translations/bg/messages/ktorrent.po4895
-rw-r--r--translations/br/Makefile.am1
-rw-r--r--translations/br/messages/Makefile.am3
-rw-r--r--translations/br/messages/ktorrent.po5019
-rw-r--r--translations/ca/Makefile.am1
-rw-r--r--translations/ca/messages/Makefile.am3
-rw-r--r--translations/ca/messages/ktorrent.po4902
-rw-r--r--translations/cs/Makefile.am1
-rw-r--r--translations/cs/messages/Makefile.am3
-rw-r--r--translations/cs/messages/ktorrent.po4922
-rw-r--r--translations/cy/Makefile.am1
-rw-r--r--translations/cy/messages/Makefile.am3
-rw-r--r--translations/cy/messages/ktorrent.po5012
-rw-r--r--translations/da/Makefile.am1
-rw-r--r--translations/da/messages/Makefile.am3
-rw-r--r--translations/da/messages/ktorrent.po4888
-rw-r--r--translations/de/Makefile.am1
-rw-r--r--translations/de/messages/Makefile.am3
-rw-r--r--translations/de/messages/ktorrent.po4962
-rw-r--r--translations/el/Makefile.am1
-rw-r--r--translations/el/messages/Makefile.am3
-rw-r--r--translations/el/messages/ktorrent.po4980
-rw-r--r--translations/en_GB/Makefile.am1
-rw-r--r--translations/en_GB/messages/Makefile.am3
-rw-r--r--translations/en_GB/messages/ktorrent.po5148
-rw-r--r--translations/es/Makefile.am1
-rw-r--r--translations/es/messages/Makefile.am3
-rw-r--r--translations/es/messages/ktorrent.po4920
-rw-r--r--translations/et/Makefile.am1
-rw-r--r--translations/et/messages/Makefile.am3
-rw-r--r--translations/et/messages/ktorrent.po4892
-rw-r--r--translations/fa/Makefile.am1
-rw-r--r--translations/fa/messages/Makefile.am3
-rw-r--r--translations/fa/messages/ktorrent.po5067
-rw-r--r--translations/fr/Makefile.am1
-rw-r--r--translations/fr/messages/Makefile.am3
-rw-r--r--translations/fr/messages/ktorrent.po5095
-rw-r--r--translations/gl/Makefile.am1
-rw-r--r--translations/gl/messages/Makefile.am3
-rw-r--r--translations/gl/messages/ktorrent.po5156
-rw-r--r--translations/hu/Makefile.am1
-rw-r--r--translations/hu/messages/Makefile.am3
-rw-r--r--translations/hu/messages/ktorrent.po4880
-rw-r--r--translations/it/Makefile.am1
-rw-r--r--translations/it/messages/Makefile.am3
-rw-r--r--translations/it/messages/ktorrent.po4956
-rw-r--r--translations/ja/Makefile.am1
-rw-r--r--translations/ja/messages/Makefile.am3
-rw-r--r--translations/ja/messages/ktorrent.po4800
-rw-r--r--translations/ka/Makefile.am1
-rw-r--r--translations/ka/messages/Makefile.am3
-rw-r--r--translations/ka/messages/ktorrent.po5112
-rw-r--r--translations/lt/Makefile.am1
-rw-r--r--translations/lt/messages/Makefile.am3
-rw-r--r--translations/lt/messages/ktorrent.po4944
-rw-r--r--translations/ms/Makefile.am1
-rw-r--r--translations/ms/messages/Makefile.am3
-rw-r--r--translations/ms/messages/ktorrent.po5024
-rw-r--r--translations/nb/Makefile.am1
-rw-r--r--translations/nb/messages/Makefile.am3
-rw-r--r--translations/nb/messages/ktorrent.po4910
-rw-r--r--translations/nds/Makefile.am1
-rw-r--r--translations/nds/messages/Makefile.am3
-rw-r--r--translations/nds/messages/ktorrent.po5009
-rw-r--r--translations/nl/Makefile.am1
-rw-r--r--translations/nl/messages/Makefile.am3
-rw-r--r--translations/nl/messages/ktorrent.po4929
-rw-r--r--translations/pa/Makefile.am1
-rw-r--r--translations/pa/messages/Makefile.am3
-rw-r--r--translations/pa/messages/ktorrent.po5079
-rw-r--r--translations/pl/Makefile.am1
-rw-r--r--translations/pl/messages/Makefile.am3
-rw-r--r--translations/pl/messages/ktorrent.po4929
-rw-r--r--translations/pt/Makefile.am1
-rw-r--r--translations/pt/messages/Makefile.am3
-rw-r--r--translations/pt/messages/ktorrent.po4942
-rw-r--r--translations/pt_BR/Makefile.am1
-rw-r--r--translations/pt_BR/messages/Makefile.am3
-rw-r--r--translations/pt_BR/messages/ktorrent.po5055
-rw-r--r--translations/ru/Makefile.am1
-rw-r--r--translations/ru/messages/Makefile.am3
-rw-r--r--translations/ru/messages/ktorrent.po5003
-rw-r--r--translations/rw/Makefile.am1
-rw-r--r--translations/rw/messages/Makefile.am3
-rw-r--r--translations/rw/messages/ktorrent.po5188
-rw-r--r--translations/sk/Makefile.am1
-rw-r--r--translations/sk/messages/Makefile.am3
-rw-r--r--translations/sk/messages/ktorrent.po5140
-rw-r--r--translations/sr/Makefile.am1
-rw-r--r--translations/sr/messages/Makefile.am3
-rw-r--r--translations/sr/messages/ktorrent.po4892
-rw-r--r--translations/sr@Latn/Makefile.am1
-rw-r--r--translations/sr@Latn/messages/Makefile.am3
-rw-r--r--translations/sr@Latn/messages/ktorrent.po4935
-rw-r--r--translations/sv/Makefile.am1
-rw-r--r--translations/sv/messages/Makefile.am3
-rw-r--r--translations/sv/messages/ktorrent.po4901
-rw-r--r--translations/tr/Makefile.am1
-rw-r--r--translations/tr/messages/Makefile.am3
-rw-r--r--translations/tr/messages/ktorrent.po4900
-rw-r--r--translations/uk/Makefile.am1
-rw-r--r--translations/uk/messages/Makefile.am3
-rw-r--r--translations/uk/messages/ktorrent.po4921
-rw-r--r--translations/zh_CN/Makefile.am1
-rw-r--r--translations/zh_CN/messages/Makefile.am3
-rw-r--r--translations/zh_CN/messages/ktorrent.po4854
-rw-r--r--translations/zh_TW/Makefile.am1
-rw-r--r--translations/zh_TW/messages/Makefile.am3
-rw-r--r--translations/zh_TW/messages/ktorrent.po5052
-rw-r--r--utests/Makefile.am12
-rw-r--r--utests/biginttest.cpp82
-rw-r--r--utests/biginttest.h42
-rw-r--r--utests/dhtmsgparsetest.cpp108
-rw-r--r--utests/dhtmsgparsetest.h44
-rw-r--r--utests/difflehellmantest.cpp58
-rw-r--r--utests/difflehellmantest.h44
-rw-r--r--utests/main.cpp52
-rw-r--r--utests/rc4test.cpp95
-rw-r--r--utests/rc4test.h46
-rw-r--r--utests/testrunner.cpp76
-rw-r--r--utests/testrunner.h45
-rw-r--r--utests/unittest.cpp33
-rw-r--r--utests/unittest.h47
-rw-r--r--utests/upnpparsedescriptiontest.cpp433
-rw-r--r--utests/upnpparsedescriptiontest.h44
-rw-r--r--utests/upnpparseresponsetest.cpp66
-rw-r--r--utests/upnpparseresponsetest.h44
1177 files changed, 309932 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..0932075
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,8 @@
+Joris Guisson <joris.guisson@gmail.com>
+Ivan Vasic <ivasic@gmail.com>
+Adam Treat <treat@kde.org>
+
+Artists :
+
+The-Error <zotrix@eunet.yu> (Downloads icons)
+Danny Allen <dannya40uk@yahoo.co.uk> (Application icons)
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..e065ffa
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ 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 Library 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+ <signature of Ty Coon>, 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 Library General
+Public License instead of this License.
diff --git a/COPYING-DOCS b/COPYING-DOCS
new file mode 100644
index 0000000..4a0fe1c
--- /dev/null
+++ b/COPYING-DOCS
@@ -0,0 +1,397 @@
+ GNU Free Documentation License
+ Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, 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.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document 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.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation 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. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..56b8346
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,195 @@
+Changes in 2.2.6 :
+- Some OpenBSD compile fixes
+- Fix lock file not working on NFS home directories by moving it to /tmp
+- Fix wrong name being in torrentcreator dialog when path contains #
+- Don't show progress info for each file we are moving in a MoveDataFilesJob (160338)
+- Fix infinite loop in DHT code
+- Fix group name encoding in saving and loading
+- Fix problem with speedbars staying drawn when they were disabled
+- Ported DHT ping storm fix from KDE4 version
+- Added patch from carucciio to load torrents silently from the command line
+- Set output_path of torrent as default location when the users selects set download location in the viewmenu (157486)
+- Torrents with no file selected are now always shown as download
+- Ditch KIO::NetAccess when moving data files (157462)
+- Fix stop all and start all from system tray menu (it used to apply to the current view, now it applies to all torrents) (157991)
+- Make sure that set download location and add to group are disabled when no torrent is selected
+- Fix ktshell when there are multiple dcop sessions (158115)
+- ETA algorithm -> Time left estimation algorithm (158277)
+- Fix issue with time functions on openbsd (158945)
+- Put lock file in /tmp to make sure that KT works when the users home directory is on an NFS filesystem
+- Added small fix in css of default webgui
+- Added PeerID of KGet and BitsOnWheels
+- Sort list of blocks before saving them to file in ipfilter plugin
+
+Changes in 2.2.5 :
+- Fix moving of files slowing things down under certain circumstances
+- Use avahi_qt_poll_get instead of the threaded stuff, should get rid of the zeroconf crashes
+- After 3 mmap failures, allways use buffered mode
+- Fix bug in DHT token storage and checking
+- Fix free diskspace calculation on FreeBSD
+- Fix a problem with the PHP code
+- Use QTextStream in webgui instead of creating very big strings
+- Backported KT ETA algorithm fix from KDE4 trunk
+- Fix socket code for Dragonfly BSD (139081 and 139110)
+- Make sure hidden files also get deleted when deleting directory (155414)
+- Make sure that preallocate does not interfere with read only files (155437)
+- Fix slow saving of file_info and chunk_info files (155447)
+- Ported bdecoder fix from KDE4 version
+- Fix adding to groups (& added by Qt screwed things up)
+- Don't save groups at exit anymore (149212)
+- Ported close_wait bugfix from KDE4 version
+- Ported recent DHT fixes from KDE4 version
+
+Changes in 2.2.4 :
+- Fix crash in fileview
+- Added patch from Rafel Milecki to add file selection in the coldmilk webgui
+- Added patch from Rafel Milecki to add a confirmation dialog when the user shutsdown KT in the default webgui
+- Fixed bug which caused the set max rate menu in the system tray icon menu to fail in recent KDE versions
+- Optimized SHA1HashGen a bit
+- Use Qt int types to be sure size is correct
+- Do not stop ONLY_SEED chunks, but let them finish
+
+Changes in 2.2.3 :
+- Fix datacheck of 4GB+ files on 32 bit systems
+- Prioritise at least 1 % of multimedia files instead of 1 chunk
+- Fix crashes caused by SIGXFSZ (BUG: 149747)
+- Make sure body tag is OK in 404 and 500 error defines in webgui (BUG: 150023)
+- Fix bug which allows clients to trick KT in enabling PEX on private torrents
+- If do not use KDE proxy is enabled and no alternative proxy is set, make sure we use no proxy at all for HTTP tracker connections. (BUG: 150284)
+- Removed slashes which prevent opening torrents to work in ktshell
+- Fix broken preexsting file check, which can result in files being deleted when the user deselects them and they already exist. (
+BUG: 150563)
+- When stop all and start all is pressed, make sure that start and stop buttons are updated properly (BUG: 149549)
+- Make URL of tracker selectable in tracker tab
+- Fix issue with speed calculating, causing the displayed speed to grow enormously
+- Updated Peer ID list with more clients
+- Fix crash when trying to download an empty link with the RSS plugin (BUG: 150879)
+- Fix crash at exit when the RSS plugin was loaded
+- Make TrayHoverPopup dissapear faster (BUG: 148243)
+- Sort IP addresses by their actual value and not by their string representation (BUG: 150328)
+- Added patch from Jaak Ristioja, which updates the FileView in a separate thread.
+- Make sure only the files of a torrent are moved when the data directory is changed.
+- Make sure window is not hidden when hidden_on_exit is true and the system tray icon is not enabled
+- Added patch from Stefan Monov to hide the menubar (BUG: 151450)
+- Fix crash at exit (BUG: 149827)
+- Added patch from The_Kernel, which allows you to change file priorities in the webgui
+- Backported fix for refresh bug from KDE4 version
+- Added option to limit the number of outgoing connection setups, so that people can limit the number of TCP connections in SYN_SENT state, should their router not be able to handle to much
+- Replaced TOS setting by DSCP setting
+- Added several patches from Rafael Mileki which fix and improve some things in the webgui
+- Change buttons in recreate popup to Recreate and Do Not Recreate (BUG: 151805)
+- Added patch from Lukasz Fibinger which adds a filter bar to search for torrents
+- Make sure that day and month names are not translated in HTTP headers.
+
+Changes in 2.2.2 :
+- Several minor bugfixes
+
+Changes in 2.2.1 :
+- Fix file selection bug
+- Fix several webgui bugs
+- Make sure plugin list is sorted on the plugin name
+- Fix bug with UPnP plugin not releasing ports when KT is shutdown
+
+Changes in 2.2 :
+- Allow user to create torrents without tracker
+- Double clicking on files in files tab opens them
+
+Changes in 2.2rc1
+- Revamped plugin settings page, looks much nicer now.
+- Scan dialog now has only one button cancel, which becomes close when the
+scan is finished
+- Add max seed time feature
+- Add download and seed time columns in view
+
+Changes in 2.2beta1
+- Ditch KMDI in favor of KDevelop IDEA code
+- Infowidget has been fully moved to the bottom tabbar
+- Possibility to open as many views as needed
+- By default a downloads and uploads tab is now shown
+- Immediatly hide system tray icon at exit
+- Make sure to many files open bug is very unlikely to happen
+- Search plugin tab has now become a toolbar
+- Added option to fully preallocate diskspace for torrents
+- Added support for seeding from readonly filesystems
+- Make sure FileView remembers it's state
+- Sleep time of upload and download is now configurable through a CPU usage
+slider in the settings
+- Added option to move finished downloads to a different directory
+- Readded feature to show the total and the number of running torrents in the
+tab of each view
+- Added progress bar in status bar when searching
+- Redesigned FileSelectDlg
+- Added option to add torrent to group when loading
+- Added option to choose download directory for torrent when loading
+- Added option to copy .torrent files to user specified directory
+- Show torrent path when trying to load a corrupt torrent from torX/ directory
+- Added speed limits for individual torrents
+- Added dynamic diskspace checking.
+- Added option to disable diskspace preallocation
+- Improved system tray popup icon : we now use boxed style KPassivePopup instead of Qt tooltips, it also only disappears when the cursor
+is moved away from the tray icon and the text can be updated
+- The log now gets autorotated when it gets larger then 10 MB
+- Import dialog is now network transparent for the torrent file
+- Added statistics plugin which was developed by Krzysztof Kundzicz
+
+Changes in 2.1.4
+- Fixed crash in parsing of DHT messages
+- Fixed problem with files with .. in their name
+- ScanFolder can now handle incomplete torrent files properly
+
+Changes in 2.1.3
+- Fixed crash in torrent parsing
+
+Changes in 2.1.2
+- Fix 2 security vulnerabilities (thanks to Bryan Burns from Juniper Networks
+for finding them)
+
+Changes in 2.1.1
+- Rewrite of webserver
+- New webgui : coldmilk
+- Networking thread has been split up in 2 threads, one for upload, one for
+download
+- Significant speed improvements when downloading over a LAN
+
+Changes in 2.1
+- Some minor bug fixes
+
+Changes in 2.1rc1
+- Share ratio column added in main view
+- Added option to use a different proxy then the default KDE proxy for HTTP trackers
+- Added feature to show/hide columns in main view
+- Moved search box to bottom, so that the window is not enlarged in 1024 x 768 resolutions, when you search for something
+- Made sure no duplicates get into search box history
+- Fixed 'Trackers' tab in InfoWidget to properly resize tracker URL label
+- Zeroconf plugin added
+- Added µTorrent compatible PEX
+- Fixed a bug in WebInterface plugin causing JS tooltips not to show.
+- Fixed a bug with 'Stop All' not stopping queued torrents.
+
+
+Changes in 2.1beta1
+- WebGUI plugin added
+- KTorrent can make trackerless torrents with DHT nodes.
+- Added feature which saves the list of peers when a torrent is stopped and when it is started again, the list is reloaded and the peers are added to the list of potential peers so that we can quickly make connections to peers.
+- Revamped data checker a bit, it now uses a separate thread.
+- Added an option to automatically do a recheck after X number of corrupted chunks are found (X being configurable)
+- Added 4 more default torrent groups (QM down/up, User down/up)
+- Changed default groups to tree structure.
+- Don't auto-dequeue torrents when not completed.
+- Fixed a bug causing weird values to show up for max share ratio in popups.
+- Show passive popups when enqueuing torrents is not possible (over max sr limit) so the user has an idea what's going on.
+- Maximum downloads/uploads limit does not apply on user controlled torrents anymore (!)
+- Fixed a bug in QM causing seeding completed torrents to stay queued forever
+- Max share ratio won't show value lower than current share ratio for a torrent which will prevent seeding torrents from stopping when this option is toggled.
+- Queued (not running) seeding torrents will dequeue when max share ratio spinbox gets below current share ratio.
+- Added advanced preference page
+- Moved GUI update interval and memory usage option to advanced pref page
+- TOS field of IP packets is now configurable
+- Hash checks during uploading of big chunks can now be turned off
+- Fixed crash due to uncaught exception in savePriorityFile.
+- New columns in PeerView of InfoWidget: Requests sent/received, Amount of data downloaded from a peer and Amount of data uploaded to a peer
+- We can now kick peers without banning them
+- When the maximum number of peers we are currently connected to (globally or locally) is reached, and a new peer connects to us, we will now get rid of a bad peer (low aca score), to see if this peer is any better.
+- Added tracker tiering properly, this means that KT will now take into account the priorities of the trackers in the announce-list, and so will first try the tier 1 tracker, then tier 2, ...
+- Added grouping feature
+- Switched to IDEAL style GUI (like KDevelop)
diff --git a/Doxyfile b/Doxyfile
new file mode 100644
index 0000000..3cc01a5
--- /dev/null
+++ b/Doxyfile
@@ -0,0 +1,275 @@
+# Doxyfile 1.4.1-KDevelop
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = KTorrent
+PROJECT_NUMBER = 0.1
+OUTPUT_DIRECTORY = doc
+CREATE_SUBDIRS = NO
+OUTPUT_LANGUAGE = English
+USE_WINDOWS_ENCODING = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+ALWAYS_DETAILED_SEC = NO
+INLINE_INHERITED_MEMB = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = /home/joris/ktorrent/trunk
+STRIP_FROM_INC_PATH =
+SHORT_NAMES = NO
+JAVADOC_AUTOBRIEF = NO
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP = NO
+INHERIT_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 4
+ALIASES =
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+SUBGROUPING = YES
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_METHODS = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+HIDE_FRIEND_COMPOUNDS = NO
+HIDE_IN_BODY_DOCS = NO
+INTERNAL_DOCS = NO
+CASE_SENSE_NAMES = YES
+HIDE_SCOPE_NAMES = NO
+SHOW_INCLUDE_FILES = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+SORT_BRIEF_DOCS = NO
+SORT_BY_SCOPE_NAME = NO
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS =
+MAX_INITIALIZER_LINES = 30
+SHOW_USED_FILES = YES
+SHOW_DIRECTORIES = YES
+FILE_VERSION_FILTER =
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_IF_DOC_ERROR = YES
+WARN_NO_PARAMDOC = NO
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = .
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.idl \
+ *.odl \
+ *.cs \
+ *.php \
+ *.php3 \
+ *.inc \
+ *.m \
+ *.mm \
+ *.dox \
+ *.C \
+ *.CC \
+ *.C++ \
+ *.II \
+ *.I++ \
+ *.H \
+ *.HH \
+ *.H++ \
+ *.CS \
+ *.PHP \
+ *.PHP3 \
+ *.M \
+ *.MM \
+ *.C \
+ *.H \
+ *.tlh \
+ *.diff \
+ *.patch \
+ *.moc \
+ *.xpm \
+ *.dox
+RECURSIVE = YES
+EXCLUDE =
+EXCLUDE_SYMLINKS = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS = *
+EXAMPLE_RECURSIVE = NO
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_PATTERNS =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER = NO
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION = YES
+VERBATIM_HEADERS = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 3
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT = html
+HTML_FILE_EXTENSION = .html
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+CHM_FILE =
+HHC_LOCATION =
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT = latex
+LATEX_CMD_NAME = latex
+MAKEINDEX_CMD_NAME = makeindex
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+LATEX_HIDE_INDICES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT = rtf
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+RTF_EXTENSIONS_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT = man
+MAN_EXTENSION = .3
+MAN_LINKS = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML = NO
+XML_OUTPUT = xml
+XML_SCHEMA =
+XML_DTD =
+XML_PROGRAMLISTING = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD = NO
+PERLMOD_LATEX = NO
+PERLMOD_PRETTY = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = NO
+EXPAND_ONLY_PREDEF = NO
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE = ktorrent.tag
+ALLEXTERNALS = NO
+EXTERNAL_GROUPS = YES
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS = YES
+HIDE_UNDOC_RELATIONS = YES
+HAVE_DOT = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+GROUP_GRAPHS = YES
+UML_LOOK = NO
+TEMPLATE_RELATIONS = NO
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = YES
+CALL_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DIRECTORY_GRAPH = YES
+DOT_IMAGE_FORMAT = png
+DOT_PATH =
+DOTFILE_DIRS =
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
+MAX_DOT_GRAPH_DEPTH = 1000
+DOT_TRANSPARENT = NO
+DOT_MULTI_TARGETS = NO
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..02a4a07
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,167 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 4. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..3bb652a
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,14 @@
+SUBDIRS = translations libktorrent plugins apps scripts
+
+# $(UTESTS_DIR)
+
+EXTRA_DIST = AUTHORS COPYING ChangeLog INSTALL README TODO
+
+messages: rc.cpp
+ $(EXTRACTRC) `find . -name "*.rc" -o -name "*.ui" -o -name "*.kcfg"` > rc.cpp
+ LIST=`find . -name \*.h -o -name \*.hh -o -name \*.H -o -name \*.hxx -o -name \*.hpp -o -name \*.cpp -o -name \*.cc -o -name *.cxx -o -name \*.ecpp -o -name \*.C`; \
+ if test -n "$$LIST"; then \
+ $(XGETTEXT) $$LIST -o $(podir)/ktorrent.pot; \
+ fi
+ rm -f rc.cpp
+
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/NEWS
diff --git a/README b/README
new file mode 100644
index 0000000..12c1f36
--- /dev/null
+++ b/README
@@ -0,0 +1,18 @@
+KTorrent - A KDE BitTorrent client
+-----------------------------------
+
+For installation follow the instructions from INSTALL file, but simple
+
+./configure --prefix=$KDEDIR
+make
+make install (as root)
+
+will install KTorrent hopefully without any problems.
+
+
+For more info please visit
+
+http://www.ktorrent.org/
+
+
+KT Team \ No newline at end of file
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..03b744e
--- /dev/null
+++ b/TODO
@@ -0,0 +1,11 @@
+TODO LIST :
+-----------
+
+If something is done put # in front of it.
+
+3.0 :
+-----
+1) Switch to KDE 4 and Qt 4
+2) Suggest name of torrent file when creating a torrent
+3) Piece based management instead of chunk based
+4) ...
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..6b26319
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,11945 @@
+## -*- autoconf -*-
+
+dnl This file is part of the KDE libraries/packages
+dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu)
+dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org)
+
+dnl This file is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Library General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2 of the License, or (at your option) any later version.
+
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl Library General Public License for more details.
+
+dnl You should have received a copy of the GNU Library General Public License
+dnl along with this library; see the file COPYING.LIB. If not, write to
+dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+dnl Boston, MA 02110-1301, USA.
+
+dnl IMPORTANT NOTE:
+dnl Please do not modify this file unless you expect your modifications to be
+dnl carried into every other module in the repository.
+dnl
+dnl Single-module modifications are best placed in configure.in for kdelibs
+dnl and kdebase or configure.in.in if present.
+
+# KDE_PATH_X_DIRECT
+dnl Internal subroutine of AC_PATH_X.
+dnl Set ac_x_includes and/or ac_x_libraries.
+AC_DEFUN([KDE_PATH_X_DIRECT],
+[
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+if test "$ac_x_includes" = NO; then
+ # Guess where to find include files, by looking for this one X11 .h file.
+ test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
+
+ # First, try using that file with no special directory specified.
+AC_TRY_CPP([#include <$x_direct_test_include>],
+[# We can compile using X headers with no special include directory.
+ac_x_includes=],
+[# Look for the header file in a standard set of common directories.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ for ac_dir in \
+ /usr/X11/include \
+ /usr/X11R6/include \
+ /usr/X11R5/include \
+ /usr/X11R4/include \
+ \
+ /usr/include/X11 \
+ /usr/include/X11R6 \
+ /usr/include/X11R5 \
+ /usr/include/X11R4 \
+ \
+ /usr/local/X11/include \
+ /usr/local/X11R6/include \
+ /usr/local/X11R5/include \
+ /usr/local/X11R4/include \
+ \
+ /usr/local/include/X11 \
+ /usr/local/include/X11R6 \
+ /usr/local/include/X11R5 \
+ /usr/local/include/X11R4 \
+ \
+ /usr/X386/include \
+ /usr/x386/include \
+ /usr/XFree86/include/X11 \
+ \
+ /usr/include \
+ /usr/local/include \
+ /usr/unsupported/include \
+ /usr/athena/include \
+ /usr/local/x11r5/include \
+ /usr/lpp/Xamples/include \
+ \
+ /usr/openwin/include \
+ /usr/openwin/share/include \
+ ; \
+ do
+ if test -r "$ac_dir/$x_direct_test_include"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+ done])
+fi # $ac_x_includes = NO
+
+if test "$ac_x_libraries" = NO; then
+ # Check for the libraries.
+
+ test -z "$x_direct_test_library" && x_direct_test_library=Xt
+ test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
+
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS="$LIBS"
+ LIBS="-l$x_direct_test_library $LIBS"
+AC_TRY_LINK([#include <X11/Intrinsic.h>], [${x_direct_test_function}(1)],
+[LIBS="$ac_save_LIBS"
+# We can link X programs with no special library path.
+ac_x_libraries=],
+[LIBS="$ac_save_LIBS"
+# First see if replacing the include by lib works.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \
+ /usr/X11/lib${kdelibsuff} \
+ /usr/X11R6/lib${kdelibsuff} \
+ /usr/X11R5/lib${kdelibsuff} \
+ /usr/X11R4/lib${kdelibsuff} \
+ \
+ /usr/lib${kdelibsuff}/X11 \
+ /usr/lib${kdelibsuff}/X11R6 \
+ /usr/lib${kdelibsuff}/X11R5 \
+ /usr/lib${kdelibsuff}/X11R4 \
+ \
+ /usr/local/X11/lib${kdelibsuff} \
+ /usr/local/X11R6/lib${kdelibsuff} \
+ /usr/local/X11R5/lib${kdelibsuff} \
+ /usr/local/X11R4/lib${kdelibsuff} \
+ \
+ /usr/local/lib${kdelibsuff}/X11 \
+ /usr/local/lib${kdelibsuff}/X11R6 \
+ /usr/local/lib${kdelibsuff}/X11R5 \
+ /usr/local/lib${kdelibsuff}/X11R4 \
+ \
+ /usr/X386/lib${kdelibsuff} \
+ /usr/x386/lib${kdelibsuff} \
+ /usr/XFree86/lib${kdelibsuff}/X11 \
+ \
+ /usr/lib${kdelibsuff} \
+ /usr/local/lib${kdelibsuff} \
+ /usr/unsupported/lib${kdelibsuff} \
+ /usr/athena/lib${kdelibsuff} \
+ /usr/local/x11r5/lib${kdelibsuff} \
+ /usr/lpp/Xamples/lib${kdelibsuff} \
+ /lib/usr/lib${kdelibsuff}/X11 \
+ \
+ /usr/openwin/lib${kdelibsuff} \
+ /usr/openwin/share/lib${kdelibsuff} \
+ ; \
+do
+dnl Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl; do
+ if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done])
+fi # $ac_x_libraries = NO
+])
+
+
+dnl ------------------------------------------------------------------------
+dnl Find a file (or one of more files in a list of dirs)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_FIND_FILE],
+[
+$3=NO
+for i in $2;
+do
+ for j in $1;
+ do
+ echo "configure: __oline__: $i/$j" >&AC_FD_CC
+ if test -r "$i/$j"; then
+ echo "taking that" >&AC_FD_CC
+ $3=$i
+ break 2
+ fi
+ done
+done
+])
+
+dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs,
+dnl if-not-found, test-parameter, prepend-path)
+dnl
+dnl Look for program-name in list-of-dirs+$PATH.
+dnl If prepend-path is set, look in $PATH+list-of-dirs instead.
+dnl If found, $variable-name is set. If not, if-not-found is evaluated.
+dnl test-parameter: if set, the program is executed with this arg,
+dnl and only a successful exit code is required.
+AC_DEFUN([KDE_FIND_PATH],
+[
+ AC_MSG_CHECKING([for $1])
+ if test -n "$$2"; then
+ kde_cv_path="$$2";
+ else
+ kde_cache=`echo $1 | sed 'y%./+-%__p_%'`
+
+ AC_CACHE_VAL(kde_cv_path_$kde_cache,
+ [
+ kde_cv_path="NONE"
+ kde_save_IFS=$IFS
+ IFS=':'
+ dirs=""
+ for dir in $PATH; do
+ dirs="$dirs $dir"
+ done
+ if test -z "$6"; then dnl Append dirs in PATH (default)
+ dirs="$3 $dirs"
+ else dnl Prepend dirs in PATH (if 6th arg is set)
+ dirs="$dirs $3"
+ fi
+ IFS=$kde_save_IFS
+
+ for dir in $dirs; do
+ if test -x "$dir/$1"; then
+ if test -n "$5"
+ then
+ evalstr="$dir/$1 $5 2>&1 "
+ if eval $evalstr; then
+ kde_cv_path="$dir/$1"
+ break
+ fi
+ else
+ kde_cv_path="$dir/$1"
+ break
+ fi
+ fi
+ done
+
+ eval "kde_cv_path_$kde_cache=$kde_cv_path"
+
+ ])
+
+ eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\""
+
+ fi
+
+ if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then
+ AC_MSG_RESULT(not found)
+ $4
+ else
+ AC_MSG_RESULT($kde_cv_path)
+ $2=$kde_cv_path
+
+ fi
+])
+
+AC_DEFUN([KDE_MOC_ERROR_MESSAGE],
+[
+ AC_MSG_ERROR([No Qt meta object compiler (moc) found!
+Please check whether you installed Qt correctly.
+You need to have a running moc binary.
+configure tried to run $ac_cv_path_moc and the test didn't
+succeed. If configure shouldn't have tried this one, set
+the environment variable MOC to the right one before running
+configure.
+])
+])
+
+AC_DEFUN([KDE_UIC_ERROR_MESSAGE],
+[
+ AC_MSG_WARN([No Qt ui compiler (uic) found!
+Please check whether you installed Qt correctly.
+You need to have a running uic binary.
+configure tried to run $ac_cv_path_uic and the test didn't
+succeed. If configure shouldn't have tried this one, set
+the environment variable UIC to the right one before running
+configure.
+])
+])
+
+
+AC_DEFUN([KDE_CHECK_UIC_FLAG],
+[
+ AC_MSG_CHECKING([whether uic supports -$1 ])
+ kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'`
+ AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache,
+ [
+ cat >conftest.ui <<EOT
+ <!DOCTYPE UI><UI version="3" stdsetdef="1"></UI>
+EOT
+ ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null"
+ if AC_TRY_EVAL(ac_uic_testrun); then
+ eval "kde_cv_prog_uic_$kde_cache=yes"
+ else
+ eval "kde_cv_prog_uic_$kde_cache=no"
+ fi
+ rm -f conftest*
+ ])
+
+ if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then
+ AC_MSG_RESULT([yes])
+ :
+ $3
+ else
+ AC_MSG_RESULT([no])
+ :
+ $4
+ fi
+])
+
+
+dnl ------------------------------------------------------------------------
+dnl Find the meta object compiler and the ui compiler in the PATH,
+dnl in $QTDIR/bin, and some more usual places
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_PATH_QT_MOC_UIC],
+[
+ AC_REQUIRE([KDE_CHECK_PERL])
+ qt_bindirs=""
+ for dir in $kde_qt_dirs; do
+ qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc"
+ done
+ qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin"
+ if test ! "$ac_qt_bindir" = "NO"; then
+ qt_bindirs="$ac_qt_bindir $qt_bindirs"
+ fi
+
+ KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE])
+ if test -z "$UIC_NOT_NEEDED"; then
+ KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""])
+ if test -z "$UIC_PATH" ; then
+ KDE_UIC_ERROR_MESSAGE
+ exit 1
+ else
+ UIC=$UIC_PATH
+
+ if test $kde_qtver = 3; then
+ KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no)
+ KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no)
+
+ if test x$ac_uic_supports_libpath = xyes; then
+ UIC="$UIC -L \$(kde_widgetdir)"
+ fi
+ if test x$ac_uic_supports_nounload = xyes; then
+ UIC="$UIC -nounload"
+ fi
+ fi
+ fi
+ else
+ UIC="echo uic not available: "
+ fi
+
+ AC_SUBST(MOC)
+ AC_SUBST(UIC)
+
+ UIC_TR="i18n"
+ if test $kde_qtver = 3; then
+ UIC_TR="tr2i18n"
+ fi
+
+ AC_SUBST(UIC_TR)
+])
+
+AC_DEFUN([KDE_1_CHECK_PATHS],
+[
+ KDE_1_CHECK_PATH_HEADERS
+
+ KDE_TEST_RPATH=
+
+ if test -n "$USE_RPATH"; then
+
+ if test -n "$kde_libraries"; then
+ KDE_TEST_RPATH="-R $kde_libraries"
+ fi
+
+ if test -n "$qt_libraries"; then
+ KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries"
+ fi
+
+ if test -n "$x_libraries"; then
+ KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries"
+ fi
+
+ KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH"
+ fi
+
+AC_MSG_CHECKING([for KDE libraries installed])
+ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5'
+
+if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_ERROR([your system fails at linking a small KDE application!
+Check, if your compiler is installed correctly and if you have used the
+same compiler to compile Qt and kdelibs as you did use now.
+For more details about this problem, look at the end of config.log.])
+fi
+
+if eval `KDEDIR= ./conftest 2>&5`; then
+ kde_result=done
+else
+ kde_result=problems
+fi
+
+KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log
+kde_have_all_paths=yes
+
+KDE_SET_PATHS($kde_result)
+
+])
+
+AC_DEFUN([KDE_SET_PATHS],
+[
+ kde_cv_all_paths="kde_have_all_paths=\"yes\" \
+ kde_htmldir=\"$kde_htmldir\" \
+ kde_appsdir=\"$kde_appsdir\" \
+ kde_icondir=\"$kde_icondir\" \
+ kde_sounddir=\"$kde_sounddir\" \
+ kde_datadir=\"$kde_datadir\" \
+ kde_locale=\"$kde_locale\" \
+ kde_cgidir=\"$kde_cgidir\" \
+ kde_confdir=\"$kde_confdir\" \
+ kde_kcfgdir=\"$kde_kcfgdir\" \
+ kde_mimedir=\"$kde_mimedir\" \
+ kde_toolbardir=\"$kde_toolbardir\" \
+ kde_wallpaperdir=\"$kde_wallpaperdir\" \
+ kde_templatesdir=\"$kde_templatesdir\" \
+ kde_bindir=\"$kde_bindir\" \
+ kde_servicesdir=\"$kde_servicesdir\" \
+ kde_servicetypesdir=\"$kde_servicetypesdir\" \
+ kde_moduledir=\"$kde_moduledir\" \
+ kde_styledir=\"$kde_styledir\" \
+ kde_widgetdir=\"$kde_widgetdir\" \
+ xdg_appsdir=\"$xdg_appsdir\" \
+ xdg_menudir=\"$xdg_menudir\" \
+ xdg_directorydir=\"$xdg_directorydir\" \
+ kde_result=$1"
+])
+
+AC_DEFUN([KDE_SET_DEFAULT_PATHS],
+[
+if test "$1" = "default"; then
+
+ if test -z "$kde_htmldir"; then
+ kde_htmldir='\${datadir}/doc/HTML'
+ fi
+ if test -z "$kde_appsdir"; then
+ kde_appsdir='\${datadir}/applnk'
+ fi
+ if test -z "$kde_icondir"; then
+ kde_icondir='\${datadir}/icons'
+ fi
+ if test -z "$kde_sounddir"; then
+ kde_sounddir='\${datadir}/sounds'
+ fi
+ if test -z "$kde_datadir"; then
+ kde_datadir='\${datadir}/apps'
+ fi
+ if test -z "$kde_locale"; then
+ kde_locale='\${datadir}/locale'
+ fi
+ if test -z "$kde_cgidir"; then
+ kde_cgidir='\${exec_prefix}/cgi-bin'
+ fi
+ if test -z "$kde_confdir"; then
+ kde_confdir='\${datadir}/config'
+ fi
+ if test -z "$kde_kcfgdir"; then
+ kde_kcfgdir='\${datadir}/config.kcfg'
+ fi
+ if test -z "$kde_mimedir"; then
+ kde_mimedir='\${datadir}/mimelnk'
+ fi
+ if test -z "$kde_toolbardir"; then
+ kde_toolbardir='\${datadir}/toolbar'
+ fi
+ if test -z "$kde_wallpaperdir"; then
+ kde_wallpaperdir='\${datadir}/wallpapers'
+ fi
+ if test -z "$kde_templatesdir"; then
+ kde_templatesdir='\${datadir}/templates'
+ fi
+ if test -z "$kde_bindir"; then
+ kde_bindir='\${exec_prefix}/bin'
+ fi
+ if test -z "$kde_servicesdir"; then
+ kde_servicesdir='\${datadir}/services'
+ fi
+ if test -z "$kde_servicetypesdir"; then
+ kde_servicetypesdir='\${datadir}/servicetypes'
+ fi
+ if test -z "$kde_moduledir"; then
+ if test "$kde_qtver" = "2"; then
+ kde_moduledir='\${libdir}/kde2'
+ else
+ kde_moduledir='\${libdir}/kde3'
+ fi
+ fi
+ if test -z "$kde_styledir"; then
+ kde_styledir='\${libdir}/kde3/plugins/styles'
+ fi
+ if test -z "$kde_widgetdir"; then
+ kde_widgetdir='\${libdir}/kde3/plugins/designer'
+ fi
+ if test -z "$xdg_appsdir"; then
+ xdg_appsdir='\${datadir}/applications/kde'
+ fi
+ if test -z "$xdg_menudir"; then
+ xdg_menudir='\${sysconfdir}/xdg/menus'
+ fi
+ if test -z "$xdg_directorydir"; then
+ xdg_directorydir='\${datadir}/desktop-directories'
+ fi
+
+ KDE_SET_PATHS(defaults)
+
+else
+
+ if test $kde_qtver = 1; then
+ AC_MSG_RESULT([compiling])
+ KDE_1_CHECK_PATHS
+ else
+ AC_MSG_ERROR([path checking not yet supported for KDE 2])
+ fi
+
+fi
+])
+
+AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS],
+[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" ||
+ test -z "$kde_icondir" || test -z "$kde_sounddir" ||
+ test -z "$kde_datadir" || test -z "$kde_locale" ||
+ test -z "$kde_cgidir" || test -z "$kde_confdir" ||
+ test -z "$kde_kcfgdir" ||
+ test -z "$kde_mimedir" || test -z "$kde_toolbardir" ||
+ test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" ||
+ test -z "$kde_bindir" || test -z "$kde_servicesdir" ||
+ test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" ||
+ test -z "$kde_styledir" || test -z "kde_widgetdir" ||
+ test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" ||
+ test "x$kde_have_all_paths" != "xyes"; then
+ kde_have_all_paths=no
+ fi
+])
+
+AC_DEFUN([KDE_MISSING_PROG_ERROR],
+[
+ AC_MSG_ERROR([The important program $1 was not found!
+Please check whether you installed KDE correctly.
+])
+])
+
+AC_DEFUN([KDE_MISSING_ARTS_ERROR],
+[
+ AC_MSG_ERROR([The important program $1 was not found!
+Please check whether you installed aRts correctly or use
+--without-arts to compile without aRts support (this will remove functionality).
+])
+])
+
+AC_DEFUN([KDE_SET_DEFAULT_BINDIRS],
+[
+ kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin"
+ test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs"
+ if test -n "$KDEDIRS"; then
+ kde_save_IFS=$IFS
+ IFS=:
+ for dir in $KDEDIRS; do
+ kde_default_bindirs="$dir/bin $kde_default_bindirs "
+ done
+ IFS=$kde_save_IFS
+ fi
+])
+
+AC_DEFUN([KDE_SUBST_PROGRAMS],
+[
+ AC_ARG_WITH(arts,
+ AC_HELP_STRING([--without-arts],[build without aRts [default=no]]),
+ [build_arts=$withval],
+ [build_arts=yes]
+ )
+ AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no")
+ if test "$build_arts" = "no"; then
+ AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts])
+ fi
+
+ KDE_SET_DEFAULT_BINDIRS
+ kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs"
+ KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)])
+ KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)])
+ if test "$build_arts" '!=' "no"; then
+ KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)])
+ KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)])
+ fi
+ KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs])
+
+ kde32ornewer=1
+ kde33ornewer=1
+ if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then
+ kde32ornewer=
+ kde33ornewer=
+ else
+ if test "$kde_qtver" = "3"; then
+ if test "$kde_qtsubver" -le 1; then
+ kde32ornewer=
+ fi
+ if test "$kde_qtsubver" -le 2; then
+ kde33ornewer=
+ fi
+ if test "$KDECONFIG" != "compiled"; then
+ if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then
+ kde33ornewer=
+ fi
+ fi
+ fi
+ fi
+
+ if test -n "$kde32ornewer"; then
+ KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)])
+ KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)])
+ fi
+ if test -n "$kde33ornewer"; then
+ KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)])
+ AC_SUBST(MAKEKDEWIDGETS)
+ fi
+ KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""])
+
+ if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then
+ kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share"
+ test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs"
+ AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET)
+ if test "$KDE_XSL_STYLESHEET" = "NO"; then
+ KDE_XSL_STYLESHEET=""
+ else
+ KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl"
+ fi
+ fi
+
+ DCOP_DEPENDENCIES='$(DCOPIDL)'
+ if test -n "$kde32ornewer"; then
+ KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)'
+ DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)'
+ AC_SUBST(KCONFIG_COMPILER)
+ AC_SUBST(KCFG_DEPENDENCIES)
+ AC_SUBST(DCOPIDLNG)
+ fi
+ AC_SUBST(DCOPIDL)
+ AC_SUBST(DCOPIDL2CPP)
+ AC_SUBST(DCOP_DEPENDENCIES)
+ AC_SUBST(MCOPIDL)
+ AC_SUBST(ARTSCCONFIG)
+ AC_SUBST(MEINPROC)
+ AC_SUBST(KDE_XSL_STYLESHEET)
+ AC_SUBST(XMLLINT)
+])dnl
+
+AC_DEFUN([AC_CREATE_KFSSTND],
+[
+AC_REQUIRE([AC_CHECK_RPATH])
+
+AC_MSG_CHECKING([for KDE paths])
+kde_result=""
+kde_cached_paths=yes
+AC_CACHE_VAL(kde_cv_all_paths,
+[
+ KDE_SET_DEFAULT_PATHS($1)
+ kde_cached_paths=no
+])
+eval "$kde_cv_all_paths"
+KDE_CHECK_PATHS_FOR_COMPLETENESS
+if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then
+ # wrong values were cached, may be, we can set better ones
+ kde_result=
+ kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir=
+ kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir=
+ kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir=
+ kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir=
+ kde_have_all_paths=
+ kde_styledir=
+ kde_widgetdir=
+ xdg_appsdir = xdg_menudir= xdg_directorydir=
+ KDE_SET_DEFAULT_PATHS($1)
+ eval "$kde_cv_all_paths"
+ KDE_CHECK_PATHS_FOR_COMPLETENESS
+ kde_result="$kde_result (cache overridden)"
+fi
+if test "$kde_have_all_paths" = "no"; then
+ AC_MSG_ERROR([configure could not run a little KDE program to test the environment.
+Since it had compiled and linked before, it must be a strange problem on your system.
+Look at config.log for details. If you are not able to fix this, look at
+http://www.kde.org/faq/installation.html or any www.kde.org mirror.
+(If you're using an egcs version on Linux, you may update binutils!)
+])
+else
+ rm -f conftest*
+ AC_MSG_RESULT($kde_result)
+fi
+
+bindir=$kde_bindir
+
+KDE_SUBST_PROGRAMS
+
+])
+
+AC_DEFUN([AC_SUBST_KFSSTND],
+[
+AC_SUBST(kde_htmldir)
+AC_SUBST(kde_appsdir)
+AC_SUBST(kde_icondir)
+AC_SUBST(kde_sounddir)
+AC_SUBST(kde_datadir)
+AC_SUBST(kde_locale)
+AC_SUBST(kde_confdir)
+AC_SUBST(kde_kcfgdir)
+AC_SUBST(kde_mimedir)
+AC_SUBST(kde_wallpaperdir)
+AC_SUBST(kde_bindir)
+dnl X Desktop Group standards
+AC_SUBST(xdg_appsdir)
+AC_SUBST(xdg_menudir)
+AC_SUBST(xdg_directorydir)
+dnl for KDE 2
+AC_SUBST(kde_templatesdir)
+AC_SUBST(kde_servicesdir)
+AC_SUBST(kde_servicetypesdir)
+AC_SUBST(kde_moduledir)
+AC_SUBST(kdeinitdir, '$(kde_moduledir)')
+AC_SUBST(kde_styledir)
+AC_SUBST(kde_widgetdir)
+if test "$kde_qtver" = 1; then
+ kde_minidir="$kde_icondir/mini"
+else
+# for KDE 1 - this breaks KDE2 apps using minidir, but
+# that's the plan ;-/
+ kde_minidir="/dev/null"
+fi
+dnl AC_SUBST(kde_minidir)
+dnl AC_SUBST(kde_cgidir)
+dnl AC_SUBST(kde_toolbardir)
+])
+
+AC_DEFUN([KDE_MISC_TESTS],
+[
+ dnl Checks for libraries.
+ AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD
+ AC_SUBST(LIBUTIL)
+ AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD
+ AC_SUBST(LIBCOMPAT)
+ kde_have_crypt=
+ AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes],
+ AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [
+ AC_MSG_WARN([you have no crypt in either libcrypt or libc.
+You should install libcrypt from another source or configure with PAM
+support])
+ kde_have_crypt=no
+ ]))
+ AC_SUBST(LIBCRYPT)
+ if test $kde_have_crypt = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function])
+ fi
+ AC_CHECK_SOCKLEN_T
+ AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"])
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ AC_CHECK_LIB(dnet_stub, dnet_ntoa,
+ [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"])
+ fi
+ AC_CHECK_FUNC(inet_ntoa)
+ if test $ac_cv_func_inet_ntoa = no; then
+ AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl")
+ fi
+ AC_CHECK_FUNC(connect)
+ if test $ac_cv_func_connect = no; then
+ AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", ,
+ $X_EXTRA_LIBS)
+ fi
+
+ AC_CHECK_FUNC(remove)
+ if test $ac_cv_func_remove = no; then
+ AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix")
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ AC_CHECK_FUNC(shmat, ,
+ AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"))
+
+ # more headers that need to be explicitly included on darwin
+ AC_CHECK_HEADERS(sys/types.h stdint.h)
+
+ # sys/bitypes.h is needed for uint32_t and friends on Tru64
+ AC_CHECK_HEADERS(sys/bitypes.h)
+
+ # darwin requires a poll emulation library
+ AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll")
+
+ # for some image handling on Mac OS X
+ AC_CHECK_HEADERS(Carbon/Carbon.h)
+
+ # CoreAudio framework
+ AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [
+ AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API])
+ FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio"
+ ])
+
+ AC_CHECK_RES_INIT
+ AC_SUBST(LIB_POLL)
+ AC_SUBST(FRAMEWORK_COREAUDIO)
+ LIBSOCKET="$X_EXTRA_LIBS"
+ AC_SUBST(LIBSOCKET)
+ AC_SUBST(X_EXTRA_LIBS)
+ AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4
+ AC_SUBST(LIBUCB)
+
+ case $host in dnl this *is* LynxOS specific
+ *-*-lynxos* )
+ AC_MSG_CHECKING([LynxOS header file wrappers])
+ [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"]
+ AC_MSG_RESULT(disabled)
+ AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS
+ ;;
+ esac
+
+ KDE_CHECK_TYPES
+ KDE_CHECK_LIBDL
+ KDE_CHECK_STRLCPY
+ KDE_CHECK_PIE_SUPPORT
+
+# darwin needs this to initialize the environment
+AC_CHECK_HEADERS(crt_externs.h)
+AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])])
+
+AH_VERBATIM(_DARWIN_ENVIRON,
+[
+#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
+# include <sys/time.h>
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+])
+
+AH_VERBATIM(_AIX_STRINGS_H_BZERO,
+[
+/*
+ * AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
+ * that defines bzero.
+ */
+
+#if defined(_AIX)
+#include <strings.h>
+#endif
+])
+
+AC_CHECK_FUNCS([vsnprintf snprintf])
+
+AH_VERBATIM(_TRU64,[
+/*
+ * On HP-UX, the declaration of vsnprintf() is needed every time !
+ */
+
+#if !defined(HAVE_VSNPRINTF) || defined(hpux)
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
+#ifdef __cplusplus
+extern "C"
+#endif
+int snprintf(char *str, size_t n, char const *fmt, ...);
+#endif
+])
+
+])
+
+dnl ------------------------------------------------------------------------
+dnl Find the header files and libraries for X-Windows. Extended the
+dnl macro AC_PATH_X
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([K_PATH_X],
+[
+AC_REQUIRE([KDE_MISC_TESTS])dnl
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+AC_ARG_ENABLE(
+ embedded,
+ AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]),
+ kde_use_qt_emb=$enableval,
+ kde_use_qt_emb=no
+)
+
+AC_ARG_ENABLE(
+ qtopia,
+ AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]),
+ kde_use_qt_emb_palm=$enableval,
+ kde_use_qt_emb_palm=no
+)
+
+AC_ARG_ENABLE(
+ mac,
+ AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]),
+ kde_use_qt_mac=$enableval,
+ kde_use_qt_mac=no
+)
+
+# used to disable x11-specific stuff on special platforms
+AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no")
+
+if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then
+
+AC_MSG_CHECKING(for X)
+
+AC_CACHE_VAL(kde_cv_have_x,
+[# One or both of the vars are not set, and there is no cached value.
+if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then
+ kde_x_includes=NO
+else
+ kde_x_includes=$x_includes
+fi
+if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then
+ kde_x_libraries=NO
+else
+ kde_x_libraries=$x_libraries
+fi
+
+# below we use the standard autoconf calls
+ac_x_libraries=$kde_x_libraries
+ac_x_includes=$kde_x_includes
+
+KDE_PATH_X_DIRECT
+dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries.
+dnl Unfortunately, if compiling with the N32 ABI, this is not the correct
+dnl location. The correct location is /usr/lib32 or an undefined value
+dnl (the linker is smart enough to pick the correct default library).
+dnl Things work just fine if you use just AC_PATH_X_DIRECT.
+dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to
+dnl /usr/openwin/include, which doesn't work. /usr/include does work, so
+dnl x_includes should be left alone.
+case "$host" in
+mips-sgi-irix6*)
+ ;;
+*-*-solaris*)
+ ;;
+*)
+ _AC_PATH_X_XMKMF
+ if test -z "$ac_x_includes"; then
+ ac_x_includes="."
+ fi
+ if test -z "$ac_x_libraries"; then
+ ac_x_libraries="/usr/lib${kdelibsuff}"
+ fi
+esac
+#from now on we use our own again
+
+# when the user already gave --x-includes, we ignore
+# what the standard autoconf macros told us.
+if test "$kde_x_includes" = NO; then
+ kde_x_includes=$ac_x_includes
+fi
+
+# for --x-libraries too
+if test "$kde_x_libraries" = NO; then
+ kde_x_libraries=$ac_x_libraries
+fi
+
+if test "$kde_x_includes" = NO; then
+ AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!])
+fi
+
+if test "$kde_x_libraries" = NO; then
+ AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!])
+fi
+
+# Record where we found X for the cache.
+kde_cv_have_x="have_x=yes \
+ kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries"
+])dnl
+
+eval "$kde_cv_have_x"
+
+if test "$have_x" != yes; then
+ AC_MSG_RESULT($have_x)
+ no_x=yes
+else
+ AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes])
+fi
+
+if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then
+ X_INCLUDES=""
+ x_includes="."; dnl better than nothing :-
+ else
+ x_includes=$kde_x_includes
+ X_INCLUDES="-I$x_includes"
+fi
+
+if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE || test "$kde_x_libraries" = "/usr/lib"; then
+ X_LDFLAGS=""
+ x_libraries="/usr/lib"; dnl better than nothing :-
+ else
+ x_libraries=$kde_x_libraries
+ X_LDFLAGS="-L$x_libraries"
+fi
+all_includes="$X_INCLUDES"
+all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS"
+
+# Check for libraries that X11R6 Xt/Xaw programs need.
+ac_save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS $X_LDFLAGS"
+# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+# check for ICE first), but we must link in the order -lSM -lICE or
+# we get undefined symbols. So assume we have SM if we have ICE.
+# These have to be linked with before -lX11, unlike the other
+# libraries we check for below, so use a different variable.
+# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
+AC_CHECK_LIB(ICE, IceConnectionNumber,
+ [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS)
+LDFLAGS="$ac_save_LDFLAGS"
+
+LIB_X11='-lX11 $(LIBSOCKET)'
+
+AC_MSG_CHECKING(for libXext)
+AC_CACHE_VAL(kde_cv_have_libXext,
+[
+kde_ldflags_safe="$LDFLAGS"
+kde_libs_safe="$LIBS"
+
+LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS"
+LIBS="-lXext -lX11 $LIBSOCKET"
+
+AC_TRY_LINK([
+#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#endif
+],
+[
+printf("hello Xext\n");
+],
+kde_cv_have_libXext=yes,
+kde_cv_have_libXext=no
+)
+
+LDFLAGS=$kde_ldflags_safe
+LIBS=$kde_libs_safe
+])
+
+AC_MSG_RESULT($kde_cv_have_libXext)
+
+if test "$kde_cv_have_libXext" = "no"; then
+ AC_MSG_ERROR([We need a working libXext to proceed. Since configure
+can't find it itself, we stop here assuming that make wouldn't find
+them either.])
+fi
+
+LIB_XEXT="-lXext"
+QTE_NORTTI=""
+
+elif test "$kde_use_qt_emb" = "yes"; then
+ dnl We're using QT Embedded
+ CPPFLAGS=-DQWS
+ CXXFLAGS="$CXXFLAGS -fno-rtti"
+ QTE_NORTTI="-fno-rtti -DQWS"
+ X_PRE_LIBS=""
+ LIB_X11=""
+ LIB_XEXT=""
+ LIB_XRENDER=""
+ LIBSM=""
+ X_INCLUDES=""
+ X_LDFLAGS=""
+ x_includes=""
+ x_libraries=""
+elif test "$kde_use_qt_mac" = "yes"; then
+ dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to
+ dnl be included to get the information) --Sam
+ CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp"
+ CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp"
+ X_PRE_LIBS=""
+ LIB_X11=""
+ LIB_XEXT=""
+ LIB_XRENDER=""
+ LIBSM=""
+ X_INCLUDES=""
+ X_LDFLAGS=""
+ x_includes=""
+ x_libraries=""
+fi
+AC_SUBST(X_PRE_LIBS)
+AC_SUBST(LIB_X11)
+AC_SUBST(LIB_XRENDER)
+AC_SUBST(LIBSM)
+AC_SUBST(X_INCLUDES)
+AC_SUBST(X_LDFLAGS)
+AC_SUBST(x_includes)
+AC_SUBST(x_libraries)
+AC_SUBST(QTE_NORTTI)
+AC_SUBST(LIB_XEXT)
+
+])
+
+AC_DEFUN([KDE_PRINT_QT_PROGRAM],
+[
+AC_REQUIRE([KDE_USE_QT])
+cat > conftest.$ac_ext <<EOF
+#include "confdefs.h"
+#include <qglobal.h>
+#include <qapplication.h>
+EOF
+if test "$kde_qtver" = "2"; then
+cat >> conftest.$ac_ext <<EOF
+#include <qevent.h>
+#include <qstring.h>
+#include <qstyle.h>
+EOF
+
+if test $kde_qtsubver -gt 0; then
+cat >> conftest.$ac_ext <<EOF
+#if QT_VERSION < 210
+#error 1
+#endif
+EOF
+fi
+fi
+
+if test "$kde_qtver" = "3"; then
+cat >> conftest.$ac_ext <<EOF
+#include <qcursor.h>
+#include <qstylefactory.h>
+#include <private/qucomextra_p.h>
+EOF
+fi
+
+echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext
+cat >> conftest.$ac_ext <<EOF
+#error 1
+#endif
+
+int main() {
+EOF
+if test "$kde_qtver" = "2"; then
+cat >> conftest.$ac_ext <<EOF
+ QStringList *t = new QStringList();
+ Q_UNUSED(t);
+EOF
+if test $kde_qtsubver -gt 0; then
+cat >> conftest.$ac_ext <<EOF
+ QString s;
+ s.setLatin1("Elvis is alive", 14);
+EOF
+fi
+fi
+if test "$kde_qtver" = "3"; then
+cat >> conftest.$ac_ext <<EOF
+ (void)QStyleFactory::create(QString::null);
+ QCursor c(Qt::WhatsThisCursor);
+EOF
+fi
+cat >> conftest.$ac_ext <<EOF
+ return 0;
+}
+EOF
+])
+
+AC_DEFUN([KDE_USE_QT],
+[
+if test -z "$1"; then
+ # Current default Qt version: 3.3
+ kde_qtver=3
+ kde_qtsubver=3
+else
+ kde_qtsubver=`echo "$1" | sed -e 's#[0-9][0-9]*\.\([0-9][0-9]*\).*#\1#'`
+ # following is the check if subversion isnt found in passed argument
+ if test "$kde_qtsubver" = "$1"; then
+ kde_qtsubver=1
+ fi
+ kde_qtver=`echo "$1" | sed -e 's#^\([0-9][0-9]*\)\..*#\1#'`
+ if test "$kde_qtver" = "1"; then
+ kde_qtsubver=42
+ fi
+fi
+
+if test -z "$2"; then
+ if test "$kde_qtver" = "2"; then
+ if test $kde_qtsubver -gt 0; then
+ kde_qt_minversion=">= Qt 2.2.2"
+ else
+ kde_qt_minversion=">= Qt 2.0.2"
+ fi
+ fi
+ if test "$kde_qtver" = "3"; then
+ if test $kde_qtsubver -gt 0; then
+ if test $kde_qtsubver -gt 1; then
+ if test $kde_qtsubver -gt 2; then
+ kde_qt_minversion=">= Qt 3.3 and < 4.0"
+ else
+ kde_qt_minversion=">= Qt 3.2 and < 4.0"
+ fi
+ else
+ kde_qt_minversion=">= Qt 3.1 (20021021) and < 4.0"
+ fi
+ else
+ kde_qt_minversion=">= Qt 3.0 and < 4.0"
+ fi
+ fi
+ if test "$kde_qtver" = "1"; then
+ kde_qt_minversion=">= 1.42 and < 2.0"
+ fi
+else
+ kde_qt_minversion="$2"
+fi
+
+if test -z "$3"; then
+ if test $kde_qtver = 3; then
+ if test $kde_qtsubver -gt 0; then
+ kde_qt_verstring="QT_VERSION >= 0x03@VER@00 && QT_VERSION < 0x040000"
+ qtsubver=`echo "00$kde_qtsubver" | sed -e 's,.*\(..\)$,\1,'`
+ kde_qt_verstring=`echo $kde_qt_verstring | sed -e "s,@VER@,$qtsubver,"`
+ else
+ kde_qt_verstring="QT_VERSION >= 300 && QT_VERSION < 0x040000"
+ fi
+ fi
+ if test $kde_qtver = 2; then
+ if test $kde_qtsubver -gt 0; then
+ kde_qt_verstring="QT_VERSION >= 222"
+ else
+ kde_qt_verstring="QT_VERSION >= 200"
+ fi
+ fi
+ if test $kde_qtver = 1; then
+ kde_qt_verstring="QT_VERSION >= 142 && QT_VERSION < 200"
+ fi
+else
+ kde_qt_verstring="$3"
+fi
+
+if test $kde_qtver = 4; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt4 /usr/lib/qt /usr/share/qt4"
+fi
+if test $kde_qtver = 3; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt3 /usr/lib/qt /usr/share/qt3 /usr/lib${kdelibsuff}/qt-3.3"
+ if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+ fi
+ if test "$PKG_CONFIG" != "no" ; then
+ if $PKG_CONFIG --exists qt-mt ; then
+ kde_qt_dirs="$kde_qt_dirs `$PKG_CONFIG --variable=prefix qt-mt`"
+ fi
+ fi
+fi
+if test $kde_qtver = 2; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt2 /usr/lib/qt"
+fi
+if test $kde_qtver = 1; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt"
+fi
+])
+
+AC_DEFUN([KDE_CHECK_QT_DIRECT],
+[
+AC_REQUIRE([KDE_USE_QT])
+AC_MSG_CHECKING([if Qt compiles without flags])
+AC_CACHE_VAL(kde_cv_qt_direct,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ac_LD_LIBRARY_PATH_safe=$LD_LIBRARY_PATH
+ac_LIBRARY_PATH="$LIBRARY_PATH"
+ac_cxxflags_safe="$CXXFLAGS"
+ac_ldflags_safe="$LDFLAGS"
+ac_libs_safe="$LIBS"
+
+CXXFLAGS="$CXXFLAGS -I$qt_includes"
+LDFLAGS="$LDFLAGS $X_LDFLAGS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$LIBQT -lXext -lX11 $LIBSOCKET"
+else
+LIBS="$LIBQT $LIBSOCKET"
+fi
+LD_LIBRARY_PATH=
+export LD_LIBRARY_PATH
+LIBRARY_PATH=
+export LIBRARY_PATH
+
+KDE_PRINT_QT_PROGRAM
+
+if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ kde_cv_qt_direct="yes"
+else
+ kde_cv_qt_direct="no"
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.$ac_ext >&AC_FD_CC
+fi
+
+rm -f conftest*
+CXXFLAGS="$ac_cxxflags_safe"
+LDFLAGS="$ac_ldflags_safe"
+LIBS="$ac_libs_safe"
+
+LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe"
+export LD_LIBRARY_PATH
+LIBRARY_PATH="$ac_LIBRARY_PATH"
+export LIBRARY_PATH
+AC_LANG_RESTORE
+])
+
+if test "$kde_cv_qt_direct" = "yes"; then
+ AC_MSG_RESULT(yes)
+ $1
+else
+ AC_MSG_RESULT(no)
+ $2
+fi
+])
+
+dnl ------------------------------------------------------------------------
+dnl Try to find the Qt headers and libraries.
+dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed)
+dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_PATH_QT_1_3],
+[
+AC_REQUIRE([K_PATH_X])
+AC_REQUIRE([KDE_USE_QT])
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+dnl ------------------------------------------------------------------------
+dnl Add configure flag to enable linking to MT version of Qt library.
+dnl ------------------------------------------------------------------------
+
+AC_ARG_ENABLE(
+ mt,
+ AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]),
+ kde_use_qt_mt=$enableval,
+ [
+ if test $kde_qtver = 3; then
+ kde_use_qt_mt=yes
+ else
+ kde_use_qt_mt=no
+ fi
+ ]
+)
+
+USING_QT_MT=""
+
+dnl ------------------------------------------------------------------------
+dnl If we not get --disable-qt-mt then adjust some vars for the host.
+dnl ------------------------------------------------------------------------
+
+KDE_MT_LDFLAGS=
+KDE_MT_LIBS=
+if test "x$kde_use_qt_mt" = "xyes"; then
+ KDE_CHECK_THREADING
+ if test "x$kde_use_threading" = "xyes"; then
+ CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS"
+ KDE_MT_LDFLAGS="$USE_THREADS"
+ KDE_MT_LIBS="$LIBPTHREAD"
+ else
+ kde_use_qt_mt=no
+ fi
+fi
+AC_SUBST(KDE_MT_LDFLAGS)
+AC_SUBST(KDE_MT_LIBS)
+
+kde_qt_was_given=yes
+
+dnl ------------------------------------------------------------------------
+dnl If we haven't been told how to link to Qt, we work it out for ourselves.
+dnl ------------------------------------------------------------------------
+if test -z "$LIBQT_GLOB"; then
+ if test "x$kde_use_qt_emb" = "xyes"; then
+ LIBQT_GLOB="libqte.*"
+ else
+ LIBQT_GLOB="libqt.*"
+ fi
+fi
+
+dnl ------------------------------------------------------------
+dnl If we got --enable-embedded then adjust the Qt library name.
+dnl ------------------------------------------------------------
+if test "x$kde_use_qt_emb" = "xyes"; then
+ qtlib="qte"
+else
+ qtlib="qt"
+fi
+
+kde_int_qt="-l$qtlib"
+
+if test -z "$LIBQPE"; then
+dnl ------------------------------------------------------------
+dnl If we got --enable-palmtop then add -lqpe to the link line
+dnl ------------------------------------------------------------
+ if test "x$kde_use_qt_emb" = "xyes"; then
+ if test "x$kde_use_qt_emb_palm" = "xyes"; then
+ LIB_QPE="-lqpe"
+ else
+ LIB_QPE=""
+ fi
+ else
+ LIB_QPE=""
+ fi
+fi
+
+dnl ------------------------------------------------------------------------
+dnl If we got --enable-qt-mt then adjust the Qt library name for the host.
+dnl ------------------------------------------------------------------------
+
+if test "x$kde_use_qt_mt" = "xyes"; then
+ LIBQT="-l$qtlib-mt"
+ kde_int_qt="-l$qtlib-mt"
+ LIBQT_GLOB="lib$qtlib-mt.*"
+ USING_QT_MT="using -mt"
+else
+ LIBQT="-l$qtlib"
+fi
+
+if test $kde_qtver != 1; then
+
+ AC_REQUIRE([AC_FIND_PNG])
+ AC_REQUIRE([AC_FIND_JPEG])
+ LIBQT="$LIBQT $LIBPNG $LIBJPEG"
+fi
+
+if test $kde_qtver = 3; then
+ AC_REQUIRE([KDE_CHECK_LIBDL])
+ LIBQT="$LIBQT $LIBDL"
+fi
+
+AC_MSG_CHECKING([for Qt])
+
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET"
+fi
+ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO
+qt_libraries=""
+qt_includes=""
+AC_ARG_WITH(qt-dir,
+ AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]),
+ [ ac_qt_includes="$withval"/include
+ ac_qt_libraries="$withval"/lib${kdelibsuff}
+ ac_qt_bindir="$withval"/bin
+ ])
+
+AC_ARG_WITH(qt-includes,
+ AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]),
+ [
+ ac_qt_includes="$withval"
+ ])
+
+kde_qt_libs_given=no
+
+AC_ARG_WITH(qt-libraries,
+ AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]),
+ [ ac_qt_libraries="$withval"
+ kde_qt_libs_given=yes
+ ])
+
+AC_CACHE_VAL(ac_cv_have_qt,
+[#try to guess Qt locations
+
+qt_incdirs=""
+for dir in $kde_qt_dirs; do
+ qt_incdirs="$qt_incdirs $dir/include $dir"
+done
+if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+fi
+if test "$PKG_CONFIG" != "no" ; then
+ if $PKG_CONFIG --exists qt-mt ; then
+ qt_incdirs="$qt_incdirs `$PKG_CONFIG --variable=includedir qt-mt`"
+ fi
+fi
+qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes"
+if test ! "$ac_qt_includes" = "NO"; then
+ qt_incdirs="$ac_qt_includes $qt_incdirs"
+fi
+
+if test "$kde_qtver" != "1"; then
+ kde_qt_header=qstyle.h
+else
+ kde_qt_header=qglobal.h
+fi
+
+AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir)
+ac_qt_includes="$qt_incdir"
+
+qt_libdirs=""
+for dir in $kde_qt_dirs; do
+ qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir/lib $dir"
+done
+if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+fi
+if test "$PKG_CONFIG" != "no" ; then
+ if $PKG_CONFIG --exists qt-mt ; then
+ qt_libdirs="$qt_incdirs `$PKG_CONFIG --variable=libdir qt-mt`"
+ fi
+fi
+qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries"
+if test ! "$ac_qt_libraries" = "NO"; then
+ qt_libdir=$ac_qt_libraries
+else
+ qt_libdirs="$ac_qt_libraries $qt_libdirs"
+ # if the Qt was given, the chance is too big that libqt.* doesn't exist
+ qt_libdir=NONE
+ for dir in $qt_libdirs; do
+ try="ls -1 $dir/${LIBQT_GLOB}"
+ if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi
+ done
+fi
+for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do
+ if test -e "$a"; then
+ LIBQT="$LIBQT ${kde_int_qt}_incremental"
+ break
+ fi
+done
+
+ac_qt_libraries="$qt_libdir"
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+
+ac_cxxflags_safe="$CXXFLAGS"
+ac_ldflags_safe="$LDFLAGS"
+ac_libs_safe="$LIBS"
+
+CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes"
+LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS"
+LIBS="$LIBS $LIBQT $KDE_MT_LIBS"
+
+KDE_PRINT_QT_PROGRAM
+
+if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ rm -f conftest*
+else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.$ac_ext >&AC_FD_CC
+ ac_qt_libraries="NO"
+fi
+rm -f conftest*
+CXXFLAGS="$ac_cxxflags_safe"
+LDFLAGS="$ac_ldflags_safe"
+LIBS="$ac_libs_safe"
+
+AC_LANG_RESTORE
+if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then
+ ac_cv_have_qt="have_qt=no"
+ ac_qt_notfound=""
+ missing_qt_mt=""
+ if test "$ac_qt_includes" = NO; then
+ if test "$ac_qt_libraries" = NO; then
+ ac_qt_notfound="(headers and libraries)";
+ else
+ ac_qt_notfound="(headers)";
+ fi
+ else
+ if test "x$kde_use_qt_mt" = "xyes"; then
+ missing_qt_mt="
+Make sure that you have compiled Qt with thread support!"
+ ac_qt_notfound="(library $qtlib-mt)";
+ else
+ ac_qt_notfound="(library $qtlib)";
+ fi
+ fi
+
+ AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation!
+For more details about this problem, look at the end of config.log.$missing_qt_mt])
+else
+ have_qt="yes"
+fi
+])
+
+eval "$ac_cv_have_qt"
+
+if test "$have_qt" != yes; then
+ AC_MSG_RESULT([$have_qt]);
+else
+ ac_cv_have_qt="have_qt=yes \
+ ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries"
+ AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT])
+
+ qt_libraries="$ac_qt_libraries"
+ qt_includes="$ac_qt_includes"
+fi
+
+if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then
+ KDE_CHECK_QT_DIRECT(qt_libraries= ,[])
+fi
+
+AC_SUBST(qt_libraries)
+AC_SUBST(qt_includes)
+
+if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then
+ QT_INCLUDES=""
+else
+ QT_INCLUDES="-I$qt_includes"
+ all_includes="$QT_INCLUDES $all_includes"
+fi
+
+if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then
+ QT_LDFLAGS=""
+else
+ QT_LDFLAGS="-L$qt_libraries"
+ all_libraries="$QT_LDFLAGS $all_libraries"
+fi
+test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS"
+
+AC_SUBST(QT_INCLUDES)
+AC_SUBST(QT_LDFLAGS)
+AC_PATH_QT_MOC_UIC
+
+KDE_CHECK_QT_JPEG
+
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)'
+else
+LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)'
+fi
+test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS"
+for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do
+ if test -e "$a"; then
+ LIB_QT="$LIB_QT ${kde_int_qt}_incremental"
+ break
+ fi
+done
+
+AC_SUBST(LIB_QT)
+AC_SUBST(LIB_QPE)
+
+AC_SUBST(kde_qtver)
+])
+
+AC_DEFUN([AC_PATH_QT],
+[
+AC_PATH_QT_1_3
+])
+
+AC_DEFUN([KDE_CHECK_UIC_PLUGINS],
+[
+AC_REQUIRE([AC_PATH_QT_MOC_UIC])
+
+if test x$ac_uic_supports_libpath = xyes; then
+
+AC_MSG_CHECKING([if UIC has KDE plugins available])
+AC_CACHE_VAL(kde_cv_uic_plugins,
+[
+cat > actest.ui << EOF
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>NewConnectionDialog</class>
+<widget class="QDialog">
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>testInput</cstring>
+ </property>
+ </widget>
+</widget>
+</UI>
+EOF
+
+
+
+kde_cv_uic_plugins=no
+kde_line="$UIC_PATH -L $kde_widgetdir"
+if test x$ac_uic_supports_nounload = xyes; then
+ kde_line="$kde_line -nounload"
+fi
+kde_line="$kde_line -impl actest.h actest.ui > actest.cpp"
+if AC_TRY_EVAL(kde_line); then
+ # if you're trying to debug this check and think it's incorrect,
+ # better check your installation. The check _is_ correct - your
+ # installation is not.
+ if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then
+ kde_cv_uic_plugins=yes
+ fi
+fi
+rm -f actest.ui actest.cpp
+])
+
+AC_MSG_RESULT([$kde_cv_uic_plugins])
+if test "$kde_cv_uic_plugins" != yes; then
+ AC_MSG_ERROR([
+you need to install kdelibs first.
+
+If you did install kdelibs, then the Qt version that is picked up by
+this configure is not the same version you used to compile kdelibs.
+The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the
+_same Qt version_, compiled with the _same compiler_ and the same Qt
+configuration settings.
+])
+fi
+fi
+])
+
+AC_DEFUN([KDE_CHECK_FINAL],
+[
+ AC_ARG_ENABLE(final,
+ AC_HELP_STRING([--enable-final],
+ [build size optimized apps (experimental - needs lots of memory)]),
+ kde_use_final=$enableval, kde_use_final=no)
+
+ if test "x$kde_use_final" = "xyes"; then
+ KDE_USE_FINAL_TRUE=""
+ KDE_USE_FINAL_FALSE="#"
+ else
+ KDE_USE_FINAL_TRUE="#"
+ KDE_USE_FINAL_FALSE=""
+ fi
+ AC_SUBST(KDE_USE_FINAL_TRUE)
+ AC_SUBST(KDE_USE_FINAL_FALSE)
+])
+
+AC_DEFUN([KDE_CHECK_CLOSURE],
+[
+ AC_ARG_ENABLE(closure,
+ AC_HELP_STRING([--enable-closure],[delay template instantiation]),
+ kde_use_closure=$enableval, kde_use_closure=no)
+
+ KDE_NO_UNDEFINED=""
+ if test "x$kde_use_closure" = "xyes"; then
+ KDE_USE_CLOSURE_TRUE=""
+ KDE_USE_CLOSURE_FALSE="#"
+# CXXFLAGS="$CXXFLAGS $REPO"
+ else
+ KDE_USE_CLOSURE_TRUE="#"
+ KDE_USE_CLOSURE_FALSE=""
+ KDE_NO_UNDEFINED=""
+ case $host in
+ *-*-linux-gnu)
+ KDE_CHECK_COMPILER_FLAG([Wl,--no-undefined],
+ [KDE_CHECK_COMPILER_FLAG([Wl,--allow-shlib-undefined],
+ [KDE_NO_UNDEFINED="-Wl,--no-undefined -Wl,--allow-shlib-undefined"],
+ [KDE_NO_UNDEFINED=""])],
+ [KDE_NO_UNDEFINED=""])
+ ;;
+ esac
+ fi
+ AC_SUBST(KDE_USE_CLOSURE_TRUE)
+ AC_SUBST(KDE_USE_CLOSURE_FALSE)
+ AC_SUBST(KDE_NO_UNDEFINED)
+])
+
+dnl Check if the linker supports --enable-new-dtags and --as-needed
+AC_DEFUN([KDE_CHECK_NEW_LDFLAGS],
+[
+ AC_ARG_ENABLE(new_ldflags,
+ AC_HELP_STRING([--enable-new-ldflags],
+ [enable the new linker flags]),
+ kde_use_new_ldflags=$enableval,
+ kde_use_new_ldflags=no)
+
+ LDFLAGS_AS_NEEDED=""
+ LDFLAGS_NEW_DTAGS=""
+ if test "x$kde_use_new_ldflags" = "xyes"; then
+ LDFLAGS_NEW_DTAGS=""
+ KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags],
+ [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],)
+
+ KDE_CHECK_COMPILER_FLAG([Wl,--as-needed],
+ [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],)
+ fi
+ AC_SUBST(LDFLAGS_AS_NEEDED)
+ AC_SUBST(LDFLAGS_NEW_DTAGS)
+])
+
+AC_DEFUN([KDE_CHECK_NMCHECK],
+[
+ AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]),
+ kde_use_nmcheck=$enableval, kde_use_nmcheck=no)
+
+ if test "$kde_use_nmcheck" = "yes"; then
+ KDE_USE_NMCHECK_TRUE=""
+ KDE_USE_NMCHECK_FALSE="#"
+ else
+ KDE_USE_NMCHECK_TRUE="#"
+ KDE_USE_NMCHECK_FALSE=""
+ fi
+ AC_SUBST(KDE_USE_NMCHECK_TRUE)
+ AC_SUBST(KDE_USE_NMCHECK_FALSE)
+])
+
+AC_DEFUN([KDE_EXPAND_MAKEVAR], [
+savex=$exec_prefix
+test "x$exec_prefix" = xNONE && exec_prefix=$prefix
+tmp=$$2
+while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done
+exec_prefix=$savex
+])
+
+dnl ------------------------------------------------------------------------
+dnl Now, the same with KDE
+dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed)
+dnl and $(kde_includes) will be the kdehdrlocation (if needed)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_BASE_PATH_KDE],
+[
+AC_REQUIRE([KDE_CHECK_STL])
+AC_REQUIRE([AC_PATH_QT])dnl
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+AC_CHECK_RPATH
+AC_MSG_CHECKING([for KDE])
+
+if test "${prefix}" != NONE; then
+ kde_includes=${includedir}
+ KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir)
+
+ kde_libraries=${libdir}
+ KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir)
+
+else
+ ac_kde_includes=
+ ac_kde_libraries=
+ kde_libraries=""
+ kde_includes=""
+fi
+
+AC_CACHE_VAL(ac_cv_have_kde,
+[#try to guess kde locations
+
+if test "$kde_qtver" = 1; then
+ kde_check_header="ksock.h"
+ kde_check_lib="libkdecore.la"
+else
+ kde_check_header="ksharedptr.h"
+ kde_check_lib="libkio.la"
+fi
+
+if test -z "$1"; then
+
+kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes"
+test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs"
+kde_incdirs="$ac_kde_includes $kde_incdirs"
+AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir)
+ac_kde_includes="$kde_incdir"
+
+if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then
+ AC_MSG_ERROR([
+in the prefix, you've chosen, are no KDE headers installed. This will fail.
+So, check this please and use another prefix!])
+fi
+
+kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}"
+test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs"
+kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs"
+AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir)
+ac_kde_libraries="$kde_libdir"
+
+kde_widgetdir=NO
+dnl this might be somewhere else
+AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir)
+
+if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then
+AC_MSG_ERROR([
+in the prefix, you've chosen, are no KDE libraries installed. This will fail.
+So, check this please and use another prefix!])
+fi
+
+if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then
+AC_MSG_ERROR([
+I can't find the designer plugins. These are required and should have been installed
+by kdelibs])
+fi
+
+if test -n "$kde_widgetdir"; then
+ kde_widgetdir="$kde_widgetdir/kde3/plugins/designer"
+fi
+
+
+if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then
+ ac_cv_have_kde="have_kde=no"
+else
+ ac_cv_have_kde="have_kde=yes \
+ ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries"
+fi
+
+else dnl test -z $1, e.g. from kdelibs
+
+ ac_cv_have_kde="have_kde=no"
+
+fi
+])dnl
+
+eval "$ac_cv_have_kde"
+
+if test "$have_kde" != "yes"; then
+ if test "${prefix}" = NONE; then
+ ac_kde_prefix="$ac_default_prefix"
+ else
+ ac_kde_prefix="$prefix"
+ fi
+ if test "$exec_prefix" = NONE; then
+ ac_kde_exec_prefix="$ac_kde_prefix"
+ AC_MSG_RESULT([will be installed in $ac_kde_prefix])
+ else
+ ac_kde_exec_prefix="$exec_prefix"
+ AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix])
+ fi
+
+ kde_libraries="${libdir}"
+ kde_includes="${includedir}"
+
+else
+ ac_cv_have_kde="have_kde=yes \
+ ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries"
+ AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes])
+
+ kde_libraries="$ac_kde_libraries"
+ kde_includes="$ac_kde_includes"
+fi
+AC_SUBST(kde_libraries)
+AC_SUBST(kde_includes)
+
+if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then
+ KDE_INCLUDES=""
+else
+ KDE_INCLUDES="-I$kde_includes"
+ all_includes="$KDE_INCLUDES $all_includes"
+fi
+
+KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION"
+
+KDE_LDFLAGS="-L$kde_libraries"
+if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then
+ all_libraries="$KDE_LDFLAGS $all_libraries"
+fi
+
+AC_SUBST(KDE_LDFLAGS)
+AC_SUBST(KDE_INCLUDES)
+
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+all_libraries="$all_libraries $USER_LDFLAGS"
+all_includes="$all_includes $USER_INCLUDES"
+AC_SUBST(all_includes)
+AC_SUBST(all_libraries)
+
+if test -z "$1"; then
+KDE_CHECK_UIC_PLUGINS
+fi
+
+ac_kde_libraries="$kde_libdir"
+
+AC_SUBST(AUTODIRS)
+
+
+])
+
+AC_DEFUN([KDE_CHECK_EXTRA_LIBS],
+[
+AC_MSG_CHECKING(for extra includes)
+AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]),
+ kde_use_extra_includes="$withval",
+ kde_use_extra_includes=NONE
+)
+kde_extra_includes=
+if test -n "$kde_use_extra_includes" && \
+ test "$kde_use_extra_includes" != "NONE"; then
+
+ ac_save_ifs=$IFS
+ IFS=':'
+ for dir in $kde_use_extra_includes; do
+ kde_extra_includes="$kde_extra_includes $dir"
+ USER_INCLUDES="$USER_INCLUDES -I$dir"
+ done
+ IFS=$ac_save_ifs
+ kde_use_extra_includes="added"
+else
+ kde_use_extra_includes="no"
+fi
+AC_SUBST(USER_INCLUDES)
+
+AC_MSG_RESULT($kde_use_extra_includes)
+
+kde_extra_libs=
+AC_MSG_CHECKING(for extra libs)
+AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]),
+ kde_use_extra_libs=$withval,
+ kde_use_extra_libs=NONE
+)
+if test -n "$kde_use_extra_libs" && \
+ test "$kde_use_extra_libs" != "NONE"; then
+
+ ac_save_ifs=$IFS
+ IFS=':'
+ for dir in $kde_use_extra_libs; do
+ kde_extra_libs="$kde_extra_libs $dir"
+ KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir"
+ USER_LDFLAGS="$USER_LDFLAGS -L$dir"
+ done
+ IFS=$ac_save_ifs
+ kde_use_extra_libs="added"
+else
+ kde_use_extra_libs="no"
+fi
+
+AC_SUBST(USER_LDFLAGS)
+
+AC_MSG_RESULT($kde_use_extra_libs)
+
+])
+
+AC_DEFUN([KDE_1_CHECK_PATH_HEADERS],
+[
+ AC_MSG_CHECKING([for KDE headers installed])
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+cat > conftest.$ac_ext <<EOF
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#endif
+#include <stdio.h>
+#include "confdefs.h"
+#include <kapp.h>
+
+int main() {
+ printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data());
+ printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data());
+ printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data());
+ printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data());
+ printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data());
+ printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data());
+ printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data());
+ printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data());
+ printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data());
+ printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data());
+ printf("kde_wallpaperdir=\\"%s\\"\n",
+ KApplication::kde_wallpaperdir().data());
+ printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data());
+ printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data());
+ printf("kde_servicesdir=\\"/tmp/dummy\\"\n");
+ printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n");
+ printf("kde_moduledir=\\"/tmp/dummy\\"\n");
+ printf("kde_styledir=\\"/tmp/dummy\\"\n");
+ printf("kde_widgetdir=\\"/tmp/dummy\\"\n");
+ printf("xdg_appsdir=\\"/tmp/dummy\\"\n");
+ printf("xdg_menudir=\\"/tmp/dummy\\"\n");
+ printf("xdg_directorydir=\\"/tmp/dummy\\"\n");
+ printf("kde_kcfgdir=\\"/tmp/dummy\\"\n");
+ return 0;
+ }
+EOF
+
+ ac_save_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="$all_includes $CPPFLAGS"
+ if AC_TRY_EVAL(ac_compile); then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_ERROR([your system is not able to compile a small KDE application!
+Check, if you installed the KDE header files correctly.
+For more details about this problem, look at the end of config.log.])
+ fi
+ CPPFLAGS=$ac_save_CPPFLAGS
+
+ AC_LANG_RESTORE
+])
+
+AC_DEFUN([KDE_CHECK_KDEQTADDON],
+[
+AC_MSG_CHECKING(for kde-qt-addon)
+AC_CACHE_VAL(kde_cv_have_kdeqtaddon,
+[
+ kde_ldflags_safe="$LDFLAGS"
+ kde_libs_safe="$LIBS"
+ kde_cxxflags_safe="$CXXFLAGS"
+
+ LIBS="-lkde-qt-addon $LIBQT $LIBS"
+ CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes"
+ LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS"
+
+ AC_TRY_LINK([
+ #include <qdom.h>
+ ],
+ [
+ QDomDocument doc;
+ ],
+ kde_cv_have_kdeqtaddon=yes,
+ kde_cv_have_kdeqtaddon=no
+ )
+
+ LDFLAGS=$kde_ldflags_safe
+ LIBS=$kde_libs_safe
+ CXXFLAGS=$kde_cxxflags_safe
+])
+
+AC_MSG_RESULT($kde_cv_have_kdeqtaddon)
+
+if test "$kde_cv_have_kdeqtaddon" = "no"; then
+ AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first.
+It is a separate package (and CVS module) named kde-qt-addon.])
+fi
+])
+
+AC_DEFUN([KDE_CREATE_LIBS_ALIASES],
+[
+ AC_REQUIRE([KDE_MISC_TESTS])
+ AC_REQUIRE([KDE_CHECK_LIBDL])
+ AC_REQUIRE([K_PATH_X])
+
+if test $kde_qtver = 3; then
+ case $host in
+ *cygwin*) lib_kded="-lkdeinit_kded" ;;
+ *) lib_kded="" ;;
+ esac
+ AC_SUBST(LIB_KDED, $lib_kded)
+ AC_SUBST(LIB_KDECORE, "-lkdecore")
+ AC_SUBST(LIB_KDEUI, "-lkdeui")
+ AC_SUBST(LIB_KIO, "-lkio")
+ AC_SUBST(LIB_KJS, "-lkjs")
+ AC_SUBST(LIB_SMB, "-lsmb")
+ AC_SUBST(LIB_KAB, "-lkab")
+ AC_SUBST(LIB_KABC, "-lkabc")
+ AC_SUBST(LIB_KHTML, "-lkhtml")
+ AC_SUBST(LIB_KSPELL, "-lkspell")
+ AC_SUBST(LIB_KPARTS, "-lkparts")
+ AC_SUBST(LIB_KDEPRINT, "-lkdeprint")
+ AC_SUBST(LIB_KUTILS, "-lkutils")
+ AC_SUBST(LIB_KDEPIM, "-lkdepim")
+ AC_SUBST(LIB_KIMPROXY, "-lkimproxy")
+ AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff")
+ AC_SUBST(LIB_KDNSSD, "-lkdnssd")
+ AC_SUBST(LIB_KUNITTEST, "-lkunittest")
+# these are for backward compatibility
+ AC_SUBST(LIB_KSYCOCA, "-lkio")
+ AC_SUBST(LIB_KFILE, "-lkio")
+elif test $kde_qtver = 2; then
+ AC_SUBST(LIB_KDECORE, "-lkdecore")
+ AC_SUBST(LIB_KDEUI, "-lkdeui")
+ AC_SUBST(LIB_KIO, "-lkio")
+ AC_SUBST(LIB_KSYCOCA, "-lksycoca")
+ AC_SUBST(LIB_SMB, "-lsmb")
+ AC_SUBST(LIB_KFILE, "-lkfile")
+ AC_SUBST(LIB_KAB, "-lkab")
+ AC_SUBST(LIB_KHTML, "-lkhtml")
+ AC_SUBST(LIB_KSPELL, "-lkspell")
+ AC_SUBST(LIB_KPARTS, "-lkparts")
+ AC_SUBST(LIB_KDEPRINT, "-lkdeprint")
+else
+ AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)")
+ AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)")
+ AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)")
+ AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)")
+ AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)")
+fi
+])
+
+AC_DEFUN([AC_PATH_KDE],
+[
+ AC_BASE_PATH_KDE
+ AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]),
+ [
+ if test "$enableval" = "no";
+ then ac_use_path_checking="default"
+ else ac_use_path_checking=""
+ fi
+ ],
+ [
+ if test "$kde_qtver" = 1;
+ then ac_use_path_checking=""
+ else ac_use_path_checking="default"
+ fi
+ ]
+ )
+
+ AC_CREATE_KFSSTND($ac_use_path_checking)
+
+ AC_SUBST_KFSSTND
+ KDE_CREATE_LIBS_ALIASES
+])
+
+dnl KDE_CHECK_FUNC_EXT(<func>, [headers], [sample-use], [C prototype], [autoheader define], [call if found])
+AC_DEFUN([KDE_CHECK_FUNC_EXT],
+[
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(kde_cv_func_$1,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+save_CXXFLAGS="$CXXFLAGS"
+kde_safe_LIBS="$LIBS"
+LIBS="$LIBS $X_EXTRA_LIBS"
+if test "$GXX" = "yes"; then
+CXXFLAGS="$CXXFLAGS -pedantic-errors"
+fi
+AC_TRY_COMPILE([
+$2
+],
+[
+$3
+],
+kde_cv_func_$1=yes,
+kde_cv_func_$1=no)
+CXXFLAGS="$save_CXXFLAGS"
+LIBS="$kde_safe_LIBS"
+AC_LANG_RESTORE
+])
+
+AC_MSG_RESULT($kde_cv_func_$1)
+
+AC_MSG_CHECKING([if $1 needs custom prototype])
+AC_CACHE_VAL(kde_cv_proto_$1,
+[
+if test "x$kde_cv_func_$1" = xyes; then
+ kde_cv_proto_$1=no
+else
+ case "$1" in
+ setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat)
+ kde_cv_proto_$1="yes - in libkdefakes"
+ ;;
+ *)
+ kde_cv_proto_$1=unknown
+ ;;
+ esac
+fi
+
+if test "x$kde_cv_proto_$1" = xunknown; then
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ kde_safe_libs=$LIBS
+ LIBS="$LIBS $X_EXTRA_LIBS"
+ AC_TRY_LINK([
+$2
+
+extern "C" $4;
+],
+[
+$3
+],
+[ kde_cv_func_$1=yes
+ kde_cv_proto_$1=yes ],
+ [kde_cv_proto_$1="$1 unavailable"]
+)
+LIBS=$kde_safe_libs
+AC_LANG_RESTORE
+fi
+])
+AC_MSG_RESULT($kde_cv_proto_$1)
+
+if test "x$kde_cv_func_$1" = xyes; then
+ AC_DEFINE(HAVE_$5, 1, [Define if you have $1])
+ $6
+fi
+if test "x$kde_cv_proto_$1" = xno; then
+ AC_DEFINE(HAVE_$5_PROTO, 1,
+ [Define if you have the $1 prototype])
+fi
+
+AH_VERBATIM([_HAVE_$5_PROTO],
+[
+#if !defined(HAVE_$5_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+$4;
+#ifdef __cplusplus
+}
+#endif
+#endif
+])
+])
+
+AC_DEFUN([AC_CHECK_SETENV],
+[
+ KDE_CHECK_FUNC_EXT(setenv, [
+#include <stdlib.h>
+],
+ [setenv("VAR", "VALUE", 1);],
+ [int setenv (const char *, const char *, int)],
+ [SETENV])
+])
+
+AC_DEFUN([AC_CHECK_UNSETENV],
+[
+ KDE_CHECK_FUNC_EXT(unsetenv, [
+#include <stdlib.h>
+],
+ [unsetenv("VAR");],
+ [void unsetenv (const char *)],
+ [UNSETENV])
+])
+
+AC_DEFUN([AC_CHECK_GETDOMAINNAME],
+[
+ KDE_CHECK_FUNC_EXT(getdomainname, [
+#include <stdlib.h>
+#include <unistd.h>
+#include <netdb.h>
+],
+ [
+char buffer[200];
+getdomainname(buffer, 200);
+],
+ [#include <sys/types.h>
+ int getdomainname (char *, size_t)],
+ [GETDOMAINNAME])
+])
+
+AC_DEFUN([AC_CHECK_GETHOSTNAME],
+[
+ KDE_CHECK_FUNC_EXT(gethostname, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+char buffer[200];
+gethostname(buffer, 200);
+],
+ [int gethostname (char *, unsigned int)],
+ [GETHOSTNAME])
+])
+
+AC_DEFUN([AC_CHECK_USLEEP],
+[
+ KDE_CHECK_FUNC_EXT(usleep, [
+#include <unistd.h>
+],
+ [
+usleep(200);
+],
+ [int usleep (unsigned int)],
+ [USLEEP])
+])
+
+
+AC_DEFUN([AC_CHECK_RANDOM],
+[
+ KDE_CHECK_FUNC_EXT(random, [
+#include <stdlib.h>
+],
+ [
+random();
+],
+ [long int random(void)],
+ [RANDOM])
+
+ KDE_CHECK_FUNC_EXT(srandom, [
+#include <stdlib.h>
+],
+ [
+srandom(27);
+],
+ [void srandom(unsigned int)],
+ [SRANDOM])
+
+])
+
+AC_DEFUN([AC_CHECK_INITGROUPS],
+[
+ KDE_CHECK_FUNC_EXT(initgroups, [
+#include <sys/types.h>
+#include <unistd.h>
+#include <grp.h>
+],
+ [
+char buffer[200];
+initgroups(buffer, 27);
+],
+ [int initgroups(const char *, gid_t)],
+ [INITGROUPS])
+])
+
+AC_DEFUN([AC_CHECK_MKSTEMPS],
+[
+ KDE_CHECK_FUNC_EXT(mkstemps, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+mkstemps("/tmp/aaaXXXXXX", 6);
+],
+ [int mkstemps(char *, int)],
+ [MKSTEMPS])
+])
+
+AC_DEFUN([AC_CHECK_MKSTEMP],
+[
+ KDE_CHECK_FUNC_EXT(mkstemp, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+mkstemp("/tmp/aaaXXXXXX");
+],
+ [int mkstemp(char *)],
+ [MKSTEMP])
+])
+
+AC_DEFUN([AC_CHECK_MKDTEMP],
+[
+ KDE_CHECK_FUNC_EXT(mkdtemp, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+mkdtemp("/tmp/aaaXXXXXX");
+],
+ [char *mkdtemp(char *)],
+ [MKDTEMP])
+])
+
+
+AC_DEFUN([AC_CHECK_RES_INIT],
+[
+ AC_MSG_CHECKING([if res_init needs -lresolv])
+ kde_libs_safe="$LIBS"
+ LIBS="$LIBS $X_EXTRA_LIBS -lresolv"
+ AC_TRY_LINK(
+ [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+ ],
+ [
+ res_init();
+ ],
+ [
+ LIBRESOLV="-lresolv"
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function])
+ ],
+ [ AC_MSG_RESULT(no) ]
+ )
+ LIBS=$kde_libs_safe
+ AC_SUBST(LIBRESOLV)
+
+ KDE_CHECK_FUNC_EXT(res_init,
+ [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+ ],
+ [res_init()],
+ [int res_init(void)],
+ [RES_INIT])
+])
+
+AC_DEFUN([AC_CHECK_STRLCPY],
+[
+ KDE_CHECK_FUNC_EXT(strlcpy, [
+#include <string.h>
+],
+[ char buf[20];
+ strlcpy(buf, "KDE function test", sizeof(buf));
+],
+ [unsigned long strlcpy(char*, const char*, unsigned long)],
+ [STRLCPY])
+])
+
+AC_DEFUN([AC_CHECK_STRLCAT],
+[
+ KDE_CHECK_FUNC_EXT(strlcat, [
+#include <string.h>
+],
+[ char buf[20];
+ buf[0]='\0';
+ strlcat(buf, "KDE function test", sizeof(buf));
+],
+ [unsigned long strlcat(char*, const char*, unsigned long)],
+ [STRLCAT])
+])
+
+AC_DEFUN([AC_CHECK_RES_QUERY],
+[
+ KDE_CHECK_FUNC_EXT(res_query, [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include <netdb.h>
+],
+[
+res_query(NULL, 0, 0, NULL, 0);
+],
+ [int res_query(const char *, int, int, unsigned char *, int)],
+ [RES_QUERY])
+])
+
+AC_DEFUN([AC_CHECK_DN_SKIPNAME],
+[
+ KDE_CHECK_FUNC_EXT(dn_skipname, [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+],
+[
+dn_skipname (NULL, NULL);
+],
+ [int dn_skipname (unsigned char *, unsigned char *)],
+ [DN_SKIPNAME])
+])
+
+
+AC_DEFUN([AC_FIND_GIF],
+ [AC_MSG_CHECKING([for giflib])
+AC_CACHE_VAL(ac_cv_lib_gif,
+[ac_save_LIBS="$LIBS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$all_libraries -lgif -lX11 $LIBSOCKET"
+else
+LIBS="$all_libraries -lgif"
+fi
+AC_TRY_LINK(dnl
+[
+#ifdef __cplusplus
+extern "C" {
+#endif
+int GifLastError(void);
+#ifdef __cplusplus
+}
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+],
+ [return GifLastError();],
+ eval "ac_cv_lib_gif=yes",
+ eval "ac_cv_lib_gif=no")
+LIBS="$ac_save_LIBS"
+])dnl
+if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif])
+else
+ AC_MSG_ERROR(You need giflib30. Please install the kdesupport package)
+fi
+])
+
+AC_DEFUN([KDE_FIND_JPEG_HELPER],
+[
+AC_MSG_CHECKING([for libjpeg$2])
+AC_CACHE_VAL(ac_cv_lib_jpeg_$1,
+[
+ac_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(
+[
+#ifdef __cplusplus
+extern "C" {
+#endif
+void jpeg_CreateDecompress();
+#ifdef __cplusplus
+}
+#endif
+],
+[jpeg_CreateDecompress();],
+ eval "ac_cv_lib_jpeg_$1=-ljpeg$2",
+ eval "ac_cv_lib_jpeg_$1=no")
+LIBS="$ac_save_LIBS"
+CFLAGS="$ac_save_CFLAGS"
+])
+
+if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then
+ LIBJPEG="$ac_cv_lib_jpeg_$1"
+ AC_MSG_RESULT($ac_cv_lib_jpeg_$1)
+else
+ AC_MSG_RESULT(no)
+ $3
+fi
+
+])
+
+AC_DEFUN([AC_FIND_JPEG],
+[
+dnl first look for libraries
+KDE_FIND_JPEG_HELPER(6b, 6b,
+ KDE_FIND_JPEG_HELPER(normal, [],
+ [
+ LIBJPEG=
+ ]
+ )
+)
+
+dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h
+dnl requires system dependent includes loaded before it)
+jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes"
+AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir)
+test "x$jpeg_incdir" = xNO && jpeg_incdir=
+
+dnl if headers _and_ libraries are missing, this is no error, and we
+dnl continue with a warning (the user will get no jpeg support in khtml)
+dnl if only one is missing, it means a configuration error, but we still
+dnl only warn
+if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then
+ AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg])
+else
+ if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then
+ AC_MSG_WARN([
+There is an installation error in jpeg support. You seem to have only one
+of either the headers _or_ the libraries installed. You may need to either
+provide correct --with-extra-... options, or the development package of
+libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/
+Disabling JPEG support.
+])
+ else
+ AC_MSG_WARN([libjpeg not found. disable JPEG support.])
+ fi
+ jpeg_incdir=
+ LIBJPEG=
+fi
+
+AC_SUBST(LIBJPEG)
+AH_VERBATIM(_AC_CHECK_JPEG,
+[/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+])
+])
+
+AC_DEFUN([KDE_CHECK_QT_JPEG],
+[
+if test -n "$LIBJPEG"; then
+AC_MSG_CHECKING([if Qt needs $LIBJPEG])
+AC_CACHE_VAL(kde_cv_qt_jpeg,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ac_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS $LIBQT"
+LIBS=`echo $LIBS | sed "s/$LIBJPEG//"`
+ac_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(
+[#include <qapplication.h>],
+ [
+ int argc;
+ char** argv;
+ QApplication app(argc, argv);],
+ eval "kde_cv_qt_jpeg=no",
+ eval "kde_cv_qt_jpeg=yes")
+LIBS="$ac_save_LIBS"
+CXXFLAGS="$ac_save_CXXFLAGS"
+AC_LANG_RESTORE
+fi
+])
+
+if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then
+ AC_MSG_RESULT(yes)
+ LIBJPEG_QT='$(LIBJPEG)'
+else
+ AC_MSG_RESULT(no)
+ LIBJPEG_QT=
+fi
+
+])
+
+AC_DEFUN([AC_FIND_ZLIB],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_MSG_CHECKING([for libz])
+AC_CACHE_VAL(ac_cv_lib_z,
+[
+kde_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET"
+kde_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(dnl
+[
+#include<zlib.h>
+#include<string.h>
+],
+[
+ char buf[42];
+ gzFile f = (gzFile) 0;
+ /* this would segfault.. but we only link, don't run */
+ (void) gzgets(f, buf, sizeof(buf));
+
+ return (strcmp(zlibVersion(), ZLIB_VERSION) == 0);
+],
+ eval "ac_cv_lib_z='-lz'",
+ eval "ac_cv_lib_z=no")
+LIBS="$kde_save_LIBS"
+CFLAGS="$kde_save_CFLAGS"
+])dnl
+if test ! "$ac_cv_lib_z" = no; then
+ AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz])
+ LIBZ="$ac_cv_lib_z"
+ AC_MSG_RESULT($ac_cv_lib_z)
+else
+ AC_MSG_ERROR(not found.
+ Possibly configure picks up an outdated version
+ installed by XFree86. Remove it from your system.
+
+ Check your installation and look into config.log)
+ LIBZ=""
+fi
+AC_SUBST(LIBZ)
+])
+
+AC_DEFUN([KDE_TRY_TIFFLIB],
+[
+AC_MSG_CHECKING([for libtiff $1])
+
+AC_CACHE_VAL(kde_cv_libtiff_$1,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+kde_save_LIBS="$LIBS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm"
+else
+LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm"
+fi
+kde_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES"
+
+AC_TRY_LINK(dnl
+[
+#include<tiffio.h>
+],
+ [return (TIFFOpen( "", "r") == 0); ],
+[
+ kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ"
+], [
+ kde_cv_libtiff_$1=no
+])
+
+LIBS="$kde_save_LIBS"
+CXXFLAGS="$kde_save_CXXFLAGS"
+AC_LANG_RESTORE
+])
+
+if test "$kde_cv_libtiff_$1" = "no"; then
+ AC_MSG_RESULT(no)
+ LIBTIFF=""
+ $3
+else
+ LIBTIFF="$kde_cv_libtiff_$1"
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff])
+ $2
+fi
+
+])
+
+AC_DEFUN([AC_FIND_TIFF],
+[
+AC_REQUIRE([K_PATH_X])
+AC_REQUIRE([AC_FIND_ZLIB])
+AC_REQUIRE([AC_FIND_JPEG])
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+KDE_TRY_TIFFLIB(tiff, [],
+ KDE_TRY_TIFFLIB(tiff34))
+
+AC_SUBST(LIBTIFF)
+])
+
+AC_DEFUN([KDE_FIND_LIBEXR],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_REQUIRE([AC_FIND_ZLIB])
+AC_CACHE_VAL(ac_cv_libexr,
+[
+ if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+ fi
+
+ AC_MSG_CHECKING([for OpenEXR libraries])
+
+ if test "$PKG_CONFIG" = "no" ; then
+ AC_MSG_RESULT(no)
+ echo "*** The pkg-config script could not be found. Make sure it is"
+ echo "*** in your path, or set the PKG_CONFIG environment variable"
+ echo "*** to the full path to pkg-config."
+ echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
+ else
+ if ! $PKG_CONFIG --exists OpenEXR ; then
+ AC_MSG_RESULT(no)
+ EXRSTATUS=no
+ else
+ if ! $PKG_CONFIG --atleast-version="1.1.1" OpenEXR ; then
+ AC_MSG_RESULT(no)
+ EXRSTATUS=old
+ else
+ kde_save_LIBS="$LIBS"
+ LIBS="$LIBS $all_libraries $USER_LDFLAGS `pkg-config --libs OpenEXR` $LIBZ"
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ kde_save_CXXFLAGS="$CXXFLAGS"
+ EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR`
+ CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS"
+
+ AC_TRY_LINK(dnl
+ [
+ #include <ImfRgbaFile.h>
+ ],
+ [
+ using namespace Imf;
+ RgbaInputFile file ("dummy");
+ return 0;
+ ],
+ eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'",
+ eval "ac_cv_libexr=no"
+ )
+ LIBS="$kde_save_LIBS"
+ CXXFLAGS="$kde_save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])dnl
+ if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then
+ AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR])
+ LIB_EXR="$ac_cv_libexr"
+ AC_MSG_RESULT($ac_cv_libexr)
+ else
+ AC_MSG_RESULT(no)
+ LIB_EXR=""
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST(LIB_EXR)
+ AC_SUBST(EXR_FLAGS)
+])
+
+
+
+AC_DEFUN([AC_FIND_PNG],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_REQUIRE([AC_FIND_ZLIB])
+AC_MSG_CHECKING([for libpng])
+AC_CACHE_VAL(ac_cv_lib_png,
+[
+kde_save_LIBS="$LIBS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET"
+else
+LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm"
+fi
+kde_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+
+AC_TRY_LINK(dnl
+ [
+ #include<png.h>
+ ],
+ [
+ png_structp png_ptr = png_create_read_struct( /* image ptr */
+ PNG_LIBPNG_VER_STRING, 0, 0, 0 );
+ return( png_ptr != 0 );
+ ],
+ eval "ac_cv_lib_png='-lpng $LIBZ -lm'",
+ eval "ac_cv_lib_png=no"
+)
+LIBS="$kde_save_LIBS"
+CFLAGS="$kde_save_CFLAGS"
+])dnl
+if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then
+ AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng])
+ LIBPNG="$ac_cv_lib_png"
+ AC_SUBST(LIBPNG)
+ AC_MSG_RESULT($ac_cv_lib_png)
+else
+ AC_MSG_RESULT(no)
+ LIBPNG=""
+ AC_SUBST(LIBPNG)
+fi
+])
+
+
+AC_DEFUN([AC_FIND_JASPER],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_REQUIRE([AC_FIND_JPEG])
+AC_MSG_CHECKING([for jasper])
+AC_CACHE_VAL(ac_cv_jasper,
+[
+kde_save_LIBS="$LIBS"
+LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm"
+kde_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+
+AC_TRY_LINK(dnl
+ [
+ #include<jasper/jasper.h>
+ ],
+ [
+ return( jas_init() );
+ ],
+ eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'",
+ eval "ac_cv_jasper=no"
+)
+LIBS="$kde_save_LIBS"
+CFLAGS="$kde_save_CFLAGS"
+])dnl
+if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then
+ AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper])
+ LIB_JASPER="$ac_cv_jasper"
+ AC_MSG_RESULT($ac_cv_jasper)
+else
+ AC_MSG_RESULT(no)
+ LIB_JASPER=""
+fi
+AC_SUBST(LIB_JASPER)
+])
+
+AC_DEFUN([AC_CHECK_BOOL],
+[
+ AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool])
+])
+
+AC_DEFUN([AC_CHECK_GNU_EXTENSIONS],
+[
+AC_MSG_CHECKING(if you need GNU extensions)
+AC_CACHE_VAL(ac_cv_gnu_extensions,
+[
+cat > conftest.c << EOF
+#include <features.h>
+
+#ifdef __GNU_LIBRARY__
+yes
+#endif
+EOF
+
+if (eval "$ac_cpp conftest.c") 2>&5 |
+ egrep "yes" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_gnu_extensions=yes
+else
+ ac_cv_gnu_extensions=no
+fi
+])
+
+AC_MSG_RESULT($ac_cv_gnu_extensions)
+if test "$ac_cv_gnu_extensions" = "yes"; then
+ AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions])
+fi
+])
+
+AC_DEFUN([KDE_CHECK_COMPILER_FLAG],
+[
+AC_MSG_CHECKING([whether $CXX supports -$1])
+kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'`
+AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache,
+[
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS -$1"
+ AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], [])
+ CXXFLAGS="$save_CXXFLAGS"
+ AC_LANG_RESTORE
+])
+if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ :
+ $2
+else
+ AC_MSG_RESULT(no)
+ :
+ $3
+fi
+])
+
+AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG],
+[
+AC_MSG_CHECKING([whether $CC supports -$1])
+kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'`
+AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache,
+[
+ AC_LANG_SAVE
+ AC_LANG_C
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -$1"
+ AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], [])
+ CFLAGS="$save_CFLAGS"
+ AC_LANG_RESTORE
+])
+if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ :
+ $2
+else
+ AC_MSG_RESULT(no)
+ :
+ $3
+fi
+])
+
+
+dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables
+dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever])
+dnl it's all white-space separated
+AC_DEFUN([AC_REMOVE_FORBIDDEN],
+[ __val=$$1
+ __forbid=" $2 "
+ if test -n "$__val"; then
+ __new=""
+ ac_save_IFS=$IFS
+ IFS=" "
+ for i in $__val; do
+ case "$__forbid" in
+ *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;;
+ *) # Careful to not add spaces, where there were none, because otherwise
+ # libtool gets confused, if we change e.g. CXX
+ if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;;
+ esac
+ done
+ IFS=$ac_save_IFS
+ $1=$__new
+ fi
+])
+
+
+AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER],
+[
+ AC_MSG_CHECKING([whether $CC is blacklisted])
+
+ dnl In theory we have tu run this test against $CC and $CXX
+ dnl in C and in C++ mode, because its perfectly legal for
+ dnl the user to mix compiler versions, since C has a defined
+ dnl ABI.
+ dnl
+ dnl For now, we assume the user is not on crack.
+
+ AC_TRY_COMPILE([
+#ifdef __GNUC__
+#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0
+choke me
+#endif
+#endif
+], ,
+ kde_bad_compiler=no,
+ kde_bad_compiler=yes
+)
+
+ AC_MSG_RESULT($kde_bad_compiler)
+
+if test "$kde_bad_compiler" = "yes"; then
+ AC_MSG_ERROR([
+
+This particular compiler version is blacklisted because it
+is known to miscompile KDE. Please use a newer version, or
+if that is not yet available, choose an older version.
+
+Please do not report a bug or bother us reporting this
+configure error. We know about it, and we introduced
+it by intention to avoid untraceable bugs or crashes in KDE.
+
+])
+fi
+
+])
+
+
+AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH],
+[
+ AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline],
+ kde_cv_opt_noinline_match,
+ [
+ kde_cv_opt_noinline_match=irrelevant
+ dnl if we don't use both -O2 and -fno-inline, this check is moot
+ if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \
+ && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then
+
+ ac_cflags_save="$CFLAGS"
+ CFLAGS="$CFLAGS -D_USE_GNU"
+
+ AC_TRY_LINK([
+ #include <string.h>
+], [ const char *pt, *et;
+ et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ;
+],
+ kde_cv_opt_noinline_match=yes,
+ kde_cv_opt_noinline_match=no
+ )
+
+ CFLAGS="$ac_cflags_save"
+ fi
+ ])
+])
+
+
+dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given
+AC_DEFUN([AC_VALIDIFY_CXXFLAGS],
+[dnl
+if test "x$kde_use_qt_emb" != "xyes"; then
+ AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath])
+ AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath])
+else
+ AC_REMOVE_FORBIDDEN(CXX, [-rpath])
+ AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath])
+fi
+])
+
+AC_DEFUN([AC_CHECK_COMPILERS],
+[
+ AC_ARG_ENABLE(debug,
+ AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]),
+ [
+ case $enableval in
+ yes)
+ kde_use_debug_code="yes"
+ kde_use_debug_define=no
+ ;;
+ full)
+ kde_use_debug_code="full"
+ kde_use_debug_define=no
+ ;;
+ *)
+ kde_use_debug_code="no"
+ kde_use_debug_define=yes
+ ;;
+ esac
+ ],
+ [kde_use_debug_code="no"
+ kde_use_debug_define=no
+ ])
+
+ dnl Just for configure --help
+ AC_ARG_ENABLE(dummyoption,
+ AC_HELP_STRING([--disable-debug],
+ [disables debug output and debug symbols [default=no]]),
+ [],[])
+
+ AC_ARG_ENABLE(strict,
+ AC_HELP_STRING([--enable-strict],
+ [compiles with strict compiler options (may not work!)]),
+ [
+ if test $enableval = "no"; then
+ kde_use_strict_options="no"
+ else
+ kde_use_strict_options="yes"
+ fi
+ ], [kde_use_strict_options="no"])
+
+ AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]),
+ [
+ if test $enableval = "no"; then
+ kde_use_warnings="no"
+ else
+ kde_use_warnings="yes"
+ fi
+ ], [kde_use_warnings="yes"])
+
+ dnl enable warnings for debug build
+ if test "$kde_use_debug_code" != "no"; then
+ kde_use_warnings=yes
+ fi
+
+ AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]),
+ [kde_use_profiling=$enableval],
+ [kde_use_profiling="no"]
+ )
+
+ dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS
+ CFLAGS=" $CFLAGS"
+
+ AC_PROG_CC
+
+ AC_PROG_CPP
+
+ if test "$GCC" = "yes"; then
+ if test "$kde_use_debug_code" != "no"; then
+ if test $kde_use_debug_code = "full"; then
+ CFLAGS="-g3 -fno-inline $CFLAGS"
+ else
+ CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS"
+ fi
+ else
+ CFLAGS="-O2 $CFLAGS"
+ fi
+ fi
+
+ if test "$kde_use_debug_define" = "yes"; then
+ CFLAGS="-DNDEBUG $CFLAGS"
+ fi
+
+
+ case "$host" in
+ *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";;
+ *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";;
+ esac
+
+ if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then
+ LDFLAGS=""
+ fi
+
+ CXXFLAGS=" $CXXFLAGS"
+
+ AC_PROG_CXX
+
+ KDE_CHECK_FOR_BAD_COMPILER
+
+ if test "$GXX" = "yes" || test "$CXX" = "KCC"; then
+ if test "$kde_use_debug_code" != "no"; then
+ if test "$CXX" = "KCC"; then
+ CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS"
+ else
+ if test "$kde_use_debug_code" = "full"; then
+ CXXFLAGS="-g3 -fno-inline $CXXFLAGS"
+ else
+ CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS"
+ fi
+ fi
+ KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"])
+
+ dnl convenience compiler flags
+ KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""])
+ AC_SUBST(WOVERLOADED_VIRTUAL)
+ else
+ if test "$CXX" = "KCC"; then
+ CXXFLAGS="+K3 $CXXFLAGS"
+ else
+ CXXFLAGS="-O2 $CXXFLAGS"
+ fi
+ fi
+ fi
+
+ if test "$kde_use_debug_define" = "yes"; then
+ CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS"
+ fi
+
+ if test "$kde_use_profiling" = "yes"; then
+ KDE_CHECK_COMPILER_FLAG(pg,
+ [
+ CFLAGS="-pg $CFLAGS"
+ CXXFLAGS="-pg $CXXFLAGS"
+ ])
+ fi
+
+ if test "$kde_use_warnings" = "yes"; then
+ if test "$GCC" = "yes"; then
+ CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS"
+ case $host in
+ *-*-linux-gnu)
+ CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS"
+ CXXFLAGS="-ansi -D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wchar-subscripts $CXXFLAGS"
+ KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"])
+ KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"])
+ ;;
+ esac
+ KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"])
+ KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"])
+ dnl ### FIXME: revert for KDE 4
+ KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"])
+ fi
+ fi
+
+ if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then
+ CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS"
+ fi
+
+ AC_ARG_ENABLE(pch,
+ AC_HELP_STRING([--enable-pch],
+ [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]),
+ [ kde_use_pch=$enableval ],[ kde_use_pch=no ])
+
+ HAVE_GCC_VISIBILITY=0
+ AC_SUBST([HAVE_GCC_VISIBILITY])
+
+ if test "$GXX" = "yes"; then
+ gcc_no_reorder_blocks=NO
+ KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES])
+ if test $kde_use_debug_code != "no" && \
+ test $kde_use_debug_code != "full" && \
+ test "YES" = "$gcc_no_reorder_blocks" ; then
+ CXXFLAGS="$CXXFLAGS -fno-reorder-blocks"
+ CFLAGS="$CFLAGS -fno-reorder-blocks"
+ fi
+ KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"])
+ KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"])
+ KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"])
+ KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= )
+ ENABLE_PERMISSIVE_FLAG="-fpermissive"
+
+ if test "$kde_use_pch" = "yes"; then
+ AC_MSG_CHECKING(whether gcc supports precompiling c header files)
+ echo >conftest.h
+ if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then
+ kde_gcc_supports_pch=yes
+ AC_MSG_RESULT(yes)
+ else
+ kde_gcc_supports_pch=no
+ AC_MSG_RESULT(no)
+ fi
+ if test "$kde_gcc_supports_pch" = "yes"; then
+ AC_MSG_CHECKING(whether gcc supports precompiling c++ header files)
+ if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then
+ kde_gcc_supports_pch=yes
+ AC_MSG_RESULT(yes)
+ else
+ kde_gcc_supports_pch=no
+ AC_MSG_RESULT(no)
+ fi
+ fi
+ rm -f conftest.h conftest.h.gch
+ fi
+
+ KDE_CHECK_FOR_OPT_NOINLINE_MATCH
+ if test "x$kde_cv_opt_noinline_match" = "xno" ; then
+ CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`"
+ fi
+ fi
+ AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes")
+ if test "$CXX" = "KCC"; then
+ dnl unfortunately we currently cannot disable exception support in KCC
+ dnl because doing so is binary incompatible and Qt by default links with exceptions :-(
+ dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"])
+ dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= )
+
+ if test "$kde_use_pch" = "yes"; then
+ dnl TODO: support --pch-dir!
+ KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"])
+ dnl the below works (but the dir must exist), but it's
+ dnl useless for a whole package.
+ dnl The are precompiled headers for each source file, so when compiling
+ dnl from scratch, it doesn't make a difference, and they take up
+ dnl around ~5Mb _per_ sourcefile.
+ dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp,
+ dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"])
+ fi
+ dnl this flag controls inlining. by default KCC inlines in optimisation mode
+ dnl all implementations that are defined inside the class {} declaration.
+ dnl because of templates-compatibility with broken gcc compilers, this
+ dnl can cause excessive inlining. This flag limits it to a sane level
+ KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"])
+ KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"])
+ KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"])
+ KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"])
+ dnl Some source files are shared between multiple executables
+ dnl (or libraries) and some of those need template instantiations.
+ dnl In that case KCC needs to compile those sources with
+ dnl --one_instantiation_per_object. To make it easy for us we compile
+ dnl _all_ objects with that flag (--one_per is a shorthand).
+ KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"])
+ fi
+ AC_SUBST(USE_EXCEPTIONS)
+ dnl obsolete macro - provided to keep things going
+ USE_RTTI=
+ AC_SUBST(USE_RTTI)
+
+ case "$host" in
+ *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;;
+ *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";;
+ *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";;
+ *-*-solaris*)
+ if test "$GXX" = yes; then
+ libstdcpp=`$CXX -print-file-name=libstdc++.so`
+ if test ! -f $libstdcpp; then
+ AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so])
+ fi
+ fi
+ ;;
+ esac
+
+ AC_VALIDIFY_CXXFLAGS
+
+ AC_PROG_CXXCPP
+
+ if test "$GCC" = yes; then
+ NOOPT_CFLAGS=-O0
+ fi
+ KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0])
+
+ AC_ARG_ENABLE(coverage,
+ AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [
+ if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then
+ ac_coverage_compiler="-fprofile-arcs -ftest-coverage"
+ ac_coverage_linker="-lgcc"
+ elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then
+ ac_coverage_compiler="-fprofile-arcs -ftest-coverage"
+ ac_coverage_linker=""
+ else
+ AC_MSG_ERROR([coverage with your compiler is not supported])
+ fi
+ CFLAGS="$CFLAGS $ac_coverage_compiler"
+ CXXFLAGS="$CXXFLAGS $ac_coverage_compiler"
+ LDFLAGS="$LDFLAGS $ac_coverage_linker"
+ ])
+
+ AC_SUBST(NOOPT_CXXFLAGS)
+ AC_SUBST(NOOPT_CFLAGS)
+ AC_SUBST(ENABLE_PERMISSIVE_FLAG)
+
+ KDE_CHECK_NEW_LDFLAGS
+ KDE_CHECK_FINAL
+ KDE_CHECK_CLOSURE
+ KDE_CHECK_NMCHECK
+
+ ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), [])
+])
+
+AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG],
+ [
+ AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ safe_CXXFLAGS=$CXXFLAGS
+ safe_LDFLAGS=$LDFLAGS
+ CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0"
+ LDFLAGS="$LDFLAGS -shared -fPIC"
+
+ AC_TRY_LINK(
+ [
+ /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */
+ #include <string>
+ int some_function( void ) __attribute__ ((visibility("default")));
+ int some_function( void )
+ {
+ std::string s("blafasel");
+ return 0;
+ }
+ ], [/* elvis is alive */],
+ kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes)
+
+ CXXFLAGS=$safe_CXXFLAGS
+ LDFLAGS=$safe_LDFLAGS
+ AC_LANG_RESTORE
+ ]
+ )
+
+ if test x$kde_cv_val_gcc_visibility_bug = xno; then
+ CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+ fi
+ ]
+)
+
+AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY],
+[
+ AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY])
+
+ AC_MSG_CHECKING([grepping for visibility push/pop in headers])
+
+ if test "x$GXX" = "xyes"; then
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_EGREP_CPP(
+ [GCC visibility push],
+ [ #include <exception>
+ ],
+ [
+ AC_MSG_RESULT(yes)
+ kde_stdc_visibility_patched=yes ],
+ [
+ AC_MSG_RESULT(no)
+ AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for
+ visibility support. Disabling -fvisibility=hidden])
+
+ kde_stdc_visibility_patched=no ])
+
+ AC_LANG_RESTORE
+
+ kde_have_gcc_visibility=no
+ KDE_CHECK_COMPILER_FLAG(fvisibility=hidden,
+ [
+ kde_have_gcc_visibility=yes
+ dnl the whole toolchain is just a mess, gcc is just too buggy
+ dnl to handle STL with visibility enabled. Lets reconsider
+ dnl when gcc 4.2 is out or when things get fixed in the compiler.
+ dnl Contact mueller@kde.org for details.
+ AC_ARG_ENABLE(gcc-hidden-visibility,
+ AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]),
+ [kde_have_gcc_visibility=$enableval],
+ [kde_have_gcc_visibility=no])
+
+ AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ safe_CXXFLAGS=$CXXFLAGS
+ CXXFLAGS="$CXXFLAGS $all_includes"
+
+ AC_TRY_COMPILE(
+ [
+#include <qglobal.h>
+#if Q_EXPORT - 0 != 0
+/* if this compiles, then Q_EXPORT is undefined */
+/* if Q_EXPORT is nonempty, this will break compilation */
+#endif
+ ], [/* elvis is alive */],
+ kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes)
+
+ CXXFLAGS=$safe_CXXFLAGS
+ AC_LANG_RESTORE
+ ]
+ )
+
+ if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then
+ CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+ KDE_CHECK_VISIBILITY_GCC_BUG
+ HAVE_GCC_VISIBILITY=1
+ AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported])
+ fi
+ ])
+ fi
+])
+
+AC_DEFUN([KDE_ADD_DEPENDENCIES],
+[
+ [A]M_DEPENDENCIES(CC)
+ [A]M_DEPENDENCIES(CXX)
+])
+
+dnl just a wrapper to clean up configure.in
+AC_DEFUN([KDE_PROG_LIBTOOL],
+[
+AC_REQUIRE([AC_CHECK_COMPILERS])
+AC_REQUIRE([AC_ENABLE_SHARED])
+AC_REQUIRE([AC_ENABLE_STATIC])
+
+AC_REQUIRE([AC_LIBTOOL_DLOPEN])
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+AC_OBJEXT
+AC_EXEEXT
+
+AM_PROG_LIBTOOL
+AC_LIBTOOL_CXX
+
+LIBTOOL_SHELL="/bin/sh ./libtool"
+# LIBTOOL="$LIBTOOL --silent"
+KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)"
+AC_SUBST(KDE_PLUGIN)
+
+# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs.
+KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)"
+AC_SUBST(KDE_CHECK_PLUGIN)
+
+# we patch configure quite some so we better keep that consistent for incremental runs
+AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure')
+])
+
+AC_DEFUN([KDE_CHECK_LIB64],
+[
+ AC_ARG_ENABLE(libsuffix,
+ AC_HELP_STRING([--enable-libsuffix],
+ [/lib directory suffix (64,32,none,auto[=default])]),
+ kdelibsuff=$enableval, kdelibsuff="auto")
+
+ if test "$kdelibsuff" = "auto"; then
+
+cat > conftest.c << EOF
+#include <stdio.h>
+int main() {
+ return 0;
+}
+EOF
+ kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{
+ s,.*/lib\([[^\/]]*\)/.*,\1,
+ p
+}'`
+ rm -rf conftest.*
+ fi
+
+ if test "$kdelibsuff" = "no" || test "$kdelibsuff" = "none"; then
+ kdelibsuff=
+ fi
+ if test -z "$kdelibsuff"; then
+ AC_MSG_RESULT([not using lib directory suffix])
+ AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories)
+ else
+ if test "$libdir" = '${exec_prefix}/lib'; then
+ libdir="$libdir${kdelibsuff}"
+ AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms
+ fi
+ AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories)
+ AC_MSG_RESULT([using lib directory suffix $kdelibsuff])
+ fi
+])
+
+AC_DEFUN([KDE_CHECK_TYPES],
+[ AC_CHECK_SIZEOF(int, 4)dnl
+ AC_CHECK_SIZEOF(short)dnl
+ AC_CHECK_SIZEOF(long, 4)dnl
+ AC_CHECK_SIZEOF(char *, 4)dnl
+])dnl
+
+dnl Not used - kept for compat only?
+AC_DEFUN([KDE_DO_IT_ALL],
+[
+AC_CANONICAL_SYSTEM
+AC_ARG_PROGRAM
+AM_INIT_AUTOMAKE($1, $2)
+AM_DISABLE_LIBRARIES
+AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde})
+AC_CHECK_COMPILERS
+KDE_PROG_LIBTOOL
+AM_KDE_WITH_NLS
+AC_PATH_KDE
+])
+
+AC_DEFUN([AC_CHECK_RPATH],
+[
+AC_MSG_CHECKING(for rpath)
+AC_ARG_ENABLE(rpath,
+ AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]),
+ USE_RPATH=$enableval, USE_RPATH=yes)
+
+if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then
+
+ KDE_RPATH="-R \$(libdir)"
+
+ if test "$kde_libraries" != "$libdir"; then
+ KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)"
+ fi
+
+ if test -n "$qt_libraries"; then
+ KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)"
+ fi
+ dnl $x_libraries is set to /usr/lib in case
+ if test -n "$X_LDFLAGS"; then
+ X_RPATH="-R \$(x_libraries)"
+ KDE_RPATH="$KDE_RPATH $X_RPATH"
+ fi
+ if test -n "$KDE_EXTRA_RPATH"; then
+ KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)"
+ fi
+fi
+AC_SUBST(KDE_EXTRA_RPATH)
+AC_SUBST(KDE_RPATH)
+AC_SUBST(X_RPATH)
+AC_MSG_RESULT($USE_RPATH)
+])
+
+dnl Check for the type of the third argument of getsockname
+AC_DEFUN([AC_CHECK_SOCKLEN_T],
+[
+ AC_MSG_CHECKING(for socklen_t)
+ AC_CACHE_VAL(kde_cv_socklen_t,
+ [
+ AC_LANG_PUSH(C++)
+ kde_cv_socklen_t=no
+ AC_TRY_COMPILE([
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ ],
+ [
+ socklen_t len;
+ getpeername(0,0,&len);
+ ],
+ [
+ kde_cv_socklen_t=yes
+ kde_cv_socklen_t_equiv=socklen_t
+ ])
+ AC_LANG_POP(C++)
+ ])
+ AC_MSG_RESULT($kde_cv_socklen_t)
+ if test $kde_cv_socklen_t = no; then
+ AC_MSG_CHECKING([for socklen_t equivalent for socket functions])
+ AC_CACHE_VAL(kde_cv_socklen_t_equiv,
+ [
+ kde_cv_socklen_t_equiv=int
+ AC_LANG_PUSH(C++)
+ for t in int size_t unsigned long "unsigned long"; do
+ AC_TRY_COMPILE([
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ ],
+ [
+ $t len;
+ getpeername(0,0,&len);
+ ],
+ [
+ kde_cv_socklen_t_equiv="$t"
+ break
+ ])
+ done
+ AC_LANG_POP(C++)
+ ])
+ AC_MSG_RESULT($kde_cv_socklen_t_equiv)
+ fi
+ AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv,
+ [type to use in place of socklen_t if not defined])
+ AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv,
+ [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)])
+])
+
+dnl This is a merge of some macros out of the gettext aclocal.m4
+dnl since we don't need anything, I took the things we need
+dnl the copyright for them is:
+dnl >
+dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+dnl This Makefile.in is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+dnl >
+dnl for this file it is relicensed under LGPL
+
+AC_DEFUN([AM_KDE_WITH_NLS],
+ [
+ dnl If we use NLS figure out what method
+
+ AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt,
+ [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+ if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then
+ AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it])
+ GMSGFMT=":"
+ fi
+ MSGFMT=$GMSGFMT
+ AC_SUBST(GMSGFMT)
+ AC_SUBST(MSGFMT)
+
+ AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is no GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext programs is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ fi
+ AC_SUBST(XGETTEXT)
+
+ ])
+
+# Search path for a program which passes the given test.
+# Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# serial 1
+# Stephan Kulow: I appended a _KDE against name conflicts
+
+dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test -n "[$]$1"; then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# serial 1
+
+AC_DEFUN([AM_LC_MESSAGES],
+ [if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES])
+ fi
+ fi])
+
+dnl From Jim Meyering.
+dnl FIXME: migrate into libit.
+
+AC_DEFUN([AM_FUNC_OBSTACK],
+[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack,
+ [AC_TRY_LINK([#include "obstack.h"],
+ [struct obstack *mem;obstack_free(mem,(char *) 0)],
+ am_cv_func_obstack=yes,
+ am_cv_func_obstack=no)])
+ if test $am_cv_func_obstack = yes; then
+ AC_DEFINE(HAVE_OBSTACK)
+ else
+ LIBOBJS="$LIBOBJS obstack.o"
+ fi
+])
+
+dnl From Jim Meyering. Use this if you use the GNU error.[ch].
+dnl FIXME: Migrate into libit
+
+AC_DEFUN([AM_FUNC_ERROR_AT_LINE],
+[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line,
+ [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");],
+ am_cv_lib_error_at_line=yes,
+ am_cv_lib_error_at_line=no)])
+ if test $am_cv_lib_error_at_line = no; then
+ LIBOBJS="$LIBOBJS error.o"
+ fi
+ AC_SUBST(LIBOBJS)dnl
+])
+
+# Macro to add for using GNU gettext.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# serial 1
+# Stephan Kulow: I put a KDE in it to avoid name conflicts
+
+AC_DEFUN([AM_KDE_GNU_GETTEXT],
+ [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([AM_KDE_WITH_NLS])dnl
+ AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h])
+ AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \
+__argz_count __argz_stringify __argz_next])
+
+ AC_MSG_CHECKING(for stpcpy)
+ AC_CACHE_VAL(kde_cv_func_stpcpy,
+ [
+ kde_safe_cxxflags=$CXXFLAGS
+ CXXFLAGS="-Werror"
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([
+ #include <string.h>
+ ],
+ [
+ char buffer[200];
+ stpcpy(buffer, buffer);
+ ],
+ kde_cv_func_stpcpy=yes,
+ kde_cv_func_stpcpy=no)
+ AC_LANG_RESTORE
+ CXXFLAGS=$kde_safe_cxxflags
+ ])
+ AC_MSG_RESULT($kde_cv_func_stpcpy)
+ if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then
+ AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy])
+ fi
+
+ AM_LC_MESSAGES
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ AC_MSG_CHECKING(for catalogs to be installed)
+ NEW_LINGUAS=
+ for lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case "$ALL_LINGUAS" in
+ *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
+ esac
+ done
+ LINGUAS=$NEW_LINGUAS
+ AC_MSG_RESULT($LINGUAS)
+ fi
+
+ dnl Construct list of names of catalog files to be constructed.
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ ])
+
+AC_DEFUN([AC_HAVE_XPM],
+ [AC_REQUIRE_CPP()dnl
+ AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+ test -z "$XPM_LDFLAGS" && XPM_LDFLAGS=
+ test -z "$XPM_INCLUDE" && XPM_INCLUDE=
+
+ AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]),
+ xpm_test=$withval, xpm_test="yes")
+ if test "x$xpm_test" = xno; then
+ ac_cv_have_xpm=no
+ else
+ AC_MSG_CHECKING(for XPM)
+ AC_CACHE_VAL(ac_cv_have_xpm,
+ [
+ ac_save_ldflags="$LDFLAGS"
+ ac_save_cflags="$CFLAGS"
+ if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+ LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET"
+ else
+ LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET"
+ fi
+ CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES"
+ test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS"
+ AC_TRY_LINK([#include <X11/xpm.h>],[],
+ ac_cv_have_xpm="yes",ac_cv_have_xpm="no")
+ LDFLAGS="$ac_save_ldflags"
+ CFLAGS="$ac_save_cflags"
+ ])dnl
+
+ if test "$ac_cv_have_xpm" = no; then
+ AC_MSG_RESULT(no)
+ XPM_LDFLAGS=""
+ XPMINC=""
+ $2
+ else
+ AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support])
+ if test "$XPM_LDFLAGS" = ""; then
+ XPMLIB='-lXpm $(LIB_X11)'
+ else
+ XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)'
+ fi
+ if test "$XPM_INCLUDE" = ""; then
+ XPMINC=""
+ else
+ XPMINC="-I$XPM_INCLUDE"
+ fi
+ AC_MSG_RESULT(yes)
+ $1
+ fi
+ fi
+ AC_SUBST(XPMINC)
+ AC_SUBST(XPMLIB)
+])
+
+AC_DEFUN([AC_HAVE_DPMS],
+ [AC_REQUIRE_CPP()dnl
+ AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+ test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS=
+ test -z "$DPMS_INCLUDE" && DPMS_INCLUDE=
+ DPMS_LIB=
+
+ AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]),
+ dpms_test=$withval, dpms_test="yes")
+ if test "x$dpms_test" = xno; then
+ ac_cv_have_dpms=no
+ else
+ AC_MSG_CHECKING(for DPMS)
+ dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms.
+ dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms".
+ AC_CACHE_VAL(ac_cv_have_dpms,
+ [
+ if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then
+ AC_MSG_RESULT(no)
+ ac_cv_have_dpms="no"
+ else
+ ac_save_ldflags="$LDFLAGS"
+ ac_save_cflags="$CFLAGS"
+ ac_save_libs="$LIBS"
+ LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries"
+ LIBS="-lX11 -lXext $LIBSOCKET"
+ CFLAGS="$CFLAGS $X_INCLUDES"
+ test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS"
+ AC_TRY_LINK([
+ #include <X11/Xproto.h>
+ #include <X11/X.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>
+ int foo_test_dpms()
+ { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[],
+ ac_cv_have_dpms="yes", [
+ LIBS="-lXdpms $LIBS"
+ AC_TRY_LINK([
+ #include <X11/Xproto.h>
+ #include <X11/X.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>
+ int foo_test_dpms()
+ { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[],
+ [
+ ac_cv_have_dpms="-lXdpms"
+ ],ac_cv_have_dpms="no")
+ ])
+ LDFLAGS="$ac_save_ldflags"
+ CFLAGS="$ac_save_cflags"
+ LIBS="$ac_save_libs"
+ fi
+ ])dnl
+
+ if test "$ac_cv_have_dpms" = no; then
+ AC_MSG_RESULT(no)
+ DPMS_LDFLAGS=""
+ DPMSINC=""
+ $2
+ else
+ AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support])
+ if test "$ac_cv_have_dpms" = "-lXdpms"; then
+ DPMS_LIB="-lXdpms"
+ fi
+ if test "$DPMS_LDFLAGS" = ""; then
+ DPMSLIB="$DPMS_LIB "'$(LIB_X11)'
+ else
+ DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)'
+ fi
+ if test "$DPMS_INCLUDE" = ""; then
+ DPMSINC=""
+ else
+ DPMSINC="-I$DPMS_INCLUDE"
+ fi
+ AC_MSG_RESULT(yes)
+ $1
+ fi
+ fi
+ ac_save_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $X_INCLUDES"
+ test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS"
+ AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO,
+ [Define if you have the DPMSCapable prototype in <X11/extensions/dpms.h>])
+ AC_CHECK_DECL(DPMSCapable,
+ AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),,
+ [#include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>])
+ AH_TEMPLATE(HAVE_DPMSINFO_PROTO,
+ [Define if you have the DPMSInfo prototype in <X11/extensions/dpms.h>])
+ AC_CHECK_DECL(DPMSInfo,
+ AC_DEFINE(HAVE_DPMSINFO_PROTO),,
+ [#include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>])
+ CFLAGS="$ac_save_cflags"
+ AC_SUBST(DPMSINC)
+ AC_SUBST(DPMSLIB)
+])
+
+AC_DEFUN([AC_HAVE_GL],
+ [AC_REQUIRE_CPP()dnl
+ AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+ test -z "$GL_LDFLAGS" && GL_LDFLAGS=
+ test -z "$GL_INCLUDE" && GL_INCLUDE=
+
+ AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]),
+ gl_test=$withval, gl_test="yes")
+ if test "x$kde_use_qt_emb" = "xyes"; then
+ # GL and Qt Embedded is a no-go for now.
+ ac_cv_have_gl=no
+ elif test "x$gl_test" = xno; then
+ ac_cv_have_gl=no
+ else
+ AC_MSG_CHECKING(for GL)
+ AC_CACHE_VAL(ac_cv_have_gl,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_save_ldflags=$LDFLAGS
+ ac_save_cxxflags=$CXXFLAGS
+ ac_save_libs=$LIBS
+ LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries"
+ LIBS="$LIBS -lGL -lGLU"
+ test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11"
+ LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET"
+ CXXFLAGS="$CFLAGS $X_INCLUDES"
+ test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS"
+ AC_TRY_LINK([#include <GL/gl.h>
+#include <GL/glu.h>
+], [],
+ ac_cv_have_gl="yes", ac_cv_have_gl="no")
+ AC_LANG_RESTORE
+ LDFLAGS=$ac_save_ldflags
+ CXXFLAGS=$ac_save_cxxflags
+ LIBS=$ac_save_libs
+ ])dnl
+
+ if test "$ac_cv_have_gl" = "no"; then
+ AC_MSG_RESULT(no)
+ GL_LDFLAGS=""
+ GLINC=""
+ $2
+ else
+ AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)])
+ if test "$GL_LDFLAGS" = ""; then
+ GLLIB='-lGLU -lGL $(LIB_X11)'
+ else
+ GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)'
+ fi
+ if test "$GL_INCLUDE" = ""; then
+ GLINC=""
+ else
+ GLINC="-I$GL_INCLUDE"
+ fi
+ AC_MSG_RESULT($ac_cv_have_gl)
+ $1
+ fi
+ fi
+ AC_SUBST(GLINC)
+ AC_SUBST(GLLIB)
+])
+
+
+ dnl shadow password and PAM magic - maintained by ossi@kde.org
+
+AC_DEFUN([KDE_PAM], [
+ AC_REQUIRE([KDE_CHECK_LIBDL])
+
+ want_pam=
+ AC_ARG_WITH(pam,
+ AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]),
+ [ if test "x$withval" = "xyes"; then
+ want_pam=yes
+ pam_service=kde
+ elif test "x$withval" = "xno"; then
+ want_pam=no
+ else
+ want_pam=yes
+ pam_service=$withval
+ fi
+ ], [ pam_service=kde ])
+
+ use_pam=
+ PAMLIBS=
+ if test "x$want_pam" != xno; then
+ AC_CHECK_LIB(pam, pam_start, [
+ AC_CHECK_HEADER(security/pam_appl.h,
+ [ pam_header=security/pam_appl.h ],
+ [ AC_CHECK_HEADER(pam/pam_appl.h,
+ [ pam_header=pam/pam_appl.h ],
+ [
+ AC_MSG_WARN([PAM detected, but no headers found!
+Make sure you have the necessary development packages installed.])
+ ]
+ )
+ ]
+ )
+ ], , $LIBDL)
+ if test -z "$pam_header"; then
+ if test "x$want_pam" = xyes; then
+ AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!])
+ fi
+ else
+ AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)])
+ PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL"
+ use_pam=yes
+
+ dnl darwin claims to be something special
+ if test "$pam_header" = "pam/pam_appl.h"; then
+ AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/])
+ fi
+
+ dnl test whether struct pam_message is const (Linux) or not (Sun)
+ AC_MSG_CHECKING(for const pam_message)
+ AC_EGREP_HEADER([struct pam_message], $pam_header,
+ [ AC_EGREP_HEADER([const struct pam_message], $pam_header,
+ [AC_MSG_RESULT([const: Linux-type PAM])],
+ [AC_MSG_RESULT([nonconst: Sun-type PAM])
+ AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])]
+ )],
+ [AC_MSG_RESULT([not found - assume const, Linux-type PAM])])
+ fi
+ fi
+
+ AC_SUBST(PAMLIBS)
+])
+
+dnl DEF_PAM_SERVICE(arg name, full name, define name)
+AC_DEFUN([DEF_PAM_SERVICE], [
+ AC_ARG_WITH($1-pam,
+ AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]),
+ [ if test "x$use_pam" = xyes; then
+ $3_PAM_SERVICE=$withval
+ else
+ AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected.
+You may want to enforce it by using --with-pam.])
+ fi
+ ],
+ [ if test "x$use_pam" = xyes; then
+ $3_PAM_SERVICE="$pam_service"
+ fi
+ ])
+ if test -n "$$3_PAM_SERVICE"; then
+ AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE])
+ AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2])
+ fi
+ AC_SUBST($3_PAM_SERVICE)
+])
+
+AC_DEFUN([KDE_SHADOWPASSWD], [
+ AC_REQUIRE([KDE_PAM])
+
+ AC_CHECK_LIB(shadow, getspent,
+ [ LIBSHADOW="-lshadow"
+ ac_use_shadow=yes
+ ],
+ [ dnl for UnixWare
+ AC_CHECK_LIB(gen, getspent,
+ [ LIBGEN="-lgen"
+ ac_use_shadow=yes
+ ],
+ [ AC_CHECK_FUNC(getspent,
+ [ ac_use_shadow=yes ],
+ [ ac_use_shadow=no ])
+ ])
+ ])
+ AC_SUBST(LIBSHADOW)
+ AC_SUBST(LIBGEN)
+
+ AC_MSG_CHECKING([for shadow passwords])
+
+ AC_ARG_WITH(shadow,
+ AC_HELP_STRING([--with-shadow],[If you want shadow password support]),
+ [ if test "x$withval" != "xno"; then
+ use_shadow=yes
+ else
+ use_shadow=no
+ fi
+ ], [
+ use_shadow="$ac_use_shadow"
+ ])
+
+ if test "x$use_shadow" = xyes; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords])
+ else
+ AC_MSG_RESULT(no)
+ LIBSHADOW=
+ LIBGEN=
+ fi
+
+ dnl finally make the relevant binaries setuid root, if we have shadow passwds.
+ dnl this still applies, if we could use it indirectly through pam.
+ if test "x$use_shadow" = xyes ||
+ ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then
+ case $host in
+ *-*-freebsd* | *-*-netbsd* | *-*-openbsd*)
+ SETUIDFLAGS="-m 4755 -o root";;
+ *)
+ SETUIDFLAGS="-m 4755";;
+ esac
+ fi
+ AC_SUBST(SETUIDFLAGS)
+
+])
+
+AC_DEFUN([KDE_PASSWDLIBS], [
+ AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT
+ AC_REQUIRE([KDE_PAM])
+ AC_REQUIRE([KDE_SHADOWPASSWD])
+
+ if test "x$use_pam" = "xyes"; then
+ PASSWDLIBS="$PAMLIBS"
+ else
+ PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN"
+ fi
+
+ dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but
+ dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires
+ dnl root to read, so kcheckpass needs to be root (even when using pam, since pam
+ dnl may need to read /etc/master.passwd).
+ case $host in
+ *-*-freebsd*)
+ SETUIDFLAGS="-m 4755 -o root"
+ ;;
+ *)
+ ;;
+ esac
+
+ AC_SUBST(PASSWDLIBS)
+])
+
+AC_DEFUN([KDE_CHECK_LIBDL],
+[
+AC_CHECK_LIB(dl, dlopen, [
+LIBDL="-ldl"
+ac_cv_have_dlfcn=yes
+])
+
+AC_CHECK_LIB(dld, shl_unload, [
+LIBDL="-ldld"
+ac_cv_have_shload=yes
+])
+
+AC_SUBST(LIBDL)
+])
+
+AC_DEFUN([KDE_CHECK_DLOPEN],
+[
+KDE_CHECK_LIBDL
+AC_CHECK_HEADERS(dlfcn.h dl.h)
+if test "$ac_cv_header_dlfcn_h" = "no"; then
+ ac_cv_have_dlfcn=no
+fi
+
+if test "$ac_cv_header_dl_h" = "no"; then
+ ac_cv_have_shload=no
+fi
+
+dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE
+dnl (MM)
+AC_ARG_ENABLE(dlopen,
+AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]),
+enable_dlopen=$enableval,
+enable_dlopen=yes)
+
+# override the user's opinion, if we know it better ;)
+if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then
+ enable_dlopen=no
+fi
+
+if test "$ac_cv_have_dlfcn" = "yes"; then
+ AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn])
+fi
+
+if test "$ac_cv_have_shload" = "yes"; then
+ AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload])
+fi
+
+if test "$enable_dlopen" = no ; then
+ test -n "$1" && eval $1
+else
+ test -n "$2" && eval $2
+fi
+
+])
+
+AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING],
+[
+KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no)
+KDE_PROG_LIBTOOL
+AC_MSG_CHECKING([dynamic loading])
+eval "`egrep '^build_libtool_libs=' libtool`"
+if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then
+ dynamic_loading=yes
+ AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING)
+else
+ dynamic_loading=no
+fi
+AC_MSG_RESULT($dynamic_loading)
+if test "$dynamic_loading" = "yes"; then
+ $1
+else
+ $2
+fi
+])
+
+AC_DEFUN([KDE_ADD_INCLUDES],
+[
+if test -z "$1"; then
+ test_include="Pix.h"
+else
+ test_include="$1"
+fi
+
+AC_MSG_CHECKING([for libg++ ($test_include)])
+
+AC_CACHE_VAL(kde_cv_libgpp_includes,
+[
+kde_cv_libgpp_includes=no
+
+ for ac_dir in \
+ \
+ /usr/include/g++ \
+ /usr/include \
+ /usr/unsupported/include \
+ /opt/include \
+ $extra_include \
+ ; \
+ do
+ if test -r "$ac_dir/$test_include"; then
+ kde_cv_libgpp_includes=$ac_dir
+ break
+ fi
+ done
+])
+
+AC_MSG_RESULT($kde_cv_libgpp_includes)
+if test "$kde_cv_libgpp_includes" != "no"; then
+ all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES"
+fi
+])
+])
+
+AC_DEFUN([KDE_CHECK_LIBPTHREAD],
+[
+ dnl This code is here specifically to handle the
+ dnl various flavors of threading library on FreeBSD
+ dnl 4-, 5-, and 6-, and the (weird) rules around it.
+ dnl There may be an environment PTHREAD_LIBS that
+ dnl specifies what to use; otherwise, search for it.
+ dnl -pthread is special cased and unsets LIBPTHREAD
+ dnl below if found.
+ LIBPTHREAD=""
+
+ if test -n "$PTHREAD_LIBS"; then
+ if test "x$PTHREAD_LIBS" = "x-pthread" ; then
+ LIBPTHREAD="PTHREAD"
+ else
+ PTHREAD_LIBS_save="$PTHREAD_LIBS"
+ PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'`
+ AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS])
+ KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [
+ LIBPTHREAD="$PTHREAD_LIBS_save"])
+ PTHREAD_LIBS="$PTHREAD_LIBS_save"
+ fi
+ fi
+
+ dnl Is this test really needed, in the face of the Tru64 test below?
+ if test -z "$LIBPTHREAD"; then
+ AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"])
+ fi
+
+ dnl This is a special Tru64 check, see BR 76171 issue #18.
+ if test -z "$LIBPTHREAD" ; then
+ AC_MSG_CHECKING([for pthread_create in -lpthread])
+ kde_safe_libs=$LIBS
+ LIBS="$LIBS -lpthread"
+ AC_TRY_LINK([#include <pthread.h>],[(void)pthread_create(0,0,0,0);],[
+ AC_MSG_RESULT(yes)
+ LIBPTHREAD="-lpthread"],[
+ AC_MSG_RESULT(no)])
+ LIBS=$kde_safe_libs
+ fi
+
+ dnl Un-special-case for FreeBSD.
+ if test "x$LIBPTHREAD" = "xPTHREAD" ; then
+ LIBPTHREAD=""
+ fi
+
+ AC_SUBST(LIBPTHREAD)
+])
+
+AC_DEFUN([KDE_CHECK_PTHREAD_OPTION],
+[
+ USE_THREADS=""
+ if test -z "$LIBPTHREAD"; then
+ KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"])
+ fi
+
+ AH_VERBATIM(__svr_define, [
+#if defined(__SVR4) && !defined(__svr4__)
+#define __svr4__ 1
+#endif
+])
+ case $host_os in
+ solaris*)
+ KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"])
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4"
+ ;;
+ freebsd*)
+ CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS"
+ ;;
+ aix*)
+ CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE"
+ LIBPTHREAD="$LIBPTHREAD -lc_r"
+ ;;
+ linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ if test "$CXX" = "KCC"; then
+ CXXFLAGS="$CXXFLAGS --thread_safe"
+ NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe"
+ fi
+ ;;
+ *)
+ ;;
+ esac
+ AC_SUBST(USE_THREADS)
+ AC_SUBST(LIBPTHREAD)
+])
+
+AC_DEFUN([KDE_CHECK_THREADING],
+[
+ AC_REQUIRE([KDE_CHECK_LIBPTHREAD])
+ AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION])
+ dnl default is yes if libpthread is found and no if no libpthread is available
+ if test -z "$LIBPTHREAD"; then
+ if test -z "$USE_THREADS"; then
+ kde_check_threading_default=no
+ else
+ kde_check_threading_default=yes
+ fi
+ else
+ kde_check_threading_default=yes
+ fi
+ AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]),
+ kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default)
+ if test "x$kde_use_threading" = "xyes"; then
+ AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)])
+ fi
+])
+
+AC_DEFUN([KDE_TRY_LINK_PYTHON],
+[
+if test "$kde_python_link_found" = no; then
+
+if test "$1" = normal; then
+ AC_MSG_CHECKING(if a Python application links)
+else
+ AC_MSG_CHECKING(if Python depends on $2)
+fi
+
+AC_CACHE_VAL(kde_cv_try_link_python_$1,
+[
+kde_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $PYTHONINC"
+kde_save_libs="$LIBS"
+LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET"
+kde_save_ldflags="$LDFLAGS"
+LDFLAGS="$LDFLAGS $PYTHONLIB"
+
+AC_TRY_LINK(
+[
+#include <Python.h>
+],[
+ PySys_SetArgv(1, 0);
+],
+ [kde_cv_try_link_python_$1=yes],
+ [kde_cv_try_link_python_$1=no]
+)
+CFLAGS="$kde_save_cflags"
+LIBS="$kde_save_libs"
+LDFLAGS="$kde_save_ldflags"
+])
+
+if test "$kde_cv_try_link_python_$1" = "yes"; then
+ AC_MSG_RESULT(yes)
+ kde_python_link_found=yes
+ if test ! "$1" = normal; then
+ LIBPYTHON="$LIBPYTHON $2"
+ fi
+ $3
+else
+ AC_MSG_RESULT(no)
+ $4
+fi
+
+fi
+
+])
+
+AC_DEFUN([KDE_CHECK_PYTHON_DIR],
+[
+AC_MSG_CHECKING([for Python directory])
+
+AC_CACHE_VAL(kde_cv_pythondir,
+[
+ if test -z "$PYTHONDIR"; then
+ kde_cv_pythondir=/usr/local
+ else
+ kde_cv_pythondir="$PYTHONDIR"
+ fi
+])
+
+AC_ARG_WITH(pythondir,
+AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]),
+[
+ ac_python_dir=$withval
+], ac_python_dir=$kde_cv_pythondir
+)
+
+AC_MSG_RESULT($ac_python_dir)
+])
+
+AC_DEFUN([KDE_CHECK_PYTHON_INTERN],
+[
+AC_REQUIRE([KDE_CHECK_LIBDL])
+AC_REQUIRE([KDE_CHECK_LIBPTHREAD])
+AC_REQUIRE([KDE_CHECK_PYTHON_DIR])
+
+if test -z "$1"; then
+ version="1.5"
+else
+ version="$1"
+fi
+
+AC_MSG_CHECKING([for Python$version])
+
+python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes"
+AC_FIND_FILE(Python.h, $python_incdirs, python_incdir)
+if test ! -r $python_incdir/Python.h; then
+ AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir)
+ python_incdir=$python_incdir/python$version
+ if test ! -r $python_incdir/Python.h; then
+ python_incdir=no
+ fi
+fi
+
+PYTHONINC=-I$python_incdir
+
+python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs"
+AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir)
+if test ! -r $python_libdir/libpython$version.so; then
+ AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir)
+ if test ! -r $python_libdir/libpython$version.a; then
+ AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir)
+ python_libdir=$python_libdir/python$version/config
+ if test ! -r $python_libdir/libpython$version.a; then
+ python_libdir=no
+ fi
+ fi
+fi
+
+PYTHONLIB=-L$python_libdir
+kde_orig_LIBPYTHON=$LIBPYTHON
+if test -z "$LIBPYTHON"; then
+ LIBPYTHON=-lpython$version
+fi
+
+AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir)
+python_moddir=$python_moddir/python$version
+if test ! -r $python_moddir/copy.py; then
+ python_moddir=no
+fi
+
+PYTHONMODDIR=$python_moddir
+
+AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir)
+
+if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then
+ LIBPYTHON=$kde_orig_LIBPYTHON
+ test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB=""
+ test "x$PYTHONINC" = "x-Ino" && PYTHONINC=""
+ $2
+else
+ dnl Note: this test is very weak
+ kde_python_link_found=no
+ KDE_TRY_LINK_PYTHON(normal)
+ KDE_TRY_LINK_PYTHON(m, -lm)
+ KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD)
+ KDE_TRY_LINK_PYTHON(tcl, -ltcl)
+ KDE_TRY_LINK_PYTHON(db2, -ldb2)
+ KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil])
+ KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil])
+ KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm])
+ KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [],
+ [AC_MSG_WARN([it seems, Python depends on another library.
+ Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this
+ and contact the authors to let them know about this problem])
+ ])
+
+ LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET"
+ AC_SUBST(PYTHONINC)
+ AC_SUBST(PYTHONLIB)
+ AC_SUBST(LIBPYTHON)
+ AC_SUBST(PYTHONMODDIR)
+ AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python])
+fi
+
+])
+
+
+AC_DEFUN([KDE_CHECK_PYTHON],
+[
+ KDE_CHECK_PYTHON_INTERN("2.5",
+ [KDE_CHECK_PYTHON_INTERN("2.4",
+ [KDE_CHECK_PYTHON_INTERN("2.3",
+ [KDE_CHECK_PYTHON_INTERN("2.2",
+ [KDE_CHECK_PYTHON_INTERN("2.1",
+ [KDE_CHECK_PYTHON_INTERN("2.0",
+ [KDE_CHECK_PYTHON_INTERN($1, $2) ])
+ ])
+ ])
+ ])
+ ])
+ ])
+])
+
+AC_DEFUN([KDE_CHECK_STL],
+[
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`"
+
+ AC_MSG_CHECKING([if C++ programs can be compiled])
+ AC_CACHE_VAL(kde_cv_stl_works,
+ [
+ AC_TRY_COMPILE([
+#include <string>
+using namespace std;
+],[
+ string astring="Hallo Welt.";
+ astring.erase(0, 6); // now astring is "Welt"
+ return 0;
+], kde_cv_stl_works=yes,
+ kde_cv_stl_works=no)
+])
+
+ AC_MSG_RESULT($kde_cv_stl_works)
+
+ if test "$kde_cv_stl_works" = "yes"; then
+ # back compatible
+ AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI])
+ else
+ AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs.
+Check config.log for details - if you're using a Linux distribution you might miss
+a package named similar to libstdc++-dev.])
+ fi
+
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ AC_LANG_RESTORE
+])
+
+AC_DEFUN([AC_FIND_QIMGIO],
+ [AC_REQUIRE([AC_FIND_JPEG])
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_MSG_CHECKING([for qimgio])
+AC_CACHE_VAL(ac_cv_lib_qimgio,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ac_save_LIBS="$LIBS"
+ac_save_CXXFLAGS="$CXXFLAGS"
+LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT"
+CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes"
+AC_TRY_RUN(dnl
+[
+#include <qimageio.h>
+#include <qstring.h>
+int main() {
+ QString t = "hallo";
+ t.fill('t');
+ qInitImageIO();
+}
+],
+ ac_cv_lib_qimgio=yes,
+ ac_cv_lib_qimgio=no,
+ ac_cv_lib_qimgio=no)
+LIBS="$ac_save_LIBS"
+CXXFLAGS="$ac_save_CXXFLAGS"
+AC_LANG_RESTORE
+])dnl
+if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then
+ LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG"
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available])
+ AC_SUBST(LIBQIMGIO)
+else
+ AC_MSG_RESULT(not found)
+fi
+])
+
+AC_DEFUN([AM_DISABLE_LIBRARIES],
+[
+ AC_PROVIDE([AM_ENABLE_STATIC])
+ AC_PROVIDE([AM_ENABLE_SHARED])
+ enable_static=no
+ enable_shared=yes
+])
+
+
+AC_DEFUN([AC_CHECK_UTMP_FILE],
+[
+ AC_MSG_CHECKING([for utmp file])
+
+ AC_CACHE_VAL(kde_cv_utmp_file,
+ [
+ kde_cv_utmp_file=no
+
+ for ac_file in \
+ \
+ /var/run/utmp \
+ /var/adm/utmp \
+ /etc/utmp \
+ ; \
+ do
+ if test -r "$ac_file"; then
+ kde_cv_utmp_file=$ac_file
+ break
+ fi
+ done
+ ])
+
+ if test "$kde_cv_utmp_file" != "no"; then
+ AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries])
+ $1
+ AC_MSG_RESULT($kde_cv_utmp_file)
+ else
+ $2
+ AC_MSG_RESULT([non found])
+ fi
+])
+
+
+AC_DEFUN([KDE_CREATE_SUBDIRSLIST],
+[
+
+DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin"
+TOPSUBDIRS=""
+
+if test ! -s $srcdir/subdirs; then
+ dnl Note: Makefile.common creates subdirs, so this is just a fallback
+ files=`cd $srcdir && ls -1`
+ dirs=`for i in $files; do if test -d $i; then echo $i; fi; done`
+ for i in $dirs; do
+ echo $i >> $srcdir/subdirs
+ done
+fi
+
+ac_topsubdirs=
+if test -s $srcdir/inst-apps; then
+ ac_topsubdirs="`cat $srcdir/inst-apps`"
+elif test -s $srcdir/subdirs; then
+ ac_topsubdirs="`cat $srcdir/subdirs`"
+fi
+
+for i in $ac_topsubdirs; do
+ AC_MSG_CHECKING([if $i should be compiled])
+ if test -d $srcdir/$i; then
+ install_it="yes"
+ for j in $DO_NOT_COMPILE; do
+ if test $i = $j; then
+ install_it="no"
+ fi
+ done
+ else
+ install_it="no"
+ fi
+ AC_MSG_RESULT($install_it)
+ vari=`echo $i | sed -e 's,[[-+.@]],_,g'`
+ if test $install_it = "yes"; then
+ TOPSUBDIRS="$TOPSUBDIRS $i"
+ eval "$vari""_SUBDIR_included=yes"
+ else
+ eval "$vari""_SUBDIR_included=no"
+ fi
+done
+
+AC_SUBST(TOPSUBDIRS)
+])
+
+AC_DEFUN([KDE_CHECK_NAMESPACES],
+[
+AC_MSG_CHECKING(whether C++ compiler supports namespaces)
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+AC_TRY_COMPILE([
+],
+[
+namespace Foo {
+ extern int i;
+ namespace Bar {
+ extern int i;
+ }
+}
+
+int Foo::i = 0;
+int Foo::Bar::i = 1;
+],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_NAMESPACES)
+], [
+AC_MSG_RESULT(no)
+])
+AC_LANG_RESTORE
+])
+
+dnl ------------------------------------------------------------------------
+dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_CHECK_S_ISSOCK],
+[
+AC_MSG_CHECKING(for S_ISSOCK)
+AC_CACHE_VAL(ac_cv_have_s_issock,
+[
+AC_TRY_LINK(
+[
+#include <sys/stat.h>
+],
+[
+struct stat buff;
+int b = S_ISSOCK( buff.st_mode );
+],
+ac_cv_have_s_issock=yes,
+ac_cv_have_s_issock=no)
+])
+AC_MSG_RESULT($ac_cv_have_s_issock)
+if test "$ac_cv_have_s_issock" = "yes"; then
+ AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.])
+fi
+
+AH_VERBATIM(_ISSOCK,
+[
+#ifndef HAVE_S_ISSOCK
+#define HAVE_S_ISSOCK
+#define S_ISSOCK(mode) (1==0)
+#endif
+])
+
+])
+
+dnl ------------------------------------------------------------------------
+dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_CHECK_KDEMAXPATHLEN],
+[
+AC_MSG_CHECKING(for MAXPATHLEN)
+AC_CACHE_VAL(ac_cv_maxpathlen,
+[
+cat > conftest.$ac_ext <<EOF
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/param.h>
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 1024
+#endif
+
+KDE_HELLO MAXPATHLEN
+
+EOF
+
+ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out"
+
+if AC_TRY_EVAL(ac_try) && test -s conftest.out; then
+ ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out`
+else
+ ac_cv_maxpathlen=1024
+fi
+
+rm conftest.*
+
+])
+AC_MSG_RESULT($ac_cv_maxpathlen)
+AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] )
+])
+
+AC_DEFUN([KDE_CHECK_HEADER],
+[
+ kde_safe_cppflags=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS $all_includes"
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_CHECK_HEADER([$1], [$2], [$3], [$4])
+ AC_LANG_RESTORE
+ CPPFLAGS=$kde_safe_cppflags
+])
+
+AC_DEFUN([KDE_CHECK_HEADERS],
+[
+ AH_CHECK_HEADERS([$1])
+ AC_LANG_SAVE
+ kde_safe_cppflags=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS $all_includes"
+ AC_LANG_CPLUSPLUS
+ AC_CHECK_HEADERS([$1], [$2], [$3], [$4])
+ CPPFLAGS=$kde_safe_cppflags
+ AC_LANG_RESTORE
+])
+
+AC_DEFUN([KDE_FAST_CONFIGURE],
+[
+ dnl makes configure fast (needs perl)
+ AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]),
+ with_fast_perl=$enableval, with_fast_perl=yes)
+])
+
+AC_DEFUN([KDE_CONF_FILES],
+[
+ val=
+ if test -f $srcdir/configure.files ; then
+ val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files`
+ fi
+ CONF_FILES=
+ if test -n "$val" ; then
+ for i in $val ; do
+ CONF_FILES="$CONF_FILES $i"
+ done
+ fi
+ AC_SUBST(CONF_FILES)
+])dnl
+
+dnl This sets the prefix, for arts and kdelibs
+dnl Do NOT use in any other module.
+dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde
+AC_DEFUN([KDE_SET_PREFIX_CORE],
+[
+ unset CDPATH
+ dnl make $KDEDIR the default for the installation
+ AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde})
+
+ if test "x$prefix" = "xNONE"; then
+ prefix=$ac_default_prefix
+ ac_configure_args="$ac_configure_args --prefix=$prefix"
+ fi
+ # And delete superfluous '/' to make compares easier
+ prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+ exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+
+ kde_libs_prefix='$(prefix)'
+ kde_libs_htmldir='$(kde_htmldir)'
+ AC_SUBST(kde_libs_prefix)
+ AC_SUBST(kde_libs_htmldir)
+ KDE_FAST_CONFIGURE
+ KDE_CONF_FILES
+])
+
+
+AC_DEFUN([KDE_SET_PREFIX],
+[
+ unset CDPATH
+ dnl We can't give real code to that macro, only a value.
+ dnl It only matters for --help, since we set the prefix in this function anyway.
+ AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix})
+
+ KDE_SET_DEFAULT_BINDIRS
+ if test "x$prefix" = "xNONE"; then
+ dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it
+ KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend)
+ else
+ dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH
+ kde_save_PATH="$PATH"
+ PATH="$exec_prefix/bin:$prefix/bin:$PATH"
+ KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend)
+ PATH="$kde_save_PATH"
+ fi
+
+ kde_libs_prefix=`$KDECONFIG --prefix`
+ if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then
+ AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs.
+ This means it has been moved since you installed it.
+ This won't work. Please recompile kdelibs for the new prefix.
+ ])
+ fi
+ kde_libs_htmldir=`$KDECONFIG --install html --expandvars`
+
+ AC_MSG_CHECKING([where to install])
+ if test "x$prefix" = "xNONE"; then
+ prefix=$kde_libs_prefix
+ AC_MSG_RESULT([$prefix (as returned by kde-config)])
+ else
+ dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different
+ given_prefix=$prefix
+ AC_MSG_RESULT([$prefix (as requested)])
+ fi
+
+ # And delete superfluous '/' to make compares easier
+ prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+ exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+ given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+
+ AC_SUBST(KDECONFIG)
+ AC_SUBST(kde_libs_prefix)
+ AC_SUBST(kde_libs_htmldir)
+
+ KDE_FAST_CONFIGURE
+ KDE_CONF_FILES
+])
+
+pushdef([AC_PROG_INSTALL],
+[
+ dnl our own version, testing for a -p flag
+ popdef([AC_PROG_INSTALL])
+ dnl as AC_PROG_INSTALL works as it works we first have
+ dnl to save if the user didn't specify INSTALL, as the
+ dnl autoconf one overwrites INSTALL and we have no chance to find
+ dnl out afterwards
+ test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL
+ test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM
+ test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT
+ AC_PROG_INSTALL
+
+ if test -z "$kde_save_INSTALL_given" ; then
+ # OK, user hasn't given any INSTALL, autoconf found one for us
+ # now we test, if it supports the -p flag
+ AC_MSG_CHECKING(for -p flag to install)
+ rm -f confinst.$$.* > /dev/null 2>&1
+ echo "Testtest" > confinst.$$.orig
+ ac_res=no
+ if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then
+ if test -f confinst.$$.new ; then
+ # OK, -p seems to do no harm to install
+ INSTALL="${INSTALL} -p"
+ ac_res=yes
+ fi
+ fi
+ rm -f confinst.$$.*
+ AC_MSG_RESULT($ac_res)
+ fi
+ dnl the following tries to resolve some signs and wonders coming up
+ dnl with different autoconf/automake versions
+ dnl e.g.:
+ dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s
+ dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS)
+ dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s
+ dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has
+ dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the
+ dnl install-@DIR@PROGRAMS targets to explicitly use that flag
+ dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as
+ dnl INSTALL_SCRIPT, which breaks with automake <= 1.4
+ dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure
+ dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from
+ dnl automake (due to broken Makefile.am or whatever) to install programs,
+ dnl and so does not see the -s flag in automake > 1.4
+ dnl to clean up that mess we:
+ dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG
+ dnl which cleans KDE's program with automake > 1.4;
+ dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems
+ dnl with automake<=1.4
+ dnl note that dues to this sometimes two '-s' flags are used (if KDE
+ dnl properly uses install-@DIR@PROGRAMS, but I don't care
+ dnl
+ dnl And to all this comes, that I even can't write in comments variable
+ dnl names used by automake, because it is so stupid to think I wanted to
+ dnl _use_ them, therefor I have written A_M_... instead of AM_
+ dnl hmm, I wanted to say something ... ahh yes: Arghhh.
+
+ if test -z "$kde_save_INSTALL_PROGRAM_given" ; then
+ INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)'
+ fi
+ if test -z "$kde_save_INSTALL_SCRIPT_given" ; then
+ INSTALL_SCRIPT='${INSTALL}'
+ fi
+])dnl
+
+AC_DEFUN([KDE_LANG_CPLUSPLUS],
+[AC_LANG_CPLUSPLUS
+ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC'
+pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS])
+])
+
+pushdef([AC_LANG_CPLUSPLUS],
+[popdef([AC_LANG_CPLUSPLUS])
+KDE_LANG_CPLUSPLUS
+])
+
+AC_DEFUN([KDE_CHECK_LONG_LONG],
+[
+AC_MSG_CHECKING(for long long)
+AC_CACHE_VAL(kde_cv_c_long_long,
+[
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_LINK([], [
+ long long foo = 0;
+ foo = foo+1;
+ ],
+ kde_cv_c_long_long=yes, kde_cv_c_long_long=no)
+ AC_LANG_RESTORE
+])
+AC_MSG_RESULT($kde_cv_c_long_long)
+if test "$kde_cv_c_long_long" = yes; then
+ AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype])
+fi
+])
+
+AC_DEFUN([KDE_CHECK_LIB],
+[
+ kde_save_LDFLAGS="$LDFLAGS"
+ dnl AC_CHECK_LIB modifies LIBS, so save it here
+ kde_save_LIBS="$LIBS"
+ LDFLAGS="$LDFLAGS $all_libraries"
+ case $host_os in
+ aix*) LDFLAGS="-brtl $LDFLAGS"
+ test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS"
+ ;;
+ esac
+ AC_CHECK_LIB($1, $2, $3, $4, $5)
+ LDFLAGS="$kde_save_LDFLAGS"
+ LIBS="$kde_save_LIBS"
+])
+
+AC_DEFUN([KDE_JAVA_PREFIX],
+[
+ dir=`dirname "$1"`
+ base=`basename "$1"`
+ list=`ls -1 $dir 2> /dev/null`
+ for entry in $list; do
+ if test -d $dir/$entry/bin; then
+ case $entry in
+ $base)
+ javadirs="$javadirs $dir/$entry/bin"
+ ;;
+ esac
+ elif test -d $dir/$entry/jre/bin; then
+ case $entry in
+ $base)
+ javadirs="$javadirs $dir/$entry/jre/bin"
+ ;;
+ esac
+ fi
+ done
+])
+
+dnl KDE_CHEC_JAVA_DIR(onlyjre)
+AC_DEFUN([KDE_CHECK_JAVA_DIR],
+[
+
+AC_ARG_WITH(java,
+AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]),
+[ ac_java_dir=$withval
+], ac_java_dir=""
+)
+
+AC_MSG_CHECKING([for Java])
+
+dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH
+if test "x$ac_java_dir" = "xno"; then
+ kde_java_bindir=no
+ kde_java_includedir=no
+ kde_java_libjvmdir=no
+ kde_java_libgcjdir=no
+ kde_java_libhpidir=no
+else
+ if test "x$ac_java_dir" = "x"; then
+
+
+ dnl No option set -> collect list of candidate paths
+ if test -n "$JAVA_HOME"; then
+ KDE_JAVA_PREFIX($JAVA_HOME)
+ fi
+ KDE_JAVA_PREFIX(/usr/j2se)
+ KDE_JAVA_PREFIX(/usr/lib/j2se)
+ KDE_JAVA_PREFIX(/usr/j*dk*)
+ KDE_JAVA_PREFIX(/usr/lib/j*dk*)
+ KDE_JAVA_PREFIX(/opt/j*sdk*)
+ KDE_JAVA_PREFIX(/usr/lib/java*)
+ KDE_JAVA_PREFIX(/usr/java*)
+ KDE_JAVA_PREFIX(/usr/java/j*dk*)
+ KDE_JAVA_PREFIX(/usr/java/j*re*)
+ KDE_JAVA_PREFIX(/usr/lib/SunJava2*)
+ KDE_JAVA_PREFIX(/usr/lib/SunJava*)
+ KDE_JAVA_PREFIX(/usr/lib/IBMJava2*)
+ KDE_JAVA_PREFIX(/usr/lib/IBMJava*)
+ KDE_JAVA_PREFIX(/opt/java*)
+
+ kde_cv_path="NONE"
+ kde_save_IFS=$IFS
+ IFS=':'
+ for dir in $PATH; do
+ if test -d "$dir"; then
+ javadirs="$javadirs $dir"
+ fi
+ done
+ IFS=$kde_save_IFS
+ jredirs=
+
+ dnl Now javadirs contains a list of paths that exist, all ending with bin/
+ for dir in $javadirs; do
+ dnl Check for the java executable
+ if test -x "$dir/java"; then
+ sane_path=$(cd $dir; /bin/pwd)
+ dnl And also check for a libjvm.so somewhere under there
+ dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big.
+ if test "$sane_path" != "/usr/bin"; then
+ libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1`
+ if test ! -f $libjvmdir/libjvm.so; then continue; fi
+ jredirs="$jredirs $dir"
+ fi
+ fi
+ done
+
+ dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found
+ JAVAC=
+ JAVA=
+ kde_java_bindir=no
+ for dir in $jredirs; do
+ JAVA="$dir/java"
+ kde_java_bindir=$dir
+ if test -x "$dir/javac"; then
+ JAVAC="$dir/javac"
+ break
+ fi
+ done
+
+ if test -n "$JAVAC"; then
+ dnl this substitution might not work - well, we test for jni.h below
+ kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'`
+ else
+ kde_java_includedir=no
+ fi
+ else
+ dnl config option set
+ kde_java_bindir=$ac_java_dir/bin
+ if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then
+ kde_java_includedir=no
+ else
+ kde_java_includedir=$ac_java_dir/include
+ fi
+ fi
+fi
+
+dnl At this point kde_java_bindir and kde_java_includedir are either set or "no"
+if test "x$kde_java_bindir" != "xno"; then
+
+ dnl Look for libjvm.so
+ kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1`
+ dnl Look for libgcj.so
+ kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1`
+ dnl Look for libhpi.so and avoid green threads
+ kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1`
+
+ dnl Now check everything's fine under there
+ dnl the include dir is our flag for having the JDK
+ if test -d "$kde_java_includedir"; then
+ if test ! -x "$kde_java_bindir/javac"; then
+ AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.])
+ fi
+ if test ! -x "$kde_java_bindir/javah"; then
+ AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.])
+ fi
+ if test ! -x "$kde_java_bindir/jar"; then
+ AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.])
+ fi
+ if test ! -r "$kde_java_includedir/jni.h"; then
+ AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.])
+ fi
+
+ jni_includes="-I$kde_java_includedir"
+ dnl Strange thing, jni.h requires jni_md.h which is under genunix here..
+ dnl and under linux here..
+
+ dnl not needed for gcj
+
+ if test "x$kde_java_libgcjdir" = "x"; then
+ test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux"
+ test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris"
+ test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix"
+ fi
+
+ else
+ JAVAC=
+ jni_includes=
+ fi
+
+ if test "x$kde_java_libgcjdir" = "x"; then
+ if test ! -r "$kde_java_libjvmdir/libjvm.so"; then
+ AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.])
+ fi
+ else
+ if test ! -r "$kde_java_libgcjdir/libgcj.so"; then
+ AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.])
+ fi
+ fi
+
+ if test ! -x "$kde_java_bindir/java"; then
+ AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.])
+ fi
+
+ dnl not needed for gcj compile
+
+ if test "x$kde_java_libgcjdir" = "x"; then
+ if test ! -r "$kde_java_libhpidir/libhpi.so"; then
+ AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.])
+ fi
+ fi
+
+ if test -n "$jni_includes"; then
+ dnl Check for JNI version
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_cxxflags_safe="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $all_includes $jni_includes"
+
+ AC_TRY_COMPILE([
+ #include <jni.h>
+ ],
+ [
+ #ifndef JNI_VERSION_1_2
+ Syntax Error
+ #endif
+ ],[ kde_jni_works=yes ],
+ [ kde_jni_works=no ])
+
+ if test $kde_jni_works = no; then
+ AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h.
+ You need to have Java Development Kit (JDK) version 1.2.
+
+ Use --with-java to specify another location.
+ Use --without-java to configure without java support.
+ Or download a newer JDK and try again.
+ See e.g. http://java.sun.com/products/jdk/1.2 ])
+ fi
+
+ CXXFLAGS="$ac_cxxflags_safe"
+ AC_LANG_RESTORE
+
+ dnl All tests ok, inform and subst the variables
+
+ JAVAC=$kde_java_bindir/javac
+ JAVAH=$kde_java_bindir/javah
+ JAR=$kde_java_bindir/jar
+ AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is])
+ if test "x$kde_java_libgcjdir" = "x"; then
+ JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi"
+ else
+ JVMLIBS="-L$kde_java_libgcjdir -lgcj"
+ fi
+ AC_MSG_RESULT([java JDK in $kde_java_bindir])
+
+ else
+ AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is])
+ AC_MSG_RESULT([java JRE in $kde_java_bindir])
+ fi
+elif test -d "/Library/Java/Home"; then
+ kde_java_bindir="/Library/Java/Home/bin"
+ jni_includes="-I/Library/Java/Home/include"
+
+ JAVAC=$kde_java_bindir/javac
+ JAVAH=$kde_java_bindir/javah
+ JAR=$kde_java_bindir/jar
+ JVMLIBS="-Wl,-framework,JavaVM"
+
+ AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is])
+ AC_MSG_RESULT([Apple Java Framework])
+else
+ AC_MSG_RESULT([none found])
+fi
+
+AC_SUBST(JAVAC)
+AC_SUBST(JAVAH)
+AC_SUBST(JAR)
+AC_SUBST(JVMLIBS)
+AC_SUBST(jni_includes)
+
+# for backward compat
+kde_cv_java_includedir=$kde_java_includedir
+kde_cv_java_bindir=$kde_java_bindir
+])
+
+dnl this is a redefinition of autoconf 2.5x's AC_FOREACH.
+dnl When the argument list becomes big, as in KDE for AC_OUTPUT in
+dnl big packages, m4_foreach is dog-slow. So use our own version of
+dnl it. (matz@kde.org)
+m4_define([mm_foreach],
+[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])])
+m4_define([mm_car], [[$1]])
+m4_define([mm_car2], [[$@]])
+m4_define([_mm_foreach],
+[m4_if(m4_quote($2), [], [],
+ [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1],
+ mm_car2(m4_shift($2)),
+ [$3])])])
+m4_define([AC_FOREACH],
+[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])])
+
+AC_DEFUN([KDE_NEED_FLEX],
+[
+kde_libs_safe=$LIBS
+LIBS="$LIBS $USER_LDFLAGS"
+AM_PROG_LEX
+LIBS=$kde_libs_safe
+if test -z "$LEXLIB"; then
+ AC_MSG_ERROR([You need to have flex installed.])
+fi
+AC_SUBST(LEXLIB)
+])
+
+AC_DEFUN([AC_PATH_QTOPIA],
+[
+ dnl TODO: use AC_CACHE_VAL
+
+ if test -z "$1"; then
+ qtopia_minver_maj=1
+ qtopia_minver_min=5
+ qtopia_minver_pat=0
+ else
+ qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"`
+ qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"`
+ qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"`
+ fi
+
+ qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat"
+ qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat"
+
+ AC_REQUIRE([AC_PATH_QT])
+
+ AC_MSG_CHECKING([for Qtopia])
+
+ LIB_QTOPIA="-lqpe"
+ AC_SUBST(LIB_QTOPIA)
+
+ kde_qtopia_dirs="$QPEDIR /opt/Qtopia"
+
+ ac_qtopia_incdir=NO
+
+ AC_ARG_WITH(qtopia-dir,
+ AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]),
+ [ ac_qtopia_incdir="$withval"/include] )
+
+ qtopia_incdirs=""
+ for dir in $kde_qtopia_dirs; do
+ qtopia_incdirs="$qtopia_incdirs $dir/include"
+ done
+
+ if test ! "$ac_qtopia_incdir" = "NO"; then
+ qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs"
+ fi
+
+ qtopia_incdir=""
+ AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir)
+ ac_qtopia_incdir="$qtopia_incdir"
+
+ if test -z "$qtopia_incdir"; then
+ AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.])
+ fi
+
+ qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`;
+ qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`;
+ qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`;
+
+ qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat"
+ qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat"
+ if test "$qtopia_ver" -lt "$qtopia_minver"; then
+ AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr
+is required.])
+ fi
+
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ ac_cxxflags_safe="$CXXFLAGS"
+ ac_ldflags_safe="$LDFLAGS"
+ ac_libs_safe="$LIBS"
+
+ CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes"
+ LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS"
+ LIBS="$LIBS $LIB_QTOPIA $LIBQT"
+
+ cat > conftest.$ac_ext <<EOF
+#include "confdefs.h"
+#include <qpe/qpeapplication.h>
+#include <qpe/version.h>
+
+int main( int argc, char **argv )
+{
+ QPEApplication app( argc, argv );
+ return 0;
+}
+EOF
+
+ if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ rm -f conftest*
+ else
+ rm -f conftest*
+ AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at
+the end of config.log])
+ fi
+
+ CXXFLAGS="$ac_cxxflags_safe"
+ LDFLAGS="$ac_ldflags_safe"
+ LIBS="$ac_libs_safe"
+
+ AC_LANG_RESTORE
+
+ QTOPIA_INCLUDES="-I$qtopia_incdir"
+ AC_SUBST(QTOPIA_INCLUDES)
+
+ AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir])
+])
+
+
+AC_DEFUN([KDE_INIT_DOXYGEN],
+[
+AC_MSG_CHECKING([for Qt docs])
+kde_qtdir=
+if test "${with_qt_dir+set}" = set; then
+ kde_qtdir="$with_qt_dir"
+fi
+
+AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR)
+AC_MSG_RESULT($QTDOCDIR)
+
+AC_SUBST(QTDOCDIR)
+
+KDE_FIND_PATH(dot, DOT, [], [])
+if test -n "$DOT"; then
+ KDE_HAVE_DOT="YES"
+else
+ KDE_HAVE_DOT="NO"
+fi
+AC_SUBST(KDE_HAVE_DOT)
+KDE_FIND_PATH(doxygen, DOXYGEN, [], [])
+AC_SUBST(DOXYGEN)
+
+DOXYGEN_PROJECT_NAME="$1"
+DOXYGEN_PROJECT_NUMBER="$2"
+AC_SUBST(DOXYGEN_PROJECT_NAME)
+AC_SUBST(DOXYGEN_PROJECT_NUMBER)
+
+KDE_HAS_DOXYGEN=no
+if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then
+ KDE_HAS_DOXYGEN=yes
+fi
+AC_SUBST(KDE_HAS_DOXYGEN)
+
+])
+
+
+AC_DEFUN([AC_FIND_BZIP2],
+[
+AC_MSG_CHECKING([for bzDecompress in libbz2])
+AC_CACHE_VAL(ac_cv_lib_bzip2,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+kde_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET"
+kde_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(dnl
+[
+#define BZ_NO_STDIO
+#include<bzlib.h>
+],
+ [ bz_stream s; (void) bzDecompress(&s); ],
+ eval "ac_cv_lib_bzip2='-lbz2'",
+ eval "ac_cv_lib_bzip2=no")
+LIBS="$kde_save_LIBS"
+CXXFLAGS="$kde_save_CXXFLAGS"
+AC_LANG_RESTORE
+])dnl
+AC_MSG_RESULT($ac_cv_lib_bzip2)
+
+if test ! "$ac_cv_lib_bzip2" = no; then
+ BZIP2DIR=bzip2
+
+ LIBBZ2="$ac_cv_lib_bzip2"
+ AC_SUBST(LIBBZ2)
+
+else
+
+ cxx_shared_flag=
+ ld_shared_flag=
+ KDE_CHECK_COMPILER_FLAG(shared, [
+ ld_shared_flag="-shared"
+ ])
+ KDE_CHECK_COMPILER_FLAG(fPIC, [
+ cxx_shared_flag="-fPIC"
+ ])
+
+ AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2])
+ AC_CACHE_VAL(ac_cv_lib_bzip2_prefix,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ kde_save_LIBS="$LIBS"
+ LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET"
+ kde_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES"
+
+ AC_TRY_LINK(dnl
+ [
+ #define BZ_NO_STDIO
+ #include<bzlib.h>
+ ],
+ [ bz_stream s; (void) BZ2_bzDecompress(&s); ],
+ eval "ac_cv_lib_bzip2_prefix='-lbz2'",
+ eval "ac_cv_lib_bzip2_prefix=no")
+ LIBS="$kde_save_LIBS"
+ CXXFLAGS="$kde_save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])dnl
+
+ AC_MSG_RESULT($ac_cv_lib_bzip2_prefix)
+
+ if test ! "$ac_cv_lib_bzip2_prefix" = no; then
+ BZIP2DIR=bzip2
+
+ LIBBZ2="$ac_cv_lib_bzip2_prefix"
+ AC_SUBST(LIBBZ2)
+
+ AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix])
+ dnl else, we just ignore this
+ fi
+
+fi
+AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR")
+])
+
+dnl ------------------------------------------------------------------------
+dnl Try to find the SSL headers and libraries.
+dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed)
+dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([KDE_CHECK_SSL],
+[
+LIBSSL="-lssl -lcrypto"
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+ac_ssl_includes=NO ac_ssl_libraries=NO
+ssl_libraries=""
+ssl_includes=""
+AC_ARG_WITH(ssl-dir,
+ AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]),
+ [ ac_ssl_includes="$withval"/include
+ ac_ssl_libraries="$withval"/lib$kdelibsuff
+ ])
+
+want_ssl=yes
+AC_ARG_WITH(ssl,
+ AC_HELP_STRING([--without-ssl],[disable SSL checks]),
+ [want_ssl=$withval])
+
+if test $want_ssl = yes; then
+
+AC_MSG_CHECKING(for OpenSSL)
+
+AC_CACHE_VAL(ac_cv_have_ssl,
+[#try to guess OpenSSL locations
+
+ ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes"
+ ssl_incdirs="$ac_ssl_includes $ssl_incdirs"
+ AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir)
+ ac_ssl_includes="$ssl_incdir"
+
+ ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs"
+ if test ! "$ac_ssl_libraries" = "NO"; then
+ ssl_libdirs="$ac_ssl_libraries $ssl_libdirs"
+ fi
+
+ test=NONE
+ ssl_libdir=NONE
+ for dir in $ssl_libdirs; do
+ try="ls -1 $dir/libssl*"
+ if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi
+ done
+
+ ac_ssl_libraries="$ssl_libdir"
+
+ ac_ldflags_safe="$LDFLAGS"
+ ac_libs_safe="$LIBS"
+
+ LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries"
+ LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref"
+
+ AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();,
+ ac_ssl_rsaref="yes"
+ ,
+ ac_ssl_rsaref="no"
+ )
+
+ LDFLAGS="$ac_ldflags_safe"
+ LIBS="$ac_libs_safe"
+
+ if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then
+ have_ssl=no
+ else
+ have_ssl=yes;
+ fi
+
+ ])
+
+ eval "$ac_cv_have_ssl"
+
+ AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes])
+
+ AC_MSG_CHECKING([whether OpenSSL uses rsaref])
+ AC_MSG_RESULT($ac_ssl_rsaref)
+
+ AC_MSG_CHECKING([for easter eggs])
+ AC_MSG_RESULT([none found])
+
+else
+ have_ssl=no
+fi
+
+if test "$have_ssl" = yes; then
+ AC_MSG_CHECKING(for OpenSSL version)
+ dnl Check for SSL version
+ AC_CACHE_VAL(ac_cv_ssl_version,
+ [
+
+ cat >conftest.$ac_ext <<EOF
+#include <openssl/opensslv.h>
+#include <stdio.h>
+ int main() {
+
+#ifndef OPENSSL_VERSION_NUMBER
+ printf("ssl_version=\\"error\\"\n");
+#else
+ if (OPENSSL_VERSION_NUMBER < 0x00906000)
+ printf("ssl_version=\\"old\\"\n");
+ else
+ printf("ssl_version=\\"ok\\"\n");
+#endif
+ return (0);
+ }
+EOF
+
+ ac_save_CPPFLAGS=$CPPFLAGS
+ if test "$ac_ssl_includes" != "/usr/include"; then
+ CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes"
+ fi
+
+ if AC_TRY_EVAL(ac_link); then
+
+ if eval `./conftest 2>&5`; then
+ if test $ssl_version = error; then
+ AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !])
+ else
+ if test $ssl_version = old; then
+ AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.])
+ have_ssl=no
+ fi
+ fi
+ ac_cv_ssl_version="ssl_version=$ssl_version"
+ else
+ AC_MSG_ERROR([Your system couldn't run a small SSL test program.
+ Check config.log, and if you can't figure it out, send a mail to
+ David Faure <faure@kde.org>, attaching your config.log])
+ fi
+
+ else
+ AC_MSG_ERROR([Your system couldn't link a small SSL test program.
+ Check config.log, and if you can't figure it out, send a mail to
+ David Faure <faure@kde.org>, attaching your config.log])
+ fi
+ CPPFLAGS=$ac_save_CPPFLAGS
+
+ ])
+
+ eval "$ac_cv_ssl_version"
+ AC_MSG_RESULT($ssl_version)
+fi
+
+if test "$have_ssl" != yes; then
+ LIBSSL="";
+else
+ AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL])
+ ac_cv_have_ssl="have_ssl=yes \
+ ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref"
+
+
+ ssl_libraries="$ac_ssl_libraries"
+ ssl_includes="$ac_ssl_includes"
+
+ if test "$ac_ssl_rsaref" = yes; then
+ LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref"
+ fi
+
+ if test $ssl_version = "old"; then
+ AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6])
+ fi
+fi
+
+SSL_INCLUDES=
+
+if test "$ssl_includes" = "/usr/include"; then
+ if test -f /usr/kerberos/include/krb5.h; then
+ SSL_INCLUDES="-I/usr/kerberos/include"
+ fi
+elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then
+ SSL_INCLUDES="-I$ssl_includes"
+fi
+
+if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then
+ SSL_LDFLAGS=""
+else
+ SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries"
+fi
+
+AC_SUBST(SSL_INCLUDES)
+AC_SUBST(SSL_LDFLAGS)
+AC_SUBST(LIBSSL)
+])
+
+AC_DEFUN([KDE_CHECK_STRLCPY],
+[
+ AC_REQUIRE([AC_CHECK_STRLCAT])
+ AC_REQUIRE([AC_CHECK_STRLCPY])
+ AC_CHECK_SIZEOF(size_t)
+ AC_CHECK_SIZEOF(unsigned long)
+
+ AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long])
+ AC_TRY_COMPILE(,[
+ #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG
+ choke me
+ #endif
+ ],AC_MSG_RESULT([yes]),[
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([
+ Apparently on your system our assumption sizeof size_t == sizeof unsigned long
+ does not apply. Please mail kde-devel@kde.org with a description of your system!
+ ])
+ ])
+])
+
+AC_DEFUN([KDE_CHECK_BINUTILS],
+[
+ AC_MSG_CHECKING([if ld supports unversioned version maps])
+
+ kde_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
+ echo "{ local: extern \"C++\" { foo }; };" > conftest.map
+ AC_TRY_LINK([int foo;],
+[
+#ifdef __INTEL_COMPILER
+icc apparently does not support libtools version-info and version-script
+at the same time. Dunno where the bug is, but until somebody figured out,
+better disable the optional version scripts.
+#endif
+
+ foo = 42;
+], kde_supports_versionmaps=yes, kde_supports_versionmaps=no)
+ LDFLAGS="$kde_save_LDFLAGS"
+ rm -f conftest.map
+ AM_CONDITIONAL(include_VERSION_SCRIPT,
+ [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"])
+
+ AC_MSG_RESULT($kde_supports_versionmaps)
+])
+
+AC_DEFUN([AM_PROG_OBJC],[
+AC_CHECK_PROGS(OBJC, gcc, gcc)
+test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH])
+if test "x${OBJCFLAGS-unset}" = xunset; then
+ OBJCFLAGS="-g -O2"
+fi
+AC_SUBST(OBJCFLAGS)
+_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)])
+])
+
+AC_DEFUN([KDE_CHECK_PERL],
+[
+ KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [
+ AC_MSG_ERROR([No Perl found in your $PATH.
+We need perl to generate some code.])
+ ])
+ AC_SUBST(PERL)
+])
+
+AC_DEFUN([KDE_CHECK_LARGEFILE],
+[
+AC_SYS_LARGEFILE
+if test "$ac_cv_sys_file_offset_bits" != no; then
+ CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+fi
+
+if test "x$ac_cv_sys_large_files" != "xno"; then
+ CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1"
+fi
+
+])
+
+dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in)
+dnl which allows to search for libs that get installed into the KDE prefix.
+dnl
+dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not)
+dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page
+dnl also defines KSTUFF_PKG_ERRORS on error
+AC_DEFUN([KDE_PKG_CHECK_MODULES], [
+
+ PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH"
+ if test "$prefix" != "$kde_libs_prefix"; then
+ PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH"
+ fi
+ export PKG_CONFIG_PATH
+ PKG_CHECK_MODULES([$1],[$2],[$3],[$4])
+])
+
+
+dnl Check for PIE support in the compiler and linker
+AC_DEFUN([KDE_CHECK_PIE_SUPPORT],
+[
+ AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ safe_CXXFLAGS=$CXXFLAGS
+ safe_LDFLAGS=$LDFLAGS
+ CXXFLAGS="$CXXFLAGS -fPIE"
+ LDFLAGS="$LDFLAGS -pie"
+
+ AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no])
+
+ CXXFLAGS=$safe_CXXFLAGS
+ LDFLAGS=$safe_LDFLAGS
+ AC_LANG_RESTORE
+ ])
+
+ AC_MSG_CHECKING(if enabling -pie/fPIE support)
+
+ AC_ARG_ENABLE(pie,
+ AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]),
+ [kde_has_pie_support=$enableval],
+ [kde_has_pie_support=detect])
+
+ if test "$kde_has_pie_support" = "detect"; then
+ kde_has_pie_support=$kde_cv_val_pie_support
+ fi
+
+ AC_MSG_RESULT([$kde_has_pie_support])
+
+ KDE_USE_FPIE=""
+ KDE_USE_PIE=""
+
+ AC_SUBST([KDE_USE_FPIE])
+ AC_SUBST([KDE_USE_PIE])
+
+ if test "$kde_has_pie_support" = "yes"; then
+ KDE_USE_FPIE="-fPIE"
+ KDE_USE_PIE="-pie"
+ fi
+])
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+## Copyright 1996, 1997, 1998, 1999, 2000, 2001
+## Free Software Foundation, Inc.
+## Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+##
+## 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.
+##
+## As a special exception to the GNU General Public License, if you
+## distribute this file as part of a program that contains a
+## configuration script generated by Autoconf, you may include it under
+## the same distribution terms that you use for the rest of that program.
+
+# serial 47 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool --silent'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except M$VC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
+ ;;
+ *)
+ old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string="`eval $cmd`") 2>/dev/null &&
+ echo_test_string="`eval $cmd`" &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LINUX_64_MODE="32"
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ LINUX_64_MODE="64"
+ case $host in
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s conftest.err; then
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ printf "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ else
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ testring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ *)
+ # If test is not a shell built-in, we'll probably end up computing a
+ # maximum length that is only half of the actual maximum length, but
+ # we can't tell.
+ while (test "X"`$CONFIG_SHELL [$]0 --fallback-echo "X$testring" 2>/dev/null` \
+ = "XX$testring") >/dev/null 2>&1 &&
+ new_result=`expr "X$testring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ testring=$testring$testring
+ done
+ testring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ ;;
+ esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# --------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+
+ exit (status);
+}]
+EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_unknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# -------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ LDFLAGS="$LDFLAGS $link_static_flag"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ # According to Tom Tromey, Ian Lance Taylor reported there are C compilers
+ # that will create temporary files in the current directory regardless of
+ # the output directory. Thus, making CWD read-only will cause this test
+ # to fail, enabling locking or at least warning the user not to do parallel
+ # builds.
+ chmod -w .
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test ! -s out/conftest.err; then
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w .
+ $rm conftest* out/*
+ rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)"="Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi4*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext='$(test .$module = .yes && echo .so || echo .dylib)'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='GNU ld.so'
+ ;;
+
+freebsd*)
+ objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[01]* | freebsdelf3.[01]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ *) # from 3.2 on
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case "$host_cpu" in
+ ia64*)
+ shrext='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ libsuff=
+ if test "x$LINUX_64_MODE" = x64; then
+ # Some platforms are per default 64-bit, so there's no /lib64
+ if test -d /lib64 -a ! -h /lib64; then
+ libsuff=64
+ fi
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}"
+ sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[[89]] | openbsd2.[[89]].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+ [include additional configurations @<:@automatic@:>@])],
+ [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ AC_MSG_WARN([output file `$ofile' does not exist])
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+ else
+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+ fi
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+ "") ;;
+ *) AC_MSG_ERROR([invalid tag name: $tagname])
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ AC_MSG_ERROR([tag name \"$tagname\" already exists])
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && test "X$CXX" != "Xno"; then
+ AC_LIBTOOL_LANG_CXX_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ AC_LIBTOOL_LANG_F77_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ AC_LIBTOOL_LANG_GCJ_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+ AC_LIBTOOL_LANG_RC_CONFIG
+ ;;
+
+ *)
+ AC_MSG_ERROR([Unsupported tag name: $tagname])
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ AC_MSG_ERROR([unable to update list of available tagged configurations.])
+ fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 dll's
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+#- set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="ifelse([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$1; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+ [AC_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi4*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+mingw* | pw32*)
+ # win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='win32_libid'
+ ;;
+
+darwin* | rhapsody*)
+ # this will be overwritten by pass_all, but leave it in just in case
+ lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ lt_cv_file_magic_test_file=`/System/Library/Frameworks/System.framework/System`
+ ;;
+ *) # Darwin 1.3 on
+ lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
+ ;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case "$host_cpu" in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ irix5* | nonstopux*)
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
+ ;;
+ *)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1"
+ ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux*)
+ case $host_cpu in
+ alpha* | hppa* | i*86 | ia64* | m68* | mips* | powerpc* | sparc* | s390* | sh* | x86_64* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ # the debian people say, arm and glibc 2.3.1 works for them with pass_all
+ arm* )
+ lt_cv_deplibs_check_method=pass_all ;;
+ *)
+ # glibc up to 2.1.1 does not perform some relocations on ARM
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;;
+ esac
+ lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
+ ;;
+
+netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object'
+ else
+ lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ # this will be overridden with pass_all, but let us keep it just in case
+ lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sco3.2v5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+
+sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/${ac_tool_prefix}nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM="-lm")
+ ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
+# DIRECTORY is not provided, it is assumed to be `libltdl'. LIBLTDL will
+# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and
+# top_srcdir appropriately in the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that LIBLTDL
+# and LTDLINCL are not AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If
+# DIRECTORY is not provided and an installed libltdl is not found, it is
+# assumed to be `libltdl'. LIBLTDL will be prefixed with '${top_builddir}/'
+# and LTDLINCL will be prefixed with '${top_srcdir}/' (note the single
+# quotes!). If your package is not flat and you're not using automake,
+# define top_builddir and top_srcdir appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+ fi
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# --------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+#
+# Check for any special shared library compilation flags.
+#
+_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)=
+if test "$GCC" = no; then
+ case $host_os in
+ sco3.2v5*)
+ _LT_AC_TAGVAR(lt_prog_cc_shlib, $1)='-belf'
+ ;;
+ esac
+fi
+if test -n "$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)"; then
+ AC_MSG_WARN([`$CC' requires `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to build shared libraries])
+ if echo "$old_CC $old_CFLAGS " | grep "[[ ]]$]_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)[[[ ]]" >/dev/null; then :
+ else
+ AC_MSG_WARN([add `$_LT_AC_TAGVAR(lt_prog_cc_shlib, $1)' to the CC or CFLAGS env variable and reconfigure])
+ _LT_AC_TAGVAR(lt_cv_prog_cc_can_build_shared, $1)=no
+ fi
+fi
+
+
+#
+# Check to make sure the static flag actually works.
+#
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $_LT_AC_TAGVAR(lt_prog_compiler_static, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+ $_LT_AC_TAGVAR(lt_prog_compiler_static, $1),
+ [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+# Report which librarie types wil actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cc
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ AC_PROG_LD
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # KDE requires run time linking. Make it the default.
+ aix_use_runtimelinking=yes
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='-qmkshrobj ${wl}-G'
+ else
+ shared_flag='-qmkshrobj'
+ fi
+ fi
+ fi
+
+ # Let the compiler handle the export list.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=no
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs'
+
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ freebsd[12]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ freebsd-elf*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ freebsd* | kfreebsd*-gnu)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | egrep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case "$host_cpu" in
+ hppa*64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC)
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case "$host_cpu" in
+ ia64*|hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $linker_flags $libobjs $deplibs'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC)
+ # SGI C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc)
+ # Intel C++
+ with_gnu_ld=yes
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ cxx)
+ # Compaq C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry $objdir/so_locations -o $lib~
+ $rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ sco*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case $cc_basename in
+ CC)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -nolib -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} -nolib ${wl}-M ${wl}$lib.exp -h$soname -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep "\-[[LR]]"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $compiler_flags $predep_objects $libobjs $deplibs $postdep_objects~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ fi
+ ;;
+ esac
+ ;;
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library. It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd="`$echo \"X$output_verbose_link_cmd\" | $Xsed -e \"$no_glob_subst\"`"
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+ _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext|*.$libext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+ _LT_AC_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+ _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+cc_basename=`$echo X"$compiler" | $Xsed -e 's%^.*/%%'`
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix4*)
+ test "$enable_shared" = yes && enable_static=no
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars. Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC NM SED SHELL \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ _LT_AC_TAGVAR(compiler, $1) \
+ _LT_AC_TAGVAR(CC, $1) \
+ _LT_AC_TAGVAR(LD, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+ _LT_AC_TAGVAR(old_archive_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+ _LT_AC_TAGVAR(predep_objects, $1) \
+ _LT_AC_TAGVAR(postdep_objects, $1) \
+ _LT_AC_TAGVAR(predeps, $1) \
+ _LT_AC_TAGVAR(postdeps, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+ _LT_AC_TAGVAR(archive_cmds, $1) \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(postinstall_cmds, $1) \
+ _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+ _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+ _LT_AC_TAGVAR(no_undefined_flag, $1) \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+ _LT_AC_TAGVAR(hardcode_automatic, $1) \
+ _LT_AC_TAGVAR(module_cmds, $1) \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+ _LT_AC_TAGVAR(exclude_expsyms, $1) \
+ _LT_AC_TAGVAR(include_expsyms, $1); do
+
+ case $var in
+ _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(module_cmds, $1) | \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\[$]0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+ ;;
+ esac
+
+ifelse([$1], [],
+ [cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ AC_MSG_NOTICE([creating $ofile])],
+ [cfgfile="$ofile"])
+
+ cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext='$shrext'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation ?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+])
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ test -f Makefile && make "$ltmain"
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \2\3 \3'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+irix* | nonstopux*)
+ symcode='[[BCDEGRST]]'
+ ;;
+osf*)
+ symcode='[[BCDEGQRST]]'
+ ;;
+solaris* | sysv5*)
+ symcode='[[BDT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGISTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="${ac_cv_prog_cc_wl}-a ${ac_cv_prog_cc_wl}archive"
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC)
+ # KAI C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ icpc)
+ # Intel C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ cxx)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC)
+ # Rational C++ 2.4.1
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx)
+ # Digital/Compaq C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ sco*)
+ case $cc_basename in
+ CC)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC)
+ # Sun C++ 4.x
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc)
+ # Lucid
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC)
+ # NonStop-UX NCC 3.20
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ unixware*)
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+
+ mingw* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ linux*)
+ case $CC in
+ icc* | ecc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ ccc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-dn'
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case "$host_os" in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+],[
+ runpath_var=
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)=
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+ _LT_AC_TAGVAR(module_cmds, $1)=
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_AC_TAGVAR(include_expsyms, $1)=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=no
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGS]] /s/.* \([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $compiler_flags $libobjs $deplibs -o $output_objdir/$soname ${wl}--image-base=0x10000000 ${wl}--out-implib,$lib'
+ else
+ ld_shlibs=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris* | sysv5*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = yes; then
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ if test "$GCC" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+
+ # KDE requires run time linking. Make it the default.
+ aix_use_runtimelinking=yes
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[012]|aix4.[012].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ esac
+ shared_flag='-shared'
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='-qmkshrobj ${wl}-G'
+ else
+ shared_flag='-qmkshrobj'
+ fi
+ fi
+ fi
+
+ # Let the compiler handle the export list.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_AC_TAGVAR(archive_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '" $shared_flag"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # -bexpall does not export symbols beginning with underscore (_)
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds it's shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $compiler_flags $libobjs $deplibs ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ # see comment about different semantics on the GNU ld section
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ bsdi4*)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=no
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $compiler_flags $libobjs `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ darwin* | rhapsody*)
+ if test "$GXX" = yes ; then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ case "$host_os" in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-flat_namespace -Wl,-undefined -Wl,suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-Wl,-undefined -Wl,dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | grep 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC ${wl}-bind_at_load $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin ld's
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $compiler_flags $libobjs $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r ${wl}-bind_at_load -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $compiler_flags $deplibs -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $compiler_flags $libobjs $deplibs~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-all_load $convenience'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ dgux*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ freebsd1*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $compiler_flags $libobjs $deplibs'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $compiler_flags $libobjs $deplibs~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10* | hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $compiler_flags $libobjs $deplibs'
+ ;;
+ esac
+ else
+ case "$host_cpu" in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $compiler_flags $libobjs $deplibs'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $compiler_flags $libobjs $deplibs$output_objdir/$libname.def'
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $compiler_flags $libobjs $deplibs ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ sco3.2v5*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs~$rm $lib.exp'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *) # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $compiler_flags $libobjs $deplibs'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4.2uw2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ hardcode_runpath_var=yes
+ runpath_var=LD_RUN_PATH
+ ;;
+
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[[78]]* | unixware7*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z ${wl}text'
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h ${wl}$soname -o $lib $compiler_flags $libobjs $deplibs'
+ fi
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv5*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ # $CC -shared without GNU ld will not create a library from C++
+ # object files and a static libstdc++, better avoid it by now
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_AC_TAGVAR(archive_cmds, $1) in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+ ;;
+ esac
+ fi
+ ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+############################################################
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_SED. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+############################################################
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && break
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+])
+SED=$lt_cv_path_SED
+AC_MSG_RESULT([$SED])
+])
+
+dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
+dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
+dnl also defines GSTUFF_PKG_ERRORS on error
+AC_DEFUN([PKG_CHECK_MODULES], [
+ succeeded=no
+
+ if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+ fi
+
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** The pkg-config script could not be found. Make sure it is"
+ echo "*** in your path, or set the PKG_CONFIG environment variable"
+ echo "*** to the full path to pkg-config."
+ echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
+ else
+ PKG_CONFIG_MIN_VERSION=0.9.0
+ if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
+ AC_MSG_CHECKING(for $2)
+
+ if $PKG_CONFIG --exists "$2" ; then
+ AC_MSG_RESULT(yes)
+ succeeded=yes
+
+ AC_MSG_CHECKING($1_CFLAGS)
+ $1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
+ AC_MSG_RESULT($$1_CFLAGS)
+
+ AC_MSG_CHECKING($1_LIBS)
+ $1_LIBS=`$PKG_CONFIG --libs "$2"`
+ AC_MSG_RESULT($$1_LIBS)
+ else
+ $1_CFLAGS=""
+ $1_LIBS=""
+ ## If we have a custom action on failure, don't print errors, but
+ ## do set a variable so people can do so.
+ $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+ ifelse([$4], ,echo $$1_PKG_ERRORS,)
+ fi
+
+ AC_SUBST($1_CFLAGS)
+ AC_SUBST($1_LIBS)
+ else
+ echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
+ echo "*** See http://www.freedesktop.org/software/pkgconfig"
+ fi
+ fi
+
+ if test $succeeded = yes; then
+ ifelse([$3], , :, [$3])
+ else
+ ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
+ fi
+])
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..51718e4
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,1033 @@
+# generated automatically by aclocal 1.10 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_if(m4_PACKAGE_VERSION, [2.61],,
+[m4_fatal([this file was generated for autoconf 2.61.
+You have another version of autoconf. If you want to use that,
+you should regenerate the build system entirely.], [63])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+#
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
+
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists. Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test -n "$PKG_CONFIG"; then
+ if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ else
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+ [pkg_failed=yes])
+ fi
+else
+ pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+ [AC_MSG_RESULT([no])
+ $4])
+elif test $pkg_failed = untried; then
+ ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+ [$4])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
+
+# Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.10'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.10], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.10])dnl
+_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], UPC, [depcc="$UPC" am_compiler_list=],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # Grep'ing the whole file is not good either: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.60])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES(OBJC)],
+ [define([AC_PROG_OBJC],
+ defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+ [[\\/$]]* | ?:[[\\/]]*) ;;
+ */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([acinclude.m4])
diff --git a/apps/Makefile.am b/apps/Makefile.am
new file mode 100644
index 0000000..09a6602
--- /dev/null
+++ b/apps/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = ktorrent ktcachecheck kttorinfo ktupnptest
diff --git a/apps/ktcachecheck/Makefile.am b/apps/ktcachecheck/Makefile.am
new file mode 100644
index 0000000..19f89d4
--- /dev/null
+++ b/apps/ktcachecheck/Makefile.am
@@ -0,0 +1,12 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+
+bin_PROGRAMS = ktcachecheck
+
+ktcachecheck_SOURCES = cachecheck.cpp cachechecker.cpp singlecachechecker.cpp \
+ multicachechecker.cpp
+ktcachecheck_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+ktcachecheck_LDADD = $(LIB_KPARTS) ../../libktorrent/libktorrent.la \
+ $(LIB_KFILE) $(LIB_KIO)
+noinst_HEADERS = cachechecker.h singlecachechecker.h multicachechecker.h
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/apps/ktcachecheck/cachecheck.cpp b/apps/ktcachecheck/cachecheck.cpp
new file mode 100644
index 0000000..0a143c5
--- /dev/null
+++ b/apps/ktcachecheck/cachecheck.cpp
@@ -0,0 +1,102 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <iostream>
+#include <stdlib.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include "singlecachechecker.h"
+#include "multicachechecker.h"
+
+
+using namespace bt;
+using namespace ktdebug;
+
+void Help()
+{
+ Out() << "Usage : cachecheck <directory_containing_cache>" << endl;
+ Out() << "OR cachecheck <torrent> <cache_file_or_dir> <index_file>" << endl;
+ exit(0);
+}
+
+int main(int argc,char** argv)
+{
+ Globals::instance().setDebugMode(true);
+ Globals::instance().initLog("cachecheck.log");
+ CacheChecker* cc = 0;
+ try
+ {
+ Torrent tor;
+ QString tor_file,cache,index;
+
+ if (argc == 2)
+ {
+ QString cache_dir = argv[1];
+ if (!cache_dir.endsWith(bt::DirSeparator()))
+ cache_dir += bt::DirSeparator();
+
+ tor_file = cache_dir + "torrent";
+ cache = cache_dir + "cache";
+ index = cache_dir + "index";
+ }
+ else if (argc == 4)
+ {
+ tor_file = argv[1];
+ cache = argv[2];
+ index = argv[3];
+ }
+ else
+ {
+ Help();
+ }
+
+
+ Out() << "Loading torrent : " << tor_file << " ... " << endl;
+ tor.load(tor_file,false);
+ if (tor.isMultiFile())
+ cc = new MultiCacheChecker(tor);
+ else
+ cc = new SingleCacheChecker(tor);
+
+ cc->check(cache,index);
+ if (cc->foundFailedChunks())
+ {
+ std::string str;
+ std::cout << "Found failed chunks, fix index file ? (y/n) ";
+ std::cin >> str;
+ if (str == "y" || str == "Y")
+ {
+ Out() << "Fixing index file ..." << endl;
+ cc->fixIndex();
+ Out() << "Finished !" << endl;
+ }
+ }
+ }
+ catch (Error & e)
+ {
+ Out() << "Error : " << e.toString() << endl;
+ }
+
+ delete cc;
+ Globals::cleanup();
+ return 0;
+}
diff --git a/apps/ktcachecheck/cachechecker.cpp b/apps/ktcachecheck/cachechecker.cpp
new file mode 100644
index 0000000..6cdf3e5
--- /dev/null
+++ b/apps/ktcachecheck/cachechecker.cpp
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <util/log.h>
+#include <util/file.h>
+#include <util/error.h>
+#include <util/array.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include <torrent/chunkmanager.h>
+#include "cachechecker.h"
+
+using namespace bt;
+
+namespace ktdebug
+{
+
+ CacheChecker::CacheChecker(bt::Torrent & tor) : tor(tor)
+ {}
+
+
+ CacheChecker::~CacheChecker()
+ {}
+
+ void CacheChecker::loadIndex(const QString & index_file)
+ {
+ this->index_file = index_file;
+ File fptr;
+ if (!fptr.open(index_file,"rb"))
+ throw Error(i18n("Cannot open index file %1 : %2").arg(index_file).arg(fptr.errorString()));
+
+ if (fptr.seek(File::END,0) != 0)
+ {
+ fptr.seek(File::BEGIN,0);
+
+ while (!fptr.eof())
+ {
+ NewChunkHeader hdr;
+ fptr.read(&hdr,sizeof(NewChunkHeader));
+ downloaded_chunks.insert(hdr.index);
+ }
+ }
+ }
+
+ struct ChunkHeader
+ {
+ unsigned int index; // the Chunks index
+ unsigned int deprecated; // offset in cache file
+ };
+
+
+ void CacheChecker::fixIndex()
+ {
+ if (failed_chunks.size() == 0 && extra_chunks.size() == 0)
+ return;
+
+ File fptr;
+ if (!fptr.open(index_file,"wb"))
+ throw Error(i18n("Cannot open index file %1 : %2").arg(index_file).arg(fptr.errorString()));
+
+ std::set<bt::Uint32>::iterator i;
+ // first remove failed chunks from downloaded
+ if (failed_chunks.size() > 0)
+ {
+ i = failed_chunks.begin();
+ while (i != failed_chunks.end())
+ {
+ downloaded_chunks.erase(*i);
+ i++;
+ }
+ }
+
+ // add extra chunks to download
+ if (extra_chunks.size() > 0)
+ {
+ i = extra_chunks.begin();
+ while (i != extra_chunks.end())
+ {
+ downloaded_chunks.insert(*i);
+ i++;
+ }
+ }
+
+ // write remaining chunks
+ i = downloaded_chunks.begin();
+ while (i != downloaded_chunks.end())
+ {
+ ChunkHeader ch = {*i,0};
+ fptr.write(&ch,sizeof(ChunkHeader));
+ i++;
+ }
+ }
+}
diff --git a/apps/ktcachecheck/cachechecker.h b/apps/ktcachecheck/cachechecker.h
new file mode 100644
index 0000000..def3e6d
--- /dev/null
+++ b/apps/ktcachecheck/cachechecker.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DEBUGCACHECHECKER_H
+#define DEBUGCACHECHECKER_H
+
+#include <set>
+#include <qstring.h>
+#include <util/functions.h>
+
+namespace bt
+{
+ class Torrent;
+}
+
+namespace ktdebug
+{
+
+ /**
+ * @author Joris Guisson
+ */
+ class CacheChecker
+ {
+ public:
+ CacheChecker(bt::Torrent & tor);
+ virtual ~CacheChecker();
+
+ void loadIndex(const QString & index_file);
+ void fixIndex();
+ bool foundFailedChunks() const {return failed_chunks.size() > 0;}
+ bool foundExtraChunks() const {return extra_chunks.size() > 0;}
+
+ virtual void check(const QString & cache,const QString & index) = 0;
+ protected:
+ bt::Torrent & tor;
+ QString index_file;
+ std::set<bt::Uint32> downloaded_chunks;
+ std::set<bt::Uint32> failed_chunks;
+ std::set<bt::Uint32> extra_chunks;
+ };
+
+
+}
+
+#endif
diff --git a/apps/ktcachecheck/multicachechecker.cpp b/apps/ktcachecheck/multicachechecker.cpp
new file mode 100644
index 0000000..df80535
--- /dev/null
+++ b/apps/ktcachecheck/multicachechecker.cpp
@@ -0,0 +1,143 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/file.h>
+#include <util/error.h>
+#include <util/array.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include <torrent/chunkmanager.h>
+#include "multicachechecker.h"
+
+using namespace bt;
+
+namespace ktdebug
+{
+
+ MultiCacheChecker::MultiCacheChecker(bt::Torrent& tor): CacheChecker(tor)
+ {}
+
+
+ MultiCacheChecker::~MultiCacheChecker()
+ {}
+
+
+ void MultiCacheChecker::check(const QString& cache_dir, const QString& index)
+ {
+ loadIndex(index);
+ QString cache = cache_dir;
+ if (!cache.endsWith(bt::DirSeparator()))
+ cache += bt::DirSeparator();
+
+ Uint32 num_chunks = tor.getNumChunks();
+ Uint64 curr_file_off = 0;
+ Uint32 curr_file = 0;
+ Uint64 chunk_size = tor.getChunkSize();
+
+ Array<Uint8> buf((Uint32)tor.getChunkSize());
+ Uint32 num_ok = 0,num_not_ok = 0,num_not_downloaded = 0,extra_ok = 0;
+
+ for (Uint32 i = 0;i < num_chunks;i++)
+ {
+ if (i % 100 == 0)
+ Out() << "Checked " << i << " chunks" << endl;
+
+
+
+ Uint64 size = chunk_size;
+ if (i == tor.getNumChunks() - 1 && tor.getFileLength() % chunk_size != 0)
+ size = tor.getFileLength() % chunk_size;
+
+ //Out() << "Loading chunk (size = " << size << ")" << endl;
+ Uint64 bytes_offset = 0;
+ while (bytes_offset < size)
+ {
+ TorrentFile & tf = tor.getFile(curr_file);
+// Out() << "Current file : " << tf.getPath() << " (" << curr_file << ")" << endl;
+ Uint64 to_read = size - bytes_offset;
+// Out() << "to_read = " << to_read << endl;
+ if (to_read <= tf.getSize() - curr_file_off)
+ {
+ // we can read the chunk from this file
+ File fptr;
+ if (!fptr.open(cache + tf.getPath(),"rb"))
+ throw Error(QString("Cannot open %1 : %2").arg(cache + tf.getPath()).arg(fptr.errorString()));
+
+ fptr.seek(File::BEGIN,curr_file_off);
+ fptr.read(buf + bytes_offset,to_read);
+ bytes_offset += to_read;
+ curr_file_off += to_read;
+ }
+ else
+ {
+
+ // read partially the data which can be read
+ to_read = tf.getSize() - curr_file_off;
+// Out() << "Partially reading " << to_read << endl;
+ File fptr;
+ if (!fptr.open(cache + tf.getPath(),"rb"))
+ throw Error(QString("Cannot open %1 : %2").arg(cache + tf.getPath()).arg(fptr.errorString()));
+
+ fptr.seek(File::BEGIN,curr_file_off);
+ fptr.read(buf + bytes_offset,to_read);
+ bytes_offset += to_read;
+ // update curr_file and offset
+ curr_file++;
+ curr_file_off = 0;
+ }
+ } // end file reading while
+
+ // calculate hash and check it
+ SHA1Hash h = SHA1Hash::generate(buf,size);
+ if (h != tor.getHash(i))
+ {
+ if (downloaded_chunks.count(i) == 0)
+ {
+ num_not_downloaded++;
+ continue;
+ }
+ Out() << "Chunk " << i << " Failed :" << endl;
+ Out() << "\tShould be : " << tor.getHash(i).toString() << endl;
+ Out() << "\tIs : " << h.toString() << endl;
+ num_not_ok++;
+ failed_chunks.insert(i);
+ }
+ else
+ {
+ if (downloaded_chunks.count(i) == 0)
+ {
+ extra_ok++;
+ extra_chunks.insert(i);
+ continue;
+ }
+ num_ok++;
+ }
+ }
+
+ Out() << "Cache Check Summary" << endl;
+ Out() << "===================" << endl;
+ Out() << "Extra Chunks : " << extra_ok << endl;
+ Out() << "Chunks OK : " << num_ok << endl;
+ Out() << "Chunks Not Downloaded : " << num_not_downloaded << endl;
+ Out() << "Chunks Failed : " << num_not_ok << endl;
+ }
+
+}
diff --git a/apps/ktcachecheck/multicachechecker.h b/apps/ktcachecheck/multicachechecker.h
new file mode 100644
index 0000000..1df95f5
--- /dev/null
+++ b/apps/ktcachecheck/multicachechecker.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DEBUGMULTICACHECHECKER_H
+#define DEBUGMULTICACHECHECKER_H
+
+#include "cachechecker.h"
+
+namespace ktdebug
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class MultiCacheChecker : public CacheChecker
+ {
+ public:
+ MultiCacheChecker(bt::Torrent& tor);
+
+ ~MultiCacheChecker();
+
+ virtual void check(const QString& cache, const QString& index);
+
+ };
+
+}
+
+#endif
diff --git a/apps/ktcachecheck/singlecachechecker.cpp b/apps/ktcachecheck/singlecachechecker.cpp
new file mode 100644
index 0000000..822c28a
--- /dev/null
+++ b/apps/ktcachecheck/singlecachechecker.cpp
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/file.h>
+#include <util/error.h>
+#include <util/array.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include <torrent/chunkmanager.h>
+#include "singlecachechecker.h"
+
+using namespace bt;
+
+namespace ktdebug
+{
+
+ SingleCacheChecker::SingleCacheChecker(bt::Torrent& tor): CacheChecker(tor)
+ {}
+
+
+ SingleCacheChecker::~SingleCacheChecker()
+ {}
+
+
+ void SingleCacheChecker::check(const QString& cache, const QString& index)
+ {
+ loadIndex(index);
+ Uint32 num_chunks = tor.getNumChunks();
+ File fptr;
+ if (!fptr.open(cache,"rb"))
+ {
+ throw Error(QString("Cannot open file : %1 : %2")
+ .arg(cache).arg( fptr.errorString()));
+ }
+
+ Uint32 num_ok = 0,num_not_ok = 0,num_not_downloaded = 0,extra_ok = 0;
+
+ Array<Uint8> buf((Uint32)tor.getChunkSize());
+ for (Uint32 i = 0;i < num_chunks;i++)
+ {
+ if (i % 100 == 0)
+ Out(SYS_GEN|LOG_DEBUG) << "Checked " << i << " chunks" << endl;
+ // Out() << "Chunk " << i << " : ";
+ if (!fptr.eof())
+ {
+ Uint32 size = i == num_chunks - 1 && tor.getFileLength() % tor.getChunkSize() > 0 ?
+ tor.getFileLength() % tor.getChunkSize() : (Uint32)tor.getChunkSize();
+ fptr.seek(File::BEGIN,(Int64)i*tor.getChunkSize());
+ fptr.read(buf,size);
+ SHA1Hash h = SHA1Hash::generate(buf,size);
+ bool ok = (h == tor.getHash(i));
+ if (ok)
+ {
+ if (downloaded_chunks.count(i) == 0)
+ {
+ extra_ok++;
+ extra_chunks.insert(i);
+ continue;
+ }
+ num_ok++;
+ // Out() << "OK" << endl;
+ }
+ else
+ {
+ if (downloaded_chunks.count(i) == 0)
+ {
+ num_not_downloaded++;
+ continue;
+ }
+ Out() << "Chunk " << i << " Failed :" << endl;
+ Out() << "\tShould be : " << tor.getHash(i).toString() << endl;
+ Out() << "\tIs : " << h.toString() << endl;
+ num_not_ok++;
+ failed_chunks.insert(i);
+ }
+
+ }
+ else
+ {
+ num_not_downloaded++;
+ //Out() << "Not Downloaded" << endl;
+ }
+ }
+ Out() << "Cache Check Summary" << endl;
+ Out() << "===================" << endl;
+ Out() << "Extra Chunks : " << extra_ok << endl;
+ Out() << "Chunks OK : " << num_ok << endl;
+ Out() << "Chunks Not Downloaded : " << num_not_downloaded << endl;
+ Out() << "Chunks Failed : " << num_not_ok << endl;
+ }
+
+}
diff --git a/apps/ktcachecheck/singlecachechecker.h b/apps/ktcachecheck/singlecachechecker.h
new file mode 100644
index 0000000..2d7b178
--- /dev/null
+++ b/apps/ktcachecheck/singlecachechecker.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DEBUGSINGLECACHECHECKER_H
+#define DEBUGSINGLECACHECHECKER_H
+
+#include "cachechecker.h"
+
+namespace ktdebug
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class SingleCacheChecker : public CacheChecker
+ {
+ public:
+ SingleCacheChecker(bt::Torrent& tor);
+ virtual ~SingleCacheChecker();
+
+ virtual void check(const QString& cache, const QString& index);
+
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/Makefile.am b/apps/ktorrent/Makefile.am
new file mode 100644
index 0000000..d9b91ae
--- /dev/null
+++ b/apps/ktorrent/Makefile.am
@@ -0,0 +1,65 @@
+## Makefile.am for ktorrent
+SUBDIRS = groups newui
+# this is the program that gets installed. it's name is used for all
+# of the other Makefile.am variables
+bin_PROGRAMS = ktorrent
+
+
+
+# set the include path for X, qt and KDE
+INCLUDES = -I$(top_builddir)/ktorrent/libktorrent -I$(top_builddir)/libktorrent/ -I$(srcdir)/../../libktorrent \
+ $(all_includes)
+
+# the library search path.
+ktorrent_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+
+# the libraries to link against.
+ktorrent_LDADD = ../../apps/ktorrent/newui/libnewui.la $(LIB_KFILE) \
+ $(LIB_KIO) $(LIB_KPARTS) ../../apps/ktorrent/groups/libgroups.la \
+ ../../libktorrent/libktorrent.la
+
+# which sources should be compiled for ktorrent
+ktorrent_SOURCES = addpeerwidget.cpp addpeerwidget.h addpeerwidgetbase.ui \
+ advancedpref.ui dcopinterface.skel downloadpref.ui fileselectdlg.cpp \
+ fileselectdlgbase.ui generalpref.ui ipfilterwidget.cpp ipfilterwidgetbase.ui ktorrent.cpp \
+ ktorrentapp.cpp ktorrentcore.cpp ktorrentdcop.cpp ktorrentview.cpp ktorrentviewitem.cpp \
+ ktorrentviewmenu.cpp leaktrace.cpp main.cpp pastedialog.cpp pastedlgbase.ui pref.cpp \
+ queuedialog.cpp queuedialog.h queuedlg.ui scandialog.cpp scandlgbase.ui \
+ speedlimitsdlg.cpp speedlimitsdlgbase.ui torrentcreatordlg.cpp torrentcreatordlg.h \
+ torrentcreatordlgbase.ui trayhoverpopup.cpp trayicon.cpp viewmanager.cpp filterbar.cpp
+
+xdg_apps_DATA = ktorrent.desktop
+
+
+# these are the headers for your project
+noinst_HEADERS = dcopinterface.h fileselectdlg.h ipfilterwidget.h ktorrent.h \
+ ktorrentcore.h ktorrentdcop.h ktorrentview.h ktorrentviewitem.h ktorrentviewmenu.h \
+ pastedialog.h pref.h scandialog.h speedlimitsdlg.h trayhoverpopup.h trayicon.h \
+ viewmanager.h
+
+# client stuff
+
+# let automoc handle all of the meta source files (moc)
+METASOURCES = AUTO
+
+messages: rc.cpp
+ $(XGETTEXT) *.cpp -o $(podir)/ktorrent.pot
+
+# this is where the XML-GUI resource file goes
+rcdir = $(kde_datadir)/ktorrent
+rc_DATA = ktorrentui.rc
+
+KDE_ICON= torrent ktorrent
+
+appicondir = $(kde_datadir)/ktorrent/icons
+appicon_ICON = ktencrypted ktremove ktstart_all ktstart ktstop_all ktstop ktplugins ktinfowidget ktqueuemanager ktupnp ktprefdownloads
+
+kde_servicetypes_DATA = ktorrentplugin.desktop
+EXTRA_DIST = ktorrentplugin.desktop
+
+if ENABLE_TORRENT_MIMETYPE
+mimedir = $(kde_mimedir)/application
+mime_DATA = x-bittorrent.desktop
+endif
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/apps/ktorrent/README b/apps/ktorrent/README
new file mode 100644
index 0000000..f04a563
--- /dev/null
+++ b/apps/ktorrent/README
@@ -0,0 +1,81 @@
+-----------------------------------------------
+Kde application framework template quickstart
+Author: Thomas Nagy
+Date: 2004-03-22
+-----------------------------------------------
+
+This README file explains you basic things for starting with
+this application template.
+
+
+** Building and installing **
+
+* Build the configure script by "make -f Makefile.cvs"
+
+* To clean, use "make clean", and to clean everything
+(remove the makefiles, etc), use "make distclean"
+
+* To distribute your program, try "make dist".
+This will make a compact tarball archive of your release with the
+necessary scripts inside.
+
+* Modifying the auto-tools scripts
+for automake scripts there is an excellent tutorial there :
+http://developer.kde.org/documentation/other/makefile_am_howto.html
+
+* Simplify your life : install the project in your home directory for
+testing purposes.
+./configure --prefix=/home/user/dummyfolder/
+In the end when you finished the development you can
+rm -rf /home/user/dummyfolder/
+without fear.
+
+
+** Technologies **
+
+* Build the menus of your application easily
+kde applications now use an xml file (*ui.rc file) to build the menus.
+This allow a great customization of the application. However, when
+programming the menu is shown only after a "make install"
+
+For more details, consult :
+http://devel-home.kde.org/~larrosa/tutorial/p9.html
+http://developer.kde.org/documentation/tutorials/xmlui/preface.html
+
+* Use KConfig XT to create your configuration dialogs and make
+them more maintainable.
+
+For more details, consult :
+http://developer.kde.org/documentation/tutorials/kconfigxt/kconfigxt.html
+
+* With KParts, you can embed other kde components in your program, or make your program
+embeddable in other apps. For example, the kmplayer kpart can be called to play videos
+in your app.
+
+For more details, consult :
+http://www-106.ibm.com/developerworks/library/l-kparts/
+http://developer.kde.org/documentation/tutorials/dot/writing-plugins.html
+http://developer.kde.org/documentation/tutorials/developing-a-plugin-structure/index.html
+
+* With dcop, you can control your app from other applications
+Make sure to include K_DCOP and a kdcop: section in your .h file
+http://developer.kde.org/documentation/tutorials/dot/dcopiface/dcop-interface.html
+
+
+** Documentation **
+
+* For the translations :
+1. Download a patched gettext which can be found at:
+ http://public.kde.planetmirror.com/pub/kde/devel/gettext-kde/
+2. Install that gettext in ~/bin/
+3. cd ~/yourproject, export PATH=~/bin:$PATH, export
+KDEDIR=/where_your_KDE3_is
+4. make -f admin/Makefile.common package-messages
+5. make package-messages
+6. Translate the po files (not the pot!!) with kbabel or xemacs
+
+* Do not forget to write the documentation for your kde app
+edit the documentation template index.docbook in doc/
+
+
+
diff --git a/apps/ktorrent/addpeerwidget.cpp b/apps/ktorrent/addpeerwidget.cpp
new file mode 100644
index 0000000..20c27c3
--- /dev/null
+++ b/apps/ktorrent/addpeerwidget.cpp
@@ -0,0 +1,111 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "addpeerwidget.h"
+
+#include <util/constants.h>
+#include <interfaces/torrentinterface.h>
+
+#include <klocale.h>
+#include <ksqueezedtextlabel.h>
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kmessagebox.h>
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qregexp.h>
+#include <qvalidator.h>
+
+using namespace kt;
+using bt::Uint16;
+
+//PeerSource
+
+ManualPeerSource::ManualPeerSource()
+{}
+
+void ManualPeerSource::start()
+{}
+
+void ManualPeerSource::stop(bt::WaitJob* )
+{}
+
+ManualPeerSource::~ ManualPeerSource()
+{}
+
+void ManualPeerSource::signalPeersReady()
+{
+ peersReady(this);
+}
+
+
+//AddPeerWidget
+
+AddPeerWidget::AddPeerWidget(kt::TorrentInterface* tc, QWidget *parent, const char *name)
+ :AddPeerWidgetBase(parent, name), m_tc(tc)
+{
+ if(!tc)
+ {
+ //oops, something went wrong...
+ m_status->setText(i18n("Torrent does not exist. Report this bug to KTorrent developers."));
+ m_ip->setEnabled(false);
+ m_port->setEnabled(false);
+ return;
+ }
+
+ m_peerSource = new ManualPeerSource();
+
+ //Register this peer source with ps manager.
+ m_tc->addPeerSource(m_peerSource);
+}
+
+AddPeerWidget::~ AddPeerWidget()
+{
+ //Unregister this peer source with ps manager.
+ m_tc->removePeerSource(m_peerSource);
+
+ delete m_peerSource;
+}
+
+void AddPeerWidget::btnAdd_clicked()
+{
+ int var=0;
+
+ QRegExp rx("[0-9]{1,3}(.[0-9]{1,3}){3,3}");
+ QRegExpValidator v( rx,0);
+
+ QString ip = m_ip->text();
+
+ if(v.validate( ip, var ) == QValidator::Acceptable)
+ {
+ m_peerSource->addPeer(ip, m_port->value());
+
+ m_peerSource->signalPeersReady();
+
+ m_status->setText(i18n("Potential peer added."));
+ }
+ else
+ {
+ KMessageBox::sorry(0, i18n("Malformed IP address."));
+ m_status->setText("");
+ }
+}
+
+#include "addpeerwidget.moc"
diff --git a/apps/ktorrent/addpeerwidget.h b/apps/ktorrent/addpeerwidget.h
new file mode 100644
index 0000000..74a7488
--- /dev/null
+++ b/apps/ktorrent/addpeerwidget.h
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 ADDPEERWIDGET_H
+#define ADDPEERWIDGET_H
+
+#include "addpeerwidgetbase.h"
+
+#include <qobject.h>
+#include <interfaces/peersource.h>
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+namespace bt
+{
+ class WaitJob;
+}
+
+/**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief PeerSource to allow peers to be added manually.
+ *
+ * Start/Stop() do nothing. Use this class only to manually add peers.
+ */
+class ManualPeerSource: public kt::PeerSource
+{
+ Q_OBJECT
+
+ public:
+ ManualPeerSource();
+ virtual ~ManualPeerSource();
+
+ /**
+ * @brief Emits peersReady signal.
+ * Use this when there are peers available in this peer source.
+ */
+ void signalPeersReady();
+
+ public slots:
+
+ /**
+ * Start gathering peers.
+ * Had to be defined but won't be used here.
+ */
+ void start();
+
+ /**
+ * Stop gathering peers.
+ * Had to be defined but won't be used here.
+ */
+ void stop(bt::WaitJob* wjob = 0);
+};
+
+
+/**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief GUI dialog for adding peers.
+ */
+class AddPeerWidget: public AddPeerWidgetBase
+{
+ Q_OBJECT
+ public:
+ AddPeerWidget(kt::TorrentInterface* tc, QWidget *parent = 0, const char *name = 0);
+ ~AddPeerWidget();
+
+ public slots:
+ virtual void btnAdd_clicked();
+
+ private:
+ ManualPeerSource* m_peerSource;
+ kt::TorrentInterface* m_tc;
+};
+
+#endif
diff --git a/apps/ktorrent/addpeerwidgetbase.ui b/apps/ktorrent/addpeerwidgetbase.ui
new file mode 100644
index 0000000..c4cbc6f
--- /dev/null
+++ b/apps/ktorrent/addpeerwidgetbase.ui
@@ -0,0 +1,164 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AddPeerWidgetBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AddPeerWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>380</width>
+ <height>89</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Add potential peer</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Peer IP:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_ip</cstring>
+ </property>
+ <property name="text">
+ <string>127.0.0.1</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_port</cstring>
+ </property>
+ <property name="value">
+ <number>6881</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KSqueezedTextLabel">
+ <property name="name">
+ <cstring>m_status</cstring>
+ </property>
+ <property name="text">
+ <string>Enter peer IP and port.</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnAdd</cstring>
+ </property>
+ <property name="text">
+ <string>Add</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>27</number>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>13</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>btnClose</sender>
+ <signal>clicked()</signal>
+ <receiver>AddPeerWidgetBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>btnAdd</sender>
+ <signal>clicked()</signal>
+ <receiver>AddPeerWidgetBase</receiver>
+ <slot>btnAdd_clicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>btnClose</tabstop>
+ <tabstop>m_ip</tabstop>
+ <tabstop>m_port</tabstop>
+ <tabstop>btnAdd</tabstop>
+</tabstops>
+<slots>
+ <slot>btnAdd_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>ksqueezedtextlabel.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/advancedpref.ui b/apps/ktorrent/advancedpref.ui
new file mode 100644
index 0000000..bf4573e
--- /dev/null
+++ b/apps/ktorrent/advancedpref.ui
@@ -0,0 +1,656 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AdvancedPref</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>AdvancedPref</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>743</width>
+ <height>683</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Advanced Preferences</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>Advanced Options</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>Time left estimation algorithm:</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>&lt;b&gt;KTorrent algorithm:&lt;/b&gt; Default algorithm using combination of other algorithms based on our tests.&lt;br&gt;
+&lt;b&gt;Current speed algorithm:&lt;/b&gt; Simplest algorithm - BytesLeft/CurrentSpeed&lt;br&gt;
+&lt;b&gt;Global average speed algorithm:&lt;/b&gt; BytesLeft/AverageSpeed&lt;br&gt;
+&lt;b&gt;Window of X algorithm:&lt;/b&gt; ET calculated from X speed samples&lt;br&gt;
+&lt;b&gt;Moving average algorithm:&lt;/b&gt; Moving average speed calculated from X samples</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>KTorrent</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Current speed</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Global average speed</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Window of X</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Moving average</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>eta</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>&lt;b&gt;KTorrent algorithm:&lt;/b&gt; Default algorithm using combination of other algorithms based on our tests.&lt;br&gt;
+&lt;b&gt;Current speed algorithm:&lt;/b&gt; Simplest algorithm - BytesLeft/CurrentSpeed&lt;br&gt;
+&lt;b&gt;Global average speed algorithm:&lt;/b&gt; BytesLeft/AverageSpeed&lt;br&gt;
+&lt;b&gt;Window of X algorithm:&lt;/b&gt; ET calculated from X speed samples&lt;br&gt;
+&lt;b&gt;Moving average algorithm:&lt;/b&gt; Moving average speed calculated from X samples</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>(takes effect after restart)</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>148</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>prealloc_disabled</cstring>
+ </property>
+ <property name="text">
+ <string>Disa&amp;ble diskspace preallocation</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout25</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>full_prealloc</cstring>
+ </property>
+ <property name="text">
+ <string>F&amp;ully preallocate diskspace (avoids fragmentation)</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Basic (slow)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Filesystem specific</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>full_prealloc_method</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="duplicatesEnabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Performance</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Memory usage:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <item>
+ <property name="text">
+ <string>Low</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Medium</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>High</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>mem_usage</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>GUI update interval:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <item>
+ <property name="text">
+ <string>500ms</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>1s</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2s</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>5s</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>gui_interval</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2_2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>111</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_6</cstring>
+ </property>
+ <property name="text">
+ <string>Fast CPU</string>
+ </property>
+ </widget>
+ <widget class="QSlider">
+ <property name="name">
+ <cstring>cpu_usage</cstring>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>50</number>
+ </property>
+ <property name="value">
+ <number>3</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="tickmarks">
+ <enum>Below</enum>
+ </property>
+ <property name="tickInterval">
+ <number>1</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Slow CPU</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Data Checking</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>no_recheck</cstring>
+ </property>
+ <property name="text">
+ <string>During uploading, do &amp;not recheck chunks bigger than</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>recheck_size</cstring>
+ </property>
+ <property name="value">
+ <number>512</number>
+ </property>
+ <property name="minValue">
+ <number>16</number>
+ </property>
+ <property name="maxValue">
+ <number>8192</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>KB</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>auto_recheck</cstring>
+ </property>
+ <property name="text">
+ <string>Do a data integrit&amp;y check after</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>num_corrupted</cstring>
+ </property>
+ <property name="value">
+ <number>3</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>corrupted chunks</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>41</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Networking</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout33</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout32</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_7</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum number of connection setups:</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput" row="1" column="1">
+ <property name="name">
+ <cstring>max_con_setups</cstring>
+ </property>
+ <property name="value">
+ <number>50</number>
+ </property>
+ <property name="minValue">
+ <number>10</number>
+ </property>
+ <property name="maxValue">
+ <number>200</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>DSCP for IP packets:</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput" row="0" column="1">
+ <property name="name">
+ <cstring>dscp</cstring>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>63</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>383</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>do_not_use_kde_proxy</cstring>
+ </property>
+ <property name="text">
+ <string>Do not use the KDE pro&amp;xy settings for HTTP tracker connections</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>HTTP tracker proxy:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>http_proxy</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>81</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>full_prealloc</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>full_prealloc_method</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kcombobox.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/custom_widgets.cw b/apps/ktorrent/custom_widgets.cw
new file mode 100644
index 0000000..9e8426d
--- /dev/null
+++ b/apps/ktorrent/custom_widgets.cw
@@ -0,0 +1,68 @@
+<!DOCTYPE CW><CW>
+<customwidgets>
+ <customwidget>
+ <class>PeerView</class>
+ <header location="local">peerview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>
+ <data format="PNG" length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042c49444154388db5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d404e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3eeffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6bebebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64dcbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb004580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9ee0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93d642365be0636a0d28ec7600941d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13ed1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f72208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45c02d37499182b01cc0201a085d61a2144d8b2ac8fb6ed340e77240c4261890e04c250185262546d534a032154b59e0ad394e41c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd051532ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de6795578012889ff6b98fe016ea0ce1c6a2573410000000049454e44ae426082</data>
+ </pixmap>
+ </customwidget>
+ <customwidget>
+ <class>ChunkDownloadView</class>
+ <header location="local">chunkdownloadview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>
+ <data format="PNG" length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042c49444154388db5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d404e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3eeffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6bebebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64dcbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb004580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9ee0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93d642365be0636a0d28ec7600941d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13ed1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f72208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45c02d37499182b01cc0201a085d61a2144d8b2ac8fb6ed340e77240c4261890e04c250185262546d534a032154b59e0ad394e41c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd051532ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de6795578012889ff6b98fe016ea0ce1c6a2573410000000049454e44ae426082</data>
+ </pixmap>
+ </customwidget>
+ <customwidget>
+ <class>DownloadedChunkBar</class>
+ <header location="local">downloadedchunkbar.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>20</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>
+ <data format="PNG" length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042c49444154388db5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d404e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3eeffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6bebebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64dcbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb004580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9ee0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93d642365be0636a0d28ec7600941d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13ed1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f72208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45c02d37499182b01cc0201a085d61a2144d8b2ac8fb6ed340e77240c4261890e04c250185262546d534a032154b59e0ad394e41c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd051532ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de6795578012889ff6b98fe016ea0ce1c6a2573410000000049454e44ae426082</data>
+ </pixmap>
+ </customwidget>
+ <customwidget>
+ <class>AvailabilityChunkBar</class>
+ <header location="local">availabilitychunkbar.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>20</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ </sizepolicy>
+ <pixmap>
+ <data format="PNG" length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042c49444154388db5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d404e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3eeffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6bebebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64dcbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb004580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9ee0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93d642365be0636a0d28ec7600941d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13ed1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f72208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45c02d37499182b01cc0201a085d61a2144d8b2ac8fb6ed340e77240c4261890e04c250185262546d534a032154b59e0ad394e41c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd051532ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de6795578012889ff6b98fe016ea0ce1c6a2573410000000049454e44ae426082</data>
+ </pixmap>
+ </customwidget>
+</customwidgets>
+</CW>
diff --git a/apps/ktorrent/dcopinterface.h b/apps/ktorrent/dcopinterface.h
new file mode 100644
index 0000000..5dd7df5
--- /dev/null
+++ b/apps/ktorrent/dcopinterface.h
@@ -0,0 +1,69 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DCOPINTERFACE_H
+#define DCOPINTERFACE_H
+
+#include <dcopobject.h>
+
+/**
+@author Joris Guisson
+*/
+class DCOPInterface : virtual public DCOPObject
+{
+ K_DCOP
+k_dcop:
+ virtual void startAll(int type = 3) = 0;
+ virtual void stopAll(int type = 3) = 0;
+ virtual void setMaxDownloads(int max) = 0;
+ virtual void setMaxSeeds(int max) = 0;
+ virtual void setKeepSeeding(bool ks) = 0;
+ virtual void setMaxUploadSpeed(int kbytes_per_sec) = 0;
+ virtual void setMaxDownloadSpeed(int kbytes_per_sec) = 0;
+ virtual void setMaxConnectionsPerDownload(int max) = 0;
+ virtual void setShowSysTrayIcon(bool yes) = 0;
+ virtual bool changeDataDir(const QString & new_dir) = 0;
+ virtual void openTorrent(const QString & file) = 0;
+ virtual void openTorrentSilently(const QString & file) = 0;
+ virtual QValueList<int> getTorrentNumbers(int type = 3) = 0;
+ virtual QCStringList getTorrentInfo(int tornumber) = 0;
+ virtual int getFileCount(int tornumber) = 0;
+ virtual QCStringList getInfo() = 0;
+ virtual QCStringList getFileNames(int tornumber) = 0;
+ virtual QValueList<int> getFilePriorities(int tornumber) = 0;
+ virtual void setFilePriority(int tornumber, int index, int priority) = 0;
+ virtual void start(int tornumber) = 0;
+ virtual void stop(int tornumber, bool user) = 0;
+ virtual void remove(int tornumber, bool del_data) = 0;
+ virtual void announce(int tornumber) = 0;
+ virtual QCString dataDir() = 0;
+ virtual int maxDownloads() = 0;
+ virtual int maxSeeds() = 0;
+ virtual int maxConnections() = 0;
+ virtual int maxUploadRate() = 0;
+ virtual int maxDownloadRate() = 0;
+ virtual bool keepSeeding() = 0;
+ virtual bool showSystemTrayIcon() = 0;
+ virtual QValueList<int> intSettings() = 0;
+ virtual bool isBlockedIP(QString ip) = 0;
+ virtual void openTorrentSilentlyDir(const QString & file, const QString & savedir) = 0;
+};
+
+
+#endif
diff --git a/apps/ktorrent/downloadpref.ui b/apps/ktorrent/downloadpref.ui
new file mode 100644
index 0000000..c87383b
--- /dev/null
+++ b/apps/ktorrent/downloadpref.ui
@@ -0,0 +1,735 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DownloadPref</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>DownloadPref</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>575</width>
+ <height>706</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox2</cstring>
+ </property>
+ <property name="title">
+ <string>Queue Manager</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout49</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout42</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum downloads:</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum seeds:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_8</cstring>
+ </property>
+ <property name="text">
+ <string>Start download on low disk space :</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_9</cstring>
+ </property>
+ <property name="text">
+ <string>Minimum disk space:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout46</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>max_downloads</cstring>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>max_seeds</cstring>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Don't start</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Always ask</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Force start</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>cmbDiskSpace</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout45</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>intMinDiskSpace</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maxValue">
+ <number>10000</number>
+ </property>
+ <property name="minValue">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>MB</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout48</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>(0 is no limit)</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2_3</cstring>
+ </property>
+ <property name="text">
+ <string>(0 is no limit)</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer36</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>191</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer>
+ <property name="name">
+ <cstring>spacer17</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>207</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Preferences</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout42</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum download rate:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_7</cstring>
+ </property>
+ <property name="text">
+ <string>Global connection limit:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="8" column="0">
+ <property name="name">
+ <cstring>textLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Max seed time:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout18</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum connections per torrent:</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>textLabel1_6</cstring>
+ </property>
+ <property name="text">
+ <string>Number of upload slots:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>UDP tracker port:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="7" column="0">
+ <property name="name">
+ <cstring>textLabel1_6_2</cstring>
+ </property>
+ <property name="text">
+ <string>Max share ratio:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum upload rate:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout41</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>max_conns</cstring>
+ </property>
+ <property name="value">
+ <number>100</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>max_total_conns</cstring>
+ </property>
+ <property name="value">
+ <number>800</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>max_upload_rate</cstring>
+ </property>
+ <property name="value">
+ <number>5</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>max_download_rate</cstring>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>port</cstring>
+ </property>
+ <property name="value">
+ <number>6881</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>udp_tracker_port</cstring>
+ </property>
+ <property name="value">
+ <number>4444</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>num_upload_slots</cstring>
+ </property>
+ <property name="value">
+ <number>2</number>
+ </property>
+ <property name="minValue">
+ <number>2</number>
+ </property>
+ <property name="maxValue">
+ <number>100</number>
+ </property>
+ <property name="referencePoint">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="KDoubleSpinBox">
+ <property name="name">
+ <cstring>num_max_ratio</cstring>
+ </property>
+ <property name="maxValue">
+ <number>1000</number>
+ </property>
+ <property name="precision">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="KDoubleSpinBox">
+ <property name="name">
+ <cstring>max_seed_time</cstring>
+ </property>
+ <property name="maxValue">
+ <number>1e+07</number>
+ </property>
+ <property name="lineStep">
+ <number>0.05</number>
+ </property>
+ <property name="precision">
+ <number>2</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout40</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>(0 is no limit)</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>(0 is no limit)</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>KB/sec (0 is no limit)</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>KB/sec (0 is no limit)</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>208</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>208</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>208</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>(0 is no limit)</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>Hours (0 is no limit)</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>keep_seeding</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Keep seeding after download is finished</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Attention</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KActiveLabel">
+ <property name="name">
+ <cstring>kActiveLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>The above ports must also be forwarded if you are behind a router. The UPnP plugin can do this for you.</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kactivelabel.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/fileselectdlg.cpp b/apps/ktorrent/fileselectdlg.cpp
new file mode 100644
index 0000000..5704b41
--- /dev/null
+++ b/apps/ktorrent/fileselectdlg.cpp
@@ -0,0 +1,297 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kmessagebox.h>
+#include <klistview.h>
+#include <kstdguiitem.h>
+#include <kpushbutton.h>
+#include <kurlrequester.h>
+#include <kiconloader.h>
+#include <kmimetype.h>
+#include <kurl.h>
+
+#include <qlabel.h>
+#include <qstring.h>
+#include <qbuttongroup.h>
+#include <qcombobox.h>
+#include <qcheckbox.h>
+#include <qdir.h>
+
+#include <interfaces/torrentfileinterface.h>
+#include <interfaces/torrentinterface.h>
+#include "fileselectdlg.h"
+#include <interfaces/filetreediritem.h>
+#include <interfaces/filetreeitem.h>
+#include <interfaces/functions.h>
+#include <settings.h>
+#include <util/functions.h>
+#include <util/fileops.h>
+
+#include <groups/group.h>
+#include <groups/groupmanager.h>
+
+using namespace kt;
+
+FileSelectDlg::FileSelectDlg(GroupManager* gm, bool* user, bool* start, QWidget* parent, const char* name, bool modal, WFlags fl)
+ : FileSelectDlgBase(parent, name, modal, fl), m_gman(gm), m_user(user), m_start(start)
+{
+ root = 0;
+ connect(m_select_all, SIGNAL(clicked()), this, SLOT(selectAll()));
+ connect(m_select_none, SIGNAL(clicked()), this, SLOT(selectNone()));
+ connect(m_invert_selection, SIGNAL(clicked()), this, SLOT(invertSelection()));
+ connect(m_ok, SIGNAL(clicked()), this, SLOT(accept()));
+ connect(m_cancel, SIGNAL(clicked()), this, SLOT(reject()));
+ connect(m_downloadLocation, SIGNAL(textChanged (const QString &)), this, SLOT(updateSizeLabels()));
+
+ m_downloadLocation->setMode(KFile::Directory);
+}
+
+FileSelectDlg::~FileSelectDlg()
+
+{}
+
+int FileSelectDlg::execute(kt::TorrentInterface* tc)
+{
+ this->tc = tc;
+
+ if (tc)
+ {
+ populateFields();
+
+ if(tc->getStats().multi_file_torrent)
+ setupMultifileTorrent();
+ else
+ setupSinglefileTorrent();
+
+ return exec();
+ }
+
+ return QDialog::Rejected;
+}
+
+void FileSelectDlg::reject()
+{
+ QDialog::reject();
+}
+
+void FileSelectDlg::accept()
+{
+ QStringList pe_ex;
+
+ QString dn = m_downloadLocation->url();
+ if (!dn.endsWith(bt::DirSeparator()))
+ dn += bt::DirSeparator();
+
+ for (Uint32 i = 0;i < tc->getNumFiles();i++)
+ {
+ kt::TorrentFileInterface & file = tc->getTorrentFile(i);
+
+ // check for preexsting files
+ QString path = dn + tc->getStats().torrent_name + bt::DirSeparator() + file.getPath();
+ if (bt::Exists(path))
+ file.setPreExisting(true);
+
+ if (file.doNotDownload() && file.isPreExistingFile())
+ {
+ // we have excluded a preexsting file
+ pe_ex.append(file.getPath());
+ }
+ }
+
+ if (pe_ex.count() > 0)
+ {
+ QString msg = i18n("You have deselected the following existing files. "
+ "You will lose all data in these files, are you sure you want to do this ?");
+ // better ask the user if (s)he wants to delete the already existing data
+ int ret = KMessageBox::warningYesNoList(0, msg, pe_ex, QString::null,
+ KGuiItem(i18n("Yes, delete the files")),
+ KGuiItem(i18n("No, keep the files")));
+
+ if (ret == KMessageBox::No)
+ {
+ for (Uint32 i = 0;i < tc->getNumFiles();i++)
+ {
+ kt::TorrentFileInterface & file = tc->getTorrentFile(i);
+
+ if (file.doNotDownload() && file.isPreExistingFile())
+ file.setDoNotDownload(false);
+ }
+ }
+ }
+
+ for (Uint32 i = 0;i < tc->getNumFiles();i++)
+ {
+ kt::TorrentFileInterface & file = tc->getTorrentFile(i);
+ file.setEmitDownloadStatusChanged(true);
+ // we don't need to emit the downloadStatusChanged signal,
+ // because tc->createFiles() in ktorrentcore.cpp will take care of everything
+ }
+
+ //Setup custom download location
+ QString ddir = tc->getDataDir();
+ if (!ddir.endsWith(bt::DirSeparator()))
+ ddir += bt::DirSeparator();
+
+ if (dn != ddir) // only change when absolutely necessary
+ tc->changeOutputDir(dn, false);
+
+ //Make it user controlled if needed
+ *m_user = m_chkUserControlled->isChecked();
+ *m_start = m_chkUserControlled->isChecked() && m_chkStartTorrent->isChecked();
+
+ //Now add torrent to selected group
+ if(m_cmbGroups->currentItem() != 0)
+ {
+ QString groupName = m_cmbGroups->currentText();
+
+ Group* group = m_gman->find(groupName);
+ if(group)
+ {
+ group->addTorrent(tc);
+ }
+ }
+
+ // update the last save directory
+ Settings::setLastSaveDir(dn);
+ QDialog::accept();
+}
+
+void FileSelectDlg::selectAll()
+{
+ if (root)
+ root->setAllChecked(true);
+}
+
+void FileSelectDlg::selectNone()
+{
+ if (root)
+ root->setAllChecked(false);
+}
+
+void FileSelectDlg::invertSelection()
+{
+ if (root)
+ root->invertChecked();
+}
+
+void FileSelectDlg::updateSizeLabels()
+{
+ //calculate free disk space
+
+ KURL sdir = KURL(m_downloadLocation -> url());
+ while( sdir.isValid() && sdir.isLocalFile() && (!sdir.isEmpty()) && (! QDir(sdir.path()).exists()) )
+ {
+ sdir = sdir.upURL();
+ }
+
+ Uint64 bytes_free = 0;
+ if (!FreeDiskSpace(sdir.path(),bytes_free))
+ {
+ FreeDiskSpace(tc->getDataDir(),bytes_free);
+ }
+
+ Uint64 bytes_to_download = 0;
+ if (root)
+ bytes_to_download = root->bytesToDownload();
+ else
+ bytes_to_download = tc->getStats().total_bytes;
+
+ lblFree->setText(kt::BytesToString(bytes_free));
+ lblRequired->setText(kt::BytesToString(bytes_to_download));
+
+ if (bytes_to_download > bytes_free)
+ lblStatus->setText("<font color=\"#ff0000\">" + kt::BytesToString(-1*(long long)(bytes_free - bytes_to_download)) + i18n(" short!"));
+ else
+ lblStatus->setText(kt::BytesToString(bytes_free - bytes_to_download));
+}
+
+void FileSelectDlg::treeItemChanged()
+{
+ updateSizeLabels();
+}
+
+void FileSelectDlg::setupMultifileTorrent()
+{
+ m_file_view->clear();
+ root = new kt::FileTreeDirItem(m_file_view, tc->getStats().torrent_name, this);
+
+ for (Uint32 i = 0;i < tc->getNumFiles();i++)
+ {
+ kt::TorrentFileInterface & file = tc->getTorrentFile(i);
+ file.setEmitDownloadStatusChanged(false);
+ root->insert(file.getPath(), file);
+ }
+
+ root->setOpen(true);
+ m_file_view->setRootIsDecorated(true);
+
+ updateSizeLabels();
+}
+
+void FileSelectDlg::setupSinglefileTorrent()
+{
+ m_file_view->clear();
+ KListViewItem* single_root = new KListViewItem(m_file_view);
+ single_root->setText(0,tc->getStats().torrent_name);
+ single_root->setText(1,BytesToString(tc->getStats().total_bytes));
+ single_root->setText(2,i18n("Yes"));
+ single_root->setPixmap(0,KMimeType::findByPath(tc->getStats().torrent_name)->pixmap(KIcon::Small));
+ root = 0;
+ updateSizeLabels();
+ m_select_all->setEnabled(false);
+ m_select_none->setEnabled(false);
+ m_invert_selection->setEnabled(false);
+}
+
+void FileSelectDlg::populateFields()
+{
+ QString dir = Settings::saveDir();
+ if (!Settings::useSaveDir() || dir.isNull())
+ {
+ dir = Settings::lastSaveDir();
+ if (dir.isNull())
+ dir = QDir::homeDirPath();
+ }
+
+ m_downloadLocation->setURL(dir);
+ loadGroups();
+}
+
+void FileSelectDlg::loadGroups()
+{
+ GroupManager::iterator it = m_gman->begin();
+
+ QStringList grps;
+
+ //First default group
+ grps << i18n("All Torrents");
+
+ //now custom ones
+ while(it != m_gman->end())
+ {
+ grps << it->first;
+ ++it;
+ }
+
+ m_cmbGroups->insertStringList(grps);
+}
+
+#include "fileselectdlg.moc"
+
diff --git a/apps/ktorrent/fileselectdlg.h b/apps/ktorrent/fileselectdlg.h
new file mode 100644
index 0000000..9ae2b8f
--- /dev/null
+++ b/apps/ktorrent/fileselectdlg.h
@@ -0,0 +1,84 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 FILESELECTDLG_H
+#define FILESELECTDLG_H
+
+#include <interfaces/filetreediritem.h>
+#include "fileselectdlgbase.h"
+
+
+
+namespace kt
+{
+
+ class TorrentInterface;
+ class FileTreeDirItem;
+ class GroupManager;
+}
+
+/**
+ * @author Joris Guisson
+ *
+ * Dialog to select which files to download from a multifile torrent.
+ */
+
+class FileSelectDlg : public FileSelectDlgBase, public kt::FileTreeRootListener
+{
+ Q_OBJECT
+
+ kt::TorrentInterface* tc;
+ kt::FileTreeDirItem* root;
+
+ kt::GroupManager* m_gman;
+
+ bool* m_user;
+ bool* m_start;
+
+ public:
+ FileSelectDlg(kt::GroupManager* gm, bool* user, bool* start, QWidget* parent = 0, const char* name = 0,
+ bool modal = true, WFlags fl = 0);
+
+ virtual ~FileSelectDlg();
+ int execute(kt::TorrentInterface* tc);
+
+ void loadGroups();
+
+ void populateFields();
+
+ void setupMultifileTorrent();
+ void setupSinglefileTorrent();
+
+ protected slots:
+ virtual void reject();
+ virtual void accept();
+ void selectAll();
+ void selectNone();
+ void invertSelection();
+
+ private:
+ virtual void treeItemChanged();
+
+ private slots:
+ void updateSizeLabels();
+};
+
+#endif
+
diff --git a/apps/ktorrent/fileselectdlgbase.ui b/apps/ktorrent/fileselectdlgbase.ui
new file mode 100644
index 0000000..5d9ed14
--- /dev/null
+++ b/apps/ktorrent/fileselectdlgbase.ui
@@ -0,0 +1,384 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>FileSelectDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>FileSelectDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>491</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Select Which Files You Want to Download</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Download to:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_downloadLocation</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Group:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>m_cmbGroups</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_chkUserControlled</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;User controlled</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>m_chkStartTorrent</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Start torrent</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QButtonGroup" row="2" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>pnlFiles</cstring>
+ </property>
+ <property name="title">
+ <string>Files</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView" row="0" column="0" rowspan="4" colspan="1">
+ <column>
+ <property name="text">
+ <string>File</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Download</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_file_view</cstring>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>m_select_all</cstring>
+ </property>
+ <property name="text">
+ <string>Select &amp;All</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>m_select_none</cstring>
+ </property>
+ <property name="text">
+ <string>Select &amp;None</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="2" column="1">
+ <property name="name">
+ <cstring>m_invert_selection</cstring>
+ </property>
+ <property name="text">
+ <string>Invert Selection</string>
+ </property>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>135</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="3" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Disk space</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="0" column="2">
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout33</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Required disk space:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Free disk space:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="text">
+ <string>After download:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout34</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblRequired</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblFree</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblStatus</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>220</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton" row="4" column="1">
+ <property name="name">
+ <cstring>m_ok</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="4" column="2">
+ <property name="name">
+ <cstring>m_cancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>2</number>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_chkUserControlled</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_chkStartTorrent</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_ok</tabstop>
+ <tabstop>m_cancel</tabstop>
+ <tabstop>m_downloadLocation</tabstop>
+ <tabstop>m_cmbGroups</tabstop>
+ <tabstop>m_chkUserControlled</tabstop>
+ <tabstop>m_chkStartTorrent</tabstop>
+ <tabstop>m_file_view</tabstop>
+ <tabstop>m_select_all</tabstop>
+ <tabstop>m_select_none</tabstop>
+ <tabstop>m_invert_selection</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/filterbar.cpp b/apps/ktorrent/filterbar.cpp
new file mode 100644
index 0000000..c40488d
--- /dev/null
+++ b/apps/ktorrent/filterbar.cpp
@@ -0,0 +1,126 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Lukasz Fibinger <lucke@o2.pl> *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "filterbar.h"
+
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qcheckbox.h>
+
+#include <kdialog.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+#include <ktoolbarbutton.h>
+#include <klineedit.h>
+#include <kiconloader.h>
+#include <kconfig.h>
+#include <interfaces/torrentinterface.h>
+
+
+
+FilterBar::FilterBar(QWidget *parent, const char *name) :
+ QWidget(parent, name)
+{
+ const int gap = 3;
+
+ QVBoxLayout* foo = new QVBoxLayout(this);
+ foo->addSpacing(gap);
+
+ QHBoxLayout* layout = new QHBoxLayout(foo);
+ layout->addSpacing(gap);
+
+ m_close = new KToolBarButton("fileclose",0,this);
+ connect(m_close,SIGNAL(clicked()),this,SLOT(hide()));
+ layout->addWidget(m_close);
+
+ m_filter = new QLabel(i18n("Find:"), this);
+ layout->addWidget(m_filter);
+ layout->addSpacing(KDialog::spacingHint());
+
+ m_filterInput = new KLineEdit(this);
+ layout->addWidget(m_filterInput);
+
+ m_clear = new KPushButton(this);
+ m_clear->setIconSet(SmallIcon("clear_left"));
+ m_clear->setFlat(true);
+ layout->addWidget(m_clear);
+ layout->addSpacing(gap);
+
+ m_case_sensitive = new QCheckBox(i18n("Case sensitive"),this);
+ m_case_sensitive->setChecked(true);
+ layout->addWidget(m_case_sensitive);
+ layout->addItem(new QSpacerItem(10,10,QSizePolicy::Expanding));
+
+ connect(m_filterInput, SIGNAL(textChanged(const QString&)),
+ this, SLOT(slotChangeFilter(const QString&)));
+ connect(m_clear, SIGNAL(clicked()), m_filterInput, SLOT(clear()));
+}
+
+FilterBar::~FilterBar()
+{
+}
+
+void FilterBar::saveSettings(KConfig* cfg)
+{
+ cfg->writeEntry("filter_bar_hidden",isHidden());
+ cfg->writeEntry("filter_bar_text",m_name_filter);
+ cfg->writeEntry("filter_bar_case_sensitive",m_case_sensitive->isChecked());
+}
+
+void FilterBar::loadSettings(KConfig* cfg)
+{
+ setHidden(cfg->readBoolEntry("filter_bar_hidden",true));
+ m_case_sensitive->setChecked(cfg->readBoolEntry("filter_bar_case_sensitive",true));
+ m_name_filter = cfg->readEntry("filter_bar_text",QString::null);
+ m_filterInput->setText(m_name_filter);
+}
+
+bool FilterBar::matchesFilter(kt::TorrentInterface* tc)
+{
+ bool cs = m_case_sensitive->isChecked();
+ if (m_name_filter.length() == 0)
+ return true;
+ else
+ return tc->getStats().torrent_name.contains(m_name_filter,cs);
+}
+
+void FilterBar::slotChangeFilter(const QString& nameFilter)
+{
+ m_name_filter = nameFilter;
+}
+
+void FilterBar::keyPressEvent(QKeyEvent* event)
+{
+ if ((event->key() == Qt::Key_Escape))
+ {
+ m_filterInput->clear();
+ m_name_filter = QString::null;
+ //hide();
+ }
+ else
+ QWidget::keyPressEvent(event);
+}
+
+void FilterBar::hideEvent(QHideEvent* event)
+{
+ m_filterInput->releaseKeyboard();
+ QWidget::hideEvent(event);
+}
+
+#include "filterbar.moc"
diff --git a/apps/ktorrent/filterbar.h b/apps/ktorrent/filterbar.h
new file mode 100644
index 0000000..4e7e913
--- /dev/null
+++ b/apps/ktorrent/filterbar.h
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Lukasz Fibinger <lucke@o2.pl> *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef FILTERBAR_H
+#define FILTERBAR_H
+
+#include <qwidget.h>
+
+class QLabel;
+class QCheckBox;
+class KConfig;
+class KLineEdit;
+class KPushButton;
+class KToolBarButton;
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+/**
+ * Provides a filterbar allowing to show only select items
+ *
+ * based on dolphin's one (made by Gregor Kališnik)
+ */
+class FilterBar : public QWidget
+{
+ Q_OBJECT
+
+public:
+ FilterBar ( QWidget *parent = 0, const char *name = 0 );
+ virtual ~FilterBar();
+
+ bool matchesFilter(kt::TorrentInterface* tc);
+ void saveSettings(KConfig* cfg);
+ void loadSettings(KConfig* cfg);
+
+private slots:
+ void slotChangeFilter(const QString& nameFilter);
+
+protected:
+ virtual void keyPressEvent ( QKeyEvent* event );
+ virtual void hideEvent(QHideEvent* event);
+
+private:
+ QLabel* m_filter;
+ KLineEdit* m_filterInput;
+ KPushButton* m_clear;
+ QCheckBox* m_case_sensitive;
+ KToolBarButton* m_close;
+ QString m_name_filter;
+};
+
+#endif
diff --git a/apps/ktorrent/generalpref.ui b/apps/ktorrent/generalpref.ui
new file mode 100644
index 0000000..e8ffe7d
--- /dev/null
+++ b/apps/ktorrent/generalpref.ui
@@ -0,0 +1,475 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>GeneralPref</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>GeneralPref</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>603</width>
+ <height>657</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>General Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="5" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>50</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="4" column="0">
+ <property name="name">
+ <cstring>groupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>Encryption</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>use_encryption</cstring>
+ </property>
+ <property name="text">
+ <string>Use protocol encryption</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Protocol encryption is used to prevent ISP's from slowing down bittorrent connections.</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>allow_unencrypted</cstring>
+ </property>
+ <property name="text">
+ <string>Allow unencrypted connections</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>If unchecked, you'll be able to connect only to clients supporting encryption.</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="3" column="0">
+ <property name="name">
+ <cstring>groupBox4</cstring>
+ </property>
+ <property name="title">
+ <string>DHT</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>&lt;b&gt;D&lt;/b&gt;istributed &lt;b&gt;H&lt;/b&gt;ash &lt;b&gt;T&lt;/b&gt;able protocol.&lt;br&gt;Decentralized peers exchange protocol. See manual for more info.</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>use_dht</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Use DHT to get additional peers</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>dht_port_label</cstring>
+ </property>
+ <property name="text">
+ <string>UDP port for DHT communication:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>dht_port</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>6881</number>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Custom IP</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>custom_ip_check</cstring>
+ </property>
+ <property name="text">
+ <string>Se&amp;nd the tracker a custom IP address or hostname</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>custom_ip_label</cstring>
+ </property>
+ <property name="text">
+ <string>Custom IP address or hostname:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>custom_ip</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox3_2</cstring>
+ </property>
+ <property name="title">
+ <string>System Tray Icon</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>show_systray_icon</cstring>
+ </property>
+ <property name="text">
+ <string>Show s&amp;ystem tray icon</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>show_speedbar</cstring>
+ </property>
+ <property name="text">
+ <string>Show speed &amp;bar in tray icon</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>show_popups</cstring>
+ </property>
+ <property name="text">
+ <string>Show system tray popup messages</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="2" colspan="1">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_3_2_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Upload bandwidth (in KB/sec):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>uploadBandwidth</cstring>
+ </property>
+ <property name="buttonSymbols">
+ <enum>UpDownArrows</enum>
+ </property>
+ <property name="maxValue">
+ <number>1000000</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_3_2_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Download bandwidth (in KB/sec):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>downloadBandwidth</cstring>
+ </property>
+ <property name="buttonSymbols">
+ <enum>UpDownArrows</enum>
+ </property>
+ <property name="maxValue">
+ <number>1000000</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>500</number>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Folders</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Folder to store temporary files:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>temp_dir</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>temp_dir</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>checkCompletedDir</cstring>
+ </property>
+ <property name="text">
+ <string>Move completed downloads to:</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>autosave_downloads_check</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Automatically save downloads to:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>autosave_location</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>urlCompletedDir</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>urlTorrentDir</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>checkTorrentDir</cstring>
+ </property>
+ <property name="text">
+ <string>Copy .torrent files to:</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>show_speedbar</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel1_3_2_2_2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>show_speedbar</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel1_3_2_2_2_2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>show_speedbar</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>downloadBandwidth</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>show_speedbar</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>uploadBandwidth</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkCompletedDir</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>urlCompletedDir</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>autosave_downloads_check</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>autosave_location</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkTorrentDir</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>urlTorrentDir</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>autosave_downloads_check</tabstop>
+ <tabstop>show_systray_icon</tabstop>
+</tabstops>
+<pixmapinproject/>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/groups/Makefile.am b/apps/ktorrent/groups/Makefile.am
new file mode 100644
index 0000000..c1c3308
--- /dev/null
+++ b/apps/ktorrent/groups/Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES = -I$(srcdir)/../../../libktorrent $(all_includes)
+METASOURCES = AUTO
+libgroups_la_LDFLAGS = $(all_libraries)
+noinst_LTLIBRARIES = libgroups.la
+noinst_HEADERS = activedownloadsgroup.h activegroup.h activeuploadsgroup.h \
+ allgroup.h downloadgroup.h group.h groupmanager.h groupview.h \
+ inactivedownloadsgroup.h inactivegroup.h inactiveuploadsgroup.h queueddownloadsgroup.h \
+ queueduploadsgroup.h torrentdrag.h torrentgroup.h uploadgroup.h userdownloadsgroup.h \
+ useruploadsgroup.h
+libgroups_la_SOURCES = activedownloadsgroup.cpp activegroup.cpp \
+ activeuploadsgroup.cpp allgroup.cpp downloadgroup.cpp group.cpp groupmanager.cpp groupview.cpp \
+ inactivedownloadsgroup.cpp inactivegroup.cpp inactiveuploadsgroup.cpp queueddownloadsgroup.cpp \
+ queueduploadsgroup.cpp torrentdrag.cpp torrentgroup.cpp uploadgroup.cpp userdownloadsgroup.cpp \
+ useruploadsgroup.cpp
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/apps/ktorrent/groups/activedownloadsgroup.cpp b/apps/ktorrent/groups/activedownloadsgroup.cpp
new file mode 100644
index 0000000..e4dd02f
--- /dev/null
+++ b/apps/ktorrent/groups/activedownloadsgroup.cpp
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "activedownloadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+ ActiveDownloadsGroup::ActiveDownloadsGroup()
+ : Group(i18n("Active downloads"),DOWNLOADS_ONLY_GROUP)
+ {
+ setIconByName("down");
+ }
+
+
+ ActiveDownloadsGroup::~ActiveDownloadsGroup()
+ {}
+
+}
+
+bool kt::ActiveDownloadsGroup::isMember(TorrentInterface * tor)
+{
+ if (!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return s.running && !s.completed;
+}
+
+
diff --git a/apps/ktorrent/groups/activedownloadsgroup.h b/apps/ktorrent/groups/activedownloadsgroup.h
new file mode 100644
index 0000000..de62493
--- /dev/null
+++ b/apps/ktorrent/groups/activedownloadsgroup.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 ACTIVEDOWNLOADSGROUP_H
+#define ACTIVEDOWNLOADSGROUP_H
+
+#include "group.h"
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Group for active downloads.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+
+ class ActiveDownloadsGroup : public Group
+ {
+
+ public:
+ ActiveDownloadsGroup();
+ virtual ~ActiveDownloadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+}
+#endif
diff --git a/apps/ktorrent/groups/activegroup.cpp b/apps/ktorrent/groups/activegroup.cpp
new file mode 100644
index 0000000..48a60ae
--- /dev/null
+++ b/apps/ktorrent/groups/activegroup.cpp
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "activegroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ActiveGroup::ActiveGroup()
+ : Group(i18n("Active torrents"),MIXED_GROUP)
+{
+ setIconByName("metacontact_online");
+}
+
+
+ActiveGroup::~ActiveGroup()
+{}
+
+}
+
+bool kt::ActiveGroup::isMember(TorrentInterface * tor)
+{
+ if(!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+ return s.running;
+}
+
+
diff --git a/apps/ktorrent/groups/activegroup.h b/apps/ktorrent/groups/activegroup.h
new file mode 100644
index 0000000..73e2aef
--- /dev/null
+++ b/apps/ktorrent/groups/activegroup.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 ACTIVEGROUP_H
+#define ACTIVEGROUP_H
+
+#include "group.h"
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Group for active torrents.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+
+ class ActiveGroup : public Group
+ {
+
+ public:
+ ActiveGroup();
+ virtual ~ActiveGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+}
+#endif
diff --git a/apps/ktorrent/groups/activeuploadsgroup.cpp b/apps/ktorrent/groups/activeuploadsgroup.cpp
new file mode 100644
index 0000000..aa50e97
--- /dev/null
+++ b/apps/ktorrent/groups/activeuploadsgroup.cpp
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "activeuploadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ ActiveUploadsGroup::ActiveUploadsGroup()
+ : Group(i18n("Active uploads"), UPLOADS_ONLY_GROUP)
+ {
+ setIconByName("up");
+ }
+
+
+ ActiveUploadsGroup::~ActiveUploadsGroup()
+ {}
+
+}
+
+bool kt::ActiveUploadsGroup::isMember(TorrentInterface * tor)
+{
+ if (!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return s.running && s.completed;
+}
+
+
diff --git a/apps/ktorrent/groups/activeuploadsgroup.h b/apps/ktorrent/groups/activeuploadsgroup.h
new file mode 100644
index 0000000..02fd468
--- /dev/null
+++ b/apps/ktorrent/groups/activeuploadsgroup.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 ACTIVEUPLOADSGROUP_H
+#define ACTIVEUPLOADSGROUP_H
+
+#include "group.h"
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Group for active uploads.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+
+ class ActiveUploadsGroup : public Group
+ {
+
+ public:
+ ActiveUploadsGroup();
+ virtual ~ActiveUploadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+}
+#endif
diff --git a/apps/ktorrent/groups/allgroup.cpp b/apps/ktorrent/groups/allgroup.cpp
new file mode 100644
index 0000000..eba5391
--- /dev/null
+++ b/apps/ktorrent/groups/allgroup.cpp
@@ -0,0 +1,41 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include "allgroup.h"
+
+namespace kt
+{
+
+ AllGroup::AllGroup() : Group(i18n("All Torrents"),MIXED_GROUP)
+ {
+ setIconByName("folder");
+ }
+
+
+ AllGroup::~AllGroup()
+ {}
+
+
+ bool AllGroup::isMember(TorrentInterface* tor)
+ {
+ return tor != 0;
+ }
+
+}
diff --git a/apps/ktorrent/groups/allgroup.h b/apps/ktorrent/groups/allgroup.h
new file mode 100644
index 0000000..399691b
--- /dev/null
+++ b/apps/ktorrent/groups/allgroup.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTALLGROUP_H
+#define KTALLGROUP_H
+
+#include <group.h>
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class AllGroup : public Group
+ {
+ public:
+ AllGroup();
+ virtual ~AllGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/downloadgroup.cpp b/apps/ktorrent/groups/downloadgroup.cpp
new file mode 100644
index 0000000..085eb77
--- /dev/null
+++ b/apps/ktorrent/groups/downloadgroup.cpp
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <interfaces/torrentinterface.h>
+#include "downloadgroup.h"
+
+namespace kt
+{
+
+ DownloadGroup::DownloadGroup() : Group(i18n("Downloads"),DOWNLOADS_ONLY_GROUP)
+ {
+ setIconByName("down");
+ }
+
+
+ DownloadGroup::~DownloadGroup()
+ {}
+
+
+ bool DownloadGroup::isMember(TorrentInterface* tor)
+ {
+ if (!tor)
+ return false;
+
+ return !tor->getStats().completed;
+ }
+
+}
diff --git a/apps/ktorrent/groups/downloadgroup.h b/apps/ktorrent/groups/downloadgroup.h
new file mode 100644
index 0000000..959f74b
--- /dev/null
+++ b/apps/ktorrent/groups/downloadgroup.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTDOWNLOADGROUP_H
+#define KTDOWNLOADGROUP_H
+
+#include <group.h>
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class DownloadGroup : public Group
+ {
+ public:
+ DownloadGroup();
+ virtual ~DownloadGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/group.cpp b/apps/ktorrent/groups/group.cpp
new file mode 100644
index 0000000..b8441a7
--- /dev/null
+++ b/apps/ktorrent/groups/group.cpp
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kiconloader.h>
+#include <kglobal.h>
+#include "group.h"
+
+namespace kt
+{
+
+ Group::Group(const QString & name,int flags) : name(name),flags(flags)
+ {}
+
+
+ Group::~Group()
+ {}
+
+ void Group::save(bt::BEncoder*)
+ {
+ }
+
+ void Group::load(bt::BDictNode* )
+ {
+ }
+
+ void Group::setIconByName(const QString & in)
+ {
+ icon_name = in;
+ icon = KGlobal::iconLoader()->loadIcon(in,KIcon::Small);
+ }
+
+ void Group::rename(const QString & nn)
+ {
+ name = nn;
+ }
+
+ void Group::torrentRemoved(TorrentInterface* )
+ {}
+
+ void Group::removeTorrent(TorrentInterface* )
+ {}
+
+ void Group::addTorrent(TorrentInterface* )
+ {}
+}
diff --git a/apps/ktorrent/groups/group.h b/apps/ktorrent/groups/group.h
new file mode 100644
index 0000000..e1fa7ab
--- /dev/null
+++ b/apps/ktorrent/groups/group.h
@@ -0,0 +1,133 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTGROUP_H
+#define KTGROUP_H
+
+#include <qstring.h>
+#include <qpixmap.h>
+
+namespace bt
+{
+ class BEncoder;
+ class BDictNode;
+}
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Base class for all groups. Subclasses should only implement the
+ * isMember function, but can also provide save and load
+ * functionality.
+ */
+ class Group
+ {
+ protected:
+ QString name;
+ QPixmap icon;
+ QString icon_name;
+ int flags;
+ public:
+ enum Properties
+ {
+ UPLOADS_ONLY_GROUP = 1,
+ DOWNLOADS_ONLY_GROUP = 2,
+ MIXED_GROUP = 3,
+ CUSTOM_GROUP = 4
+ };
+ /**
+ * Create a new group.
+ * @param name The name of the group
+ * @param flags Properties of the group
+ */
+ Group(const QString & name,int flags);
+ virtual ~Group();
+
+ /// See if this is a standard group.
+ bool isStandardGroup() const {return !(flags & CUSTOM_GROUP);}
+
+ /// Get the group flags
+ int groupFlags() const {return flags;}
+
+ /**
+ * Rename the group.
+ * @param nn The new name
+ */
+ void rename(const QString & nn);
+
+ /**
+ * Set the group icon by name.
+ * @param in The icon name
+ */
+ void setIconByName(const QString & in);
+
+ /// Get the name of the group
+ const QString & groupName() const {return name;}
+
+ /// Get the icon of the group
+ const QPixmap & groupIcon() const {return icon;}
+
+ /**
+ * Save the torrents.The torrents should be save in a bencoded file.
+ * @param enc The BEncoder
+ */
+ virtual void save(bt::BEncoder* enc);
+
+
+ /**
+ * Load the torrents of the group from a BDictNode.
+ * @param n The BDictNode
+ */
+ virtual void load(bt::BDictNode* n);
+
+
+ /**
+ * Test if a torrent is a member of this group.
+ * @param tor The torrent
+ */
+ virtual bool isMember(TorrentInterface* tor) = 0;
+
+ /**
+ * The torrent has been removed and is about to be deleted.
+ * Subclasses should make sure that they don't have dangling
+ * pointers to this torrent.
+ * @param tor The torrent
+ */
+ virtual void torrentRemoved(TorrentInterface* tor);
+
+ /**
+ * Subclasses should implement this, if they want to have torrents added to them.
+ * @param tor The torrent
+ */
+ virtual void addTorrent(TorrentInterface* tor);
+
+ /**
+ * Subclasses should implement this, if they want to have torrents removed from them.
+ * @param tor The torrent
+ */
+ virtual void removeTorrent(TorrentInterface* tor);
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/groupmanager.cpp b/apps/ktorrent/groups/groupmanager.cpp
new file mode 100644
index 0000000..b6a84c4
--- /dev/null
+++ b/apps/ktorrent/groups/groupmanager.cpp
@@ -0,0 +1,221 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/file.h>
+#include <util/fileops.h>
+#include <util/error.h>
+#include <torrent/bnode.h>
+#include <torrent/bdecoder.h>
+#include <torrent/bencoder.h>
+#include "groupmanager.h"
+#include "torrentgroup.h"
+#include "allgroup.h"
+#include "downloadgroup.h"
+#include "uploadgroup.h"
+#include "torrentgroup.h"
+#include "queueddownloadsgroup.h"
+#include "queueduploadsgroup.h"
+#include "userdownloadsgroup.h"
+#include "useruploadsgroup.h"
+#include "inactivegroup.h"
+#include "inactivedownloadsgroup.h"
+#include "inactiveuploadsgroup.h"
+#include "activegroup.h"
+#include "activedownloadsgroup.h"
+#include "activeuploadsgroup.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ GroupManager::GroupManager()
+ {
+ setAutoDelete(true);
+ default_groups.setAutoDelete(true);
+
+ Group* g = new AllGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new UploadGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new DownloadGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new QueuedDownloadsGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new QueuedUploadsGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new UserDownloadsGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new UserUploadsGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new ActiveGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new ActiveUploadsGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new ActiveDownloadsGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new InactiveGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new InactiveUploadsGroup();
+ default_groups.insert(g->groupName(),g);
+
+ g = new InactiveDownloadsGroup();
+ default_groups.insert(g->groupName(),g);
+ }
+
+
+ GroupManager::~GroupManager()
+ {
+ }
+
+
+ Group* GroupManager::newGroup(const QString & name)
+ {
+ if (find(name))
+ return 0;
+
+ Group* g = new TorrentGroup(name);
+ insert(name,g);
+ return g;
+ }
+
+ bool GroupManager::canRemove(const Group* g) const
+ {
+ return default_groups.find(g->groupName()) == 0;
+ }
+
+
+ void GroupManager::saveGroups(const QString & fn)
+ {
+ bt::File fptr;
+ if (!fptr.open(fn,"wb"))
+ {
+ bt::Out() << "Cannot open " << fn << " : " << fptr.errorString() << bt::endl;
+ return;
+ }
+
+ try
+ {
+ bt::BEncoder enc(&fptr);
+
+ enc.beginList();
+ for (iterator i = begin();i != end();i++)
+ {
+ i->second->save(&enc);
+ }
+ enc.end();
+ }
+ catch (bt::Error & err)
+ {
+ bt::Out() << "Error : " << err.toString() << endl;
+ return;
+ }
+ }
+
+
+
+ void GroupManager::loadGroups(const QString & fn)
+ {
+ bt::File fptr;
+ if (!fptr.open(fn,"rb"))
+ {
+ bt::Out() << "Cannot open " << fn << " : " << fptr.errorString() << bt::endl;
+ return;
+ }
+ try
+ {
+ Uint32 fs = bt::FileSize(fn);
+ QByteArray data(fs);
+ fptr.read(data.data(),fs);
+
+ BDecoder dec(data,false);
+ bt::BNode* n = dec.decode();
+ if (!n || n->getType() != bt::BNode::LIST)
+ throw bt::Error("groups file corrupt");
+
+ BListNode* ln = (BListNode*)n;
+ for (Uint32 i = 0;i < ln->getNumChildren();i++)
+ {
+ BDictNode* dn = ln->getDict(i);
+ if (!dn)
+ continue;
+
+ TorrentGroup* g = new TorrentGroup("dummy");
+
+ try
+ {
+ g->load(dn);
+ }
+ catch (...)
+ {
+ delete g;
+ throw;
+ }
+
+ if (!find(g->groupName()))
+ insert(g->groupName(),g);
+ else
+ delete g;
+ }
+ }
+ catch (bt::Error & err)
+ {
+ bt::Out() << "Error : " << err.toString() << endl;
+ return;
+ }
+ }
+
+ void GroupManager::torrentRemoved(TorrentInterface* ti)
+ {
+ for (iterator i = begin(); i != end();i++)
+ {
+ i->second->torrentRemoved(ti);
+ }
+ }
+
+ void GroupManager::renameGroup(const QString & old_name,const QString & new_name)
+ {
+ Group* g = find(old_name);
+ if (!g)
+ return;
+
+ setAutoDelete(false);
+ erase(old_name);
+ g->rename(new_name);
+ insert(new_name,g);
+ setAutoDelete(true);
+ }
+
+ Group* GroupManager::findDefault(const QString & name)
+ {
+ return default_groups.find(name);
+ }
+}
diff --git a/apps/ktorrent/groups/groupmanager.h b/apps/ktorrent/groups/groupmanager.h
new file mode 100644
index 0000000..d988b70
--- /dev/null
+++ b/apps/ktorrent/groups/groupmanager.h
@@ -0,0 +1,132 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTGROUPMANAGER_H
+#define KTGROUPMANAGER_H
+
+#include <qstring.h>
+#include <klocale.h>
+#include <util/ptrmap.h>
+
+
+namespace kt
+{
+ class Group;
+ class TorrentInterface;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Manages all user created groups and the standard groups.
+ */
+ class GroupManager : public bt::PtrMap<QString,Group>
+ {
+ bt::PtrMap<QString,Group> default_groups;
+
+ public:
+ GroupManager();
+ virtual ~GroupManager();
+
+ /**
+ * Create a new user created group.
+ * @param name Name of the group
+ * @return Pointer to the group or NULL, if another group already exists with the same name.
+ */
+ Group* newGroup(const QString & name);
+
+ /// Get the group off all torrents
+ Group* allGroup() {return findDefault(i18n("All Torrents"));}
+
+ /// Get the group of downloads
+ Group* downloadGroup() {return findDefault(i18n("Downloads"));}
+
+ /// Get the group of seeds
+ Group* uploadGroup() {return findDefault(i18n("Uploads"));}
+
+ /// Get the group of queued downloads
+ Group* queuedDownloadsGroup() { return findDefault(i18n("Queued downloads")); }
+
+ /// Get the group of queued seeds
+ Group* queuedUploadsGroup() { return findDefault(i18n("Queued uploads")); }
+
+ /// Get the group of user controlled downloads
+ Group* userDownloadsGroup() { return findDefault(i18n("User downloads")); }
+
+ /// Get the group of user controlled seeds
+ Group* userUploadsGroup() { return findDefault(i18n("User uploads")); }
+
+ /// Get the group of inactive torrents
+ Group* inactiveGroup() { return findDefault(i18n("Inactive torrents")); }
+
+ /// Get the group of inactive downloads
+ Group* inactiveDownloadsGroup() { return findDefault(i18n("Inactive downloads")); }
+
+ /// Get the group of inactive uploads
+ Group* inactiveUploadsGroup() { return findDefault(i18n("Inactive uploads")); }
+
+ /// Get the group of inactive torrents
+ Group* activeGroup() { return findDefault(i18n("Active torrents")); }
+
+ /// Get the group of inactive downloads
+ Group* activeDownloadsGroup() { return findDefault(i18n("Active downloads")); }
+
+ /// Get the group of inactive uploads
+ Group* activeUploadsGroup() { return findDefault(i18n("Active uploads")); }
+
+ /// Find a default group by the given name
+ Group* findDefault(const QString & name);
+
+ /**
+ * Save the groups to a file.
+ * @param fn The filename
+ */
+ void saveGroups(const QString & fn);
+
+ /**
+ * Load the groups from a file
+ * @param fn The filename
+ */
+ void loadGroups(const QString & fn);
+
+ /**
+ * See if we can remove a group.
+ * @param g The group
+ * @return true on any user created group, false on the standard ones
+ */
+ bool canRemove(const Group* g) const;
+
+ /**
+ * A torrent has been removed. This function checks all groups and
+ * removes the torrent from it.
+ * @param ti The torrent
+ */
+ void torrentRemoved(TorrentInterface* ti);
+
+ /**
+ * Rename a group.
+ * @param old_name The old name
+ * @param new_name The new name
+ */
+ void renameGroup(const QString & old_name,const QString & new_name);
+
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/groupview.cpp b/apps/ktorrent/groups/groupview.cpp
new file mode 100644
index 0000000..3d0751f
--- /dev/null
+++ b/apps/ktorrent/groups/groupview.cpp
@@ -0,0 +1,360 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kpopupmenu.h>
+#include <kaction.h>
+#include <kmessagebox.h>
+#include <kinputdialog.h>
+#include <kstandarddirs.h>
+#include <kpopupmenu.h>
+#include <qheader.h>
+#include <util/log.h>
+#include <interfaces/torrentinterface.h>
+#include "groupview.h"
+#include "group.h"
+#include "groupmanager.h"
+#include "torrentgroup.h"
+#include "../viewmanager.h"
+#include "../ktorrentview.h"
+
+
+using namespace bt;
+
+namespace kt
+{
+ GroupViewItem::GroupViewItem(GroupView* parent,Group* g) : KListViewItem(parent),gview(parent)
+ {
+ setText(0,g->groupName());
+ setPixmap(0,g->groupIcon());
+ }
+
+ GroupViewItem::GroupViewItem(GroupView* gview,KListViewItem* parent,Group* g) : KListViewItem(parent),gview(gview)
+ {
+ setText(0,g->groupName());
+ setPixmap(0,g->groupIcon());
+ }
+
+ GroupViewItem::~GroupViewItem()
+ {
+ }
+
+ int GroupViewItem::compare(QListViewItem* i,int ,bool ) const
+ {
+ if (text(1).isNull() && i->text(1).isNull())
+ return QString::compare(text(0),i->text(0));
+ else
+ return QString::compare(text(1),i->text(1));
+ }
+
+ GroupView::GroupView(ViewManager* view,KActionCollection* col,QWidget *parent, const char *name)
+ : KListView(parent, name),view(view),custom_root(0)
+ {
+ setFullWidth(true);
+ setRootIsDecorated(true);
+ setAcceptDrops(true);
+ setDropHighlighter(true);
+ setDropVisualizer(true);
+ addColumn(i18n("Groups"));
+ header()->hide();
+
+ gman = new GroupManager();
+
+ current = gman->allGroup();
+
+ connect(this,SIGNAL(clicked(QListViewItem*)),this,SLOT(onExecuted( QListViewItem* )));
+ connect(this,SIGNAL(contextMenu(KListView*,QListViewItem*,const QPoint & )),
+ this,SLOT(showContextMenu( KListView*, QListViewItem*, const QPoint& )));
+ connect(this,SIGNAL(dropped(QDropEvent*,QListViewItem*)),
+ this,SLOT(onDropped( QDropEvent*, QListViewItem* )));
+
+ current_item = 0;
+ menu = 0;
+ createMenu(col);
+ save_file = KGlobal::dirs()->saveLocation("data","ktorrent") + "groups";
+ GroupViewItem* all = addGroup(gman->allGroup(),0);
+ GroupViewItem* dwnld = addGroup(gman->downloadGroup(),all);
+ GroupViewItem* upld = addGroup(gman->uploadGroup(),all);
+ GroupViewItem* inactive = addGroup(gman->inactiveGroup(), all);
+ GroupViewItem* active = addGroup(gman->activeGroup(), all);
+ addGroup(gman->queuedDownloadsGroup(), dwnld);
+ addGroup(gman->queuedUploadsGroup(), upld);
+ addGroup(gman->userDownloadsGroup(), dwnld);
+ addGroup(gman->userUploadsGroup(), upld);
+ addGroup(gman->inactiveDownloadsGroup(), inactive);
+ addGroup(gman->inactiveUploadsGroup(), inactive);
+ addGroup(gman->activeDownloadsGroup(), active);
+ addGroup(gman->activeUploadsGroup(), active);
+
+ custom_root = new KListViewItem(all,i18n("Custom Groups"));
+ custom_root->setPixmap(0,KGlobal::iconLoader()->loadIcon("folder",KIcon::Small));
+ setOpen(custom_root,true);
+ }
+
+
+ GroupView::~GroupView()
+ {
+ delete gman;
+ }
+
+ void GroupView::saveGroups()
+ {
+ gman->saveGroups(save_file);
+ }
+
+ void GroupView::loadGroups()
+ {
+ // load the groups from the groups file
+ gman->loadGroups(save_file);
+ for (GroupManager::iterator i = gman->begin();i != gman->end();i++)
+ {
+ addGroup(i->second,custom_root);
+ }
+ sort();
+ }
+
+ void GroupView::createMenu(KActionCollection* col)
+ {
+ menu = new KPopupMenu(this);
+
+ new_group = new KAction(i18n("New Group"),"filenew",0,
+ this, SLOT(addGroup()),col, "New Group");
+
+ edit_group = new KAction(i18n("Edit Name"),"edit",0,
+ this, SLOT(editGroupName()),col,"Edit Group Name");
+
+ remove_group = new KAction(i18n("Remove Group"),"remove",0,
+ this, SLOT(removeGroup()),col,"Remove Group");
+
+ open_in_new_tab = new KAction(i18n("Open Tab"),"fileopen",0,
+ this,SLOT(openView()),col,"Open Tab");
+
+ open_in_new_tab->plug(menu);
+ menu->insertSeparator();
+ new_group->plug(menu);
+ edit_group->plug(menu);
+ remove_group->plug(menu);
+ }
+
+ void GroupView::addGroup()
+ {
+ QString name = KInputDialog::getText(QString::null,i18n("Please enter the group name."));
+
+ if (name.isNull() || name.length() == 0)
+ return;
+
+ if (gman->find(name))
+ {
+ KMessageBox::error(this,i18n("The group %1 already exists.").arg(name));
+ return;
+ }
+
+ addGroup(gman->newGroup(name),custom_root);
+ saveGroups();
+ sort();
+ }
+
+ void GroupView::removeGroup()
+ {
+ if (!current_item)
+ return;
+
+ Group* g = groups.find(current_item);
+ if (!g)
+ return;
+
+ groupRemoved(g);
+ if (g == current)
+ {
+ current = gman->allGroup();
+ currentGroupChanged(current);
+ }
+
+ groups.erase(current_item);
+ gman->erase(g->groupName());
+ delete current_item;
+ current_item = 0;
+ saveGroups();
+ }
+
+ void GroupView::editGroupName()
+ {
+ if (!current_item)
+ return;
+
+ Group* g = groups.find(current_item);
+ if (!g)
+ return;
+
+ QString name = KInputDialog::getText(QString::null,i18n("Please enter the new group name."),g->groupName());
+
+ if (name.isNull() || name.length() == 0)
+ return;
+
+ if (g->groupName() == name)
+ return;
+
+ if (gman->find(name))
+ {
+ KMessageBox::error(this,i18n("The group %1 already exists.").arg(name));
+ }
+ else
+ {
+ gman->renameGroup(g->groupName(),name);
+ current_item->setText(0,name);
+ groupRenamed(g);
+ saveGroups();
+ sort();
+ }
+ }
+
+ GroupViewItem* GroupView::addGroup(Group* g,KListViewItem* parent)
+ {
+ GroupViewItem* li = 0;
+ if (parent)
+ {
+ li = new GroupViewItem(this,parent,g);
+ }
+ else
+ {
+ li = new GroupViewItem(this,g);
+ li->setText(1,g->groupName());
+ }
+
+ groups.insert(li,g);
+ if (custom_root && custom_root->childCount() == 1 && custom_root == parent)
+ setOpen(custom_root,true);
+
+ return li;
+ }
+
+ void GroupView::showContextMenu(KListView* ,QListViewItem* item,const QPoint & p)
+ {
+ current_item = dynamic_cast<GroupViewItem*>(item);
+
+ Group* g = 0;
+ if (current_item)
+ g = groups.find(current_item);
+
+ if (!g ||!gman->canRemove(g))
+ {
+ edit_group->setEnabled(false);
+ remove_group->setEnabled(false);
+ }
+ else
+ {
+ edit_group->setEnabled(true);
+ remove_group->setEnabled(true);
+ }
+
+ open_in_new_tab->setEnabled(g != 0);
+
+ menu->popup(p);
+ }
+
+ void GroupView::onExecuted(QListViewItem* item)
+ {
+ if (!item) return;
+
+ GroupViewItem* li = dynamic_cast<GroupViewItem*>(item);
+ if (!li)
+ return;
+
+ Group* g = groups.find(li);
+ if (g)
+ {
+ current = g;
+ currentGroupChanged(g);
+ }
+ }
+
+ void GroupView::onDropped(QDropEvent* e,QListViewItem *after)
+ {
+ GroupViewItem* li = dynamic_cast<GroupViewItem*>(after);
+ if (!li)
+ return;
+
+ TorrentGroup* g = dynamic_cast<TorrentGroup*>(groups.find(li));
+ if (g)
+ {
+ QValueList<TorrentInterface*> sel;
+ view->getSelection(sel);
+ QValueList<TorrentInterface*>::iterator i = sel.begin();
+ while (i != sel.end())
+ {
+ g->add(*i);
+ i++;
+ }
+ saveGroups();
+ }
+ }
+
+ bool GroupView::acceptDrag(QDropEvent* event) const
+ {
+ return event->provides("application/x-ktorrent-drag-object");
+ }
+
+ void GroupView::onTorrentRemoved(kt::TorrentInterface* tc)
+ {
+ gman->torrentRemoved(tc);
+ saveGroups();
+ }
+
+ void GroupView::updateGroupsSubMenu(KPopupMenu* gsm)
+ {
+ gsm->clear();
+ for (GroupManager::iterator i = gman->begin();i != gman->end();i++)
+ {
+ gsm->insertItem(i->first);
+ }
+ }
+
+ void GroupView::onGroupsSubMenuItemActivated(KTorrentView* v,const QString & group)
+ {
+ Group* g = gman->find(group);
+ if (g)
+ {
+ v->addSelectionToGroup(g);
+ saveGroups();
+ }
+ }
+
+ const Group* GroupView::findGroup(const QString & name) const
+ {
+ Group* g = gman->find(name);
+ if (!g)
+ g = gman->findDefault(name);
+
+ return g;
+ }
+
+ void GroupView::openView()
+ {
+ if (!current_item)
+ return;
+
+ Group* g = groups.find(current_item);
+ if (g)
+ openNewTab(g);
+ }
+}
+
+#include "groupview.moc"
diff --git a/apps/ktorrent/groups/groupview.h b/apps/ktorrent/groups/groupview.h
new file mode 100644
index 0000000..de5befb
--- /dev/null
+++ b/apps/ktorrent/groups/groupview.h
@@ -0,0 +1,125 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTGROUPVIEW_H
+#define KTGROUPVIEW_H
+
+#include <klistview.h>
+#include <util/ptrmap.h>
+
+class KPopupMenu;
+class KActionCollection;
+class ViewManager;
+class KTorrentView;
+
+namespace kt
+{
+ class Group;
+ class GroupView;
+ class GroupManager;
+ class TorrentInterface;
+
+ class GroupViewItem : public KListViewItem
+ {
+ Group* g;
+ GroupView* gview;
+ public:
+ GroupViewItem(GroupView* parent,Group* g);
+ GroupViewItem(GroupView* gview,KListViewItem* parent,Group* g);
+ virtual ~GroupViewItem();
+
+ virtual int compare(QListViewItem* i,int col,bool ascending) const;
+ };
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class GroupView : public KListView
+ {
+ Q_OBJECT
+ public:
+ GroupView(ViewManager* view,KActionCollection* col,QWidget *parent = 0, const char *name = 0);
+ virtual ~GroupView();
+
+ /// Get the current group
+ Group* currentGroup() {return current;}
+
+ /// Save all groups
+ void saveGroups();
+
+ /// Load groups
+ void loadGroups();
+
+ /// Find a group by its name
+ const Group* findGroup(const QString & name) const;
+
+ GroupManager* groupManager() const { return gman; }
+
+ public slots:
+ void onTorrentRemoved(kt::TorrentInterface* tc);
+
+ /// Update a groups sub menu
+ void updateGroupsSubMenu(KPopupMenu* gsm);
+
+ /// An item was activated in the groups sub menu of a KTorrentView
+ void onGroupsSubMenuItemActivated(KTorrentView* v,const QString & group);
+
+ private slots:
+ void onExecuted(QListViewItem* item);
+ void showContextMenu(KListView* ,QListViewItem* item,const QPoint & p);
+ void addGroup();
+ void removeGroup();
+ void editGroupName();
+ void onDropped(QDropEvent* e,QListViewItem *after);
+ virtual bool acceptDrag(QDropEvent* event) const;
+ void openView();
+
+
+ signals:
+ void currentGroupChanged(kt::Group* g);
+ void groupRenamed(kt::Group* g);
+ void openNewTab(kt::Group* g);
+ void groupRemoved(kt::Group* g);
+
+ private:
+ void createMenu(KActionCollection* col);
+ GroupViewItem* addGroup(Group* g,KListViewItem* parent);
+
+ private:
+ ViewManager* view;
+ KListViewItem* custom_root;
+ bt::PtrMap<GroupViewItem*,Group> groups;
+ GroupManager* gman;
+ QString save_file;
+
+ Group* current;
+
+ GroupViewItem* current_item;
+ KPopupMenu* menu;
+ KAction* new_group;
+ KAction* edit_group;
+ KAction* remove_group;
+ KAction* open_in_new_tab;
+
+ friend class GroupViewItem;
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/inactivedownloadsgroup.cpp b/apps/ktorrent/groups/inactivedownloadsgroup.cpp
new file mode 100644
index 0000000..b383160
--- /dev/null
+++ b/apps/ktorrent/groups/inactivedownloadsgroup.cpp
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "inactivedownloadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ InactiveDownloadsGroup::InactiveDownloadsGroup()
+ : Group(i18n("Inactive downloads"), DOWNLOADS_ONLY_GROUP)
+ {
+ setIconByName("down");
+ }
+
+
+ InactiveDownloadsGroup::~InactiveDownloadsGroup()
+ {}
+
+}
+
+bool kt::InactiveDownloadsGroup::isMember(TorrentInterface * tor)
+{
+ if (!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return !s.running && !s.completed;
+}
+
+
diff --git a/apps/ktorrent/groups/inactivedownloadsgroup.h b/apps/ktorrent/groups/inactivedownloadsgroup.h
new file mode 100644
index 0000000..4b80ca6
--- /dev/null
+++ b/apps/ktorrent/groups/inactivedownloadsgroup.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 INACTIVEDOWNLOADSGROUP_H
+#define INACTIVEDOWNLOADSGROUP_H
+
+#include "group.h"
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Group for inactive downloads.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+
+ class InactiveDownloadsGroup : public Group
+ {
+
+ public:
+ InactiveDownloadsGroup();
+ virtual ~InactiveDownloadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+}
+#endif
diff --git a/apps/ktorrent/groups/inactivegroup.cpp b/apps/ktorrent/groups/inactivegroup.cpp
new file mode 100644
index 0000000..3270697
--- /dev/null
+++ b/apps/ktorrent/groups/inactivegroup.cpp
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "inactivegroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+InactiveGroup::InactiveGroup()
+ : Group(i18n("Inactive torrents"),MIXED_GROUP)
+{
+ setIconByName("metacontact_offline");
+}
+
+
+InactiveGroup::~InactiveGroup()
+{}
+
+}
+
+bool kt::InactiveGroup::isMember(TorrentInterface * tor)
+{
+ if(!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+ return !s.running;
+}
+
+
diff --git a/apps/ktorrent/groups/inactivegroup.h b/apps/ktorrent/groups/inactivegroup.h
new file mode 100644
index 0000000..027138f
--- /dev/null
+++ b/apps/ktorrent/groups/inactivegroup.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 INACTIVEGROUP_H
+#define INACTIVEGROUP_H
+
+#include "group.h"
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Group for inactive torrents.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+
+ class InactiveGroup : public Group
+ {
+
+ public:
+ InactiveGroup();
+ virtual ~InactiveGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+}
+#endif
diff --git a/apps/ktorrent/groups/inactiveuploadsgroup.cpp b/apps/ktorrent/groups/inactiveuploadsgroup.cpp
new file mode 100644
index 0000000..8110a1a
--- /dev/null
+++ b/apps/ktorrent/groups/inactiveuploadsgroup.cpp
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "inactiveuploadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ InactiveUploadsGroup::InactiveUploadsGroup()
+ : Group(i18n("Inactive uploads"), UPLOADS_ONLY_GROUP)
+ {
+ setIconByName("up");
+ }
+
+
+ InactiveUploadsGroup::~InactiveUploadsGroup()
+ {}
+
+}
+
+bool kt::InactiveUploadsGroup::isMember(TorrentInterface * tor)
+{
+ if (!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return !s.running && s.completed;
+}
+
+
diff --git a/apps/ktorrent/groups/inactiveuploadsgroup.h b/apps/ktorrent/groups/inactiveuploadsgroup.h
new file mode 100644
index 0000000..78e1840
--- /dev/null
+++ b/apps/ktorrent/groups/inactiveuploadsgroup.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 INACTIVEUPLOADSGROUP_H
+#define INACTIVEUPLOADSGROUP_H
+
+#include "group.h"
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Group for inactive uploads.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+
+ class InactiveUploadsGroup : public Group
+ {
+
+ public:
+ InactiveUploadsGroup();
+ virtual ~InactiveUploadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+}
+#endif
diff --git a/apps/ktorrent/groups/queueddownloadsgroup.cpp b/apps/ktorrent/groups/queueddownloadsgroup.cpp
new file mode 100644
index 0000000..c182472
--- /dev/null
+++ b/apps/ktorrent/groups/queueddownloadsgroup.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "queueddownloadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ QueuedDownloadsGroup::QueuedDownloadsGroup()
+ : Group(i18n("Queued downloads"),DOWNLOADS_ONLY_GROUP)
+ {
+ setIconByName("ktqueuemanager");
+ }
+
+
+ QueuedDownloadsGroup::~QueuedDownloadsGroup()
+ {}
+}
+
+bool kt::QueuedDownloadsGroup::isMember(TorrentInterface* tor)
+{
+ if(!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return !s.user_controlled && !s.completed;
+}
diff --git a/apps/ktorrent/groups/queueddownloadsgroup.h b/apps/ktorrent/groups/queueddownloadsgroup.h
new file mode 100644
index 0000000..3e436a5
--- /dev/null
+++ b/apps/ktorrent/groups/queueddownloadsgroup.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTQUEUEDDOWNLOADSGROUP_H
+#define KTQUEUEDDOWNLOADSGROUP_H
+
+#include <group.h>
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Torrents that are queued and in downloading phase.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class QueuedDownloadsGroup : public Group
+ {
+ public:
+ QueuedDownloadsGroup();
+ virtual ~QueuedDownloadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/queueduploadsgroup.cpp b/apps/ktorrent/groups/queueduploadsgroup.cpp
new file mode 100644
index 0000000..8c346a4
--- /dev/null
+++ b/apps/ktorrent/groups/queueduploadsgroup.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "queueduploadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ QueuedUploadsGroup::QueuedUploadsGroup()
+ : Group(i18n("Queued uploads"),UPLOADS_ONLY_GROUP)
+ {
+ setIconByName("ktqueuemanager");
+ }
+
+
+ QueuedUploadsGroup::~QueuedUploadsGroup()
+ {}
+}
+
+bool kt::QueuedUploadsGroup::isMember(TorrentInterface* tor)
+{
+ if(!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return !s.user_controlled && s.completed;
+}
diff --git a/apps/ktorrent/groups/queueduploadsgroup.h b/apps/ktorrent/groups/queueduploadsgroup.h
new file mode 100644
index 0000000..675da62
--- /dev/null
+++ b/apps/ktorrent/groups/queueduploadsgroup.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTQUEUEDUPLOADSGROUP_H
+#define KTQUEUEDUPLOADSGROUP_H
+
+#include <group.h>
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Torrents that are queued and in seeding phase.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class QueuedUploadsGroup : public Group
+ {
+ public:
+ QueuedUploadsGroup();
+ virtual ~QueuedUploadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/torrentdrag.cpp b/apps/ktorrent/groups/torrentdrag.cpp
new file mode 100644
index 0000000..fc7b366
--- /dev/null
+++ b/apps/ktorrent/groups/torrentdrag.cpp
@@ -0,0 +1,37 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kiconloader.h>
+#include <kglobal.h>
+#include "torrentdrag.h"
+
+namespace kt
+{
+
+ TorrentDrag::TorrentDrag(QWidget* src, const char *name) : QStoredDrag("application/x-ktorrent-drag-object",src, name)
+ {
+ setPixmap(KGlobal::iconLoader()->loadIcon("player_playlist",KIcon::Small));
+ }
+
+
+ TorrentDrag::~TorrentDrag()
+ {}
+
+}
+#include "torrentdrag.moc"
diff --git a/apps/ktorrent/groups/torrentdrag.h b/apps/ktorrent/groups/torrentdrag.h
new file mode 100644
index 0000000..a926347
--- /dev/null
+++ b/apps/ktorrent/groups/torrentdrag.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTTORRENTDRAG_H
+#define KTTORRENTDRAG_H
+
+#include <qdragobject.h>
+
+namespace kt
+{
+
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class TorrentDrag : public QStoredDrag
+ {
+ Q_OBJECT
+ public:
+ TorrentDrag(QWidget* src,const char *name = 0);
+ virtual ~TorrentDrag();
+
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/torrentgroup.cpp b/apps/ktorrent/groups/torrentgroup.cpp
new file mode 100644
index 0000000..efb09a9
--- /dev/null
+++ b/apps/ktorrent/groups/torrentgroup.cpp
@@ -0,0 +1,147 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/error.h>
+#include <util/sha1hash.h>
+#include <torrent/bencoder.h>
+#include <torrent/bnode.h>
+#include <interfaces/torrentinterface.h>
+#include "torrentgroup.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ TorrentGroup::TorrentGroup(const QString& name): Group(name,MIXED_GROUP|CUSTOM_GROUP)
+ {
+ setIconByName("player_playlist");
+ }
+
+
+ TorrentGroup::~TorrentGroup()
+ {}
+
+
+ bool TorrentGroup::isMember(TorrentInterface* tor)
+ {
+ if (torrents.count(tor) > 0)
+ return true;
+
+
+ if (!hashes.empty())
+ {
+ if (hashes.count(tor->getInfoHash()))
+ {
+ /* bt::Out(SYS_GEN|LOG_DEBUG) <<
+ QString("TG %1 : Torrent %2 from hashes list").arg(groupName()).arg(tor->getStats().torrent_name) << endl;
+ */
+ hashes.erase(tor->getInfoHash());
+ torrents.insert(tor);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void TorrentGroup::add(TorrentInterface* tor)
+ {
+ torrents.insert(tor);
+ }
+
+ void TorrentGroup::remove(TorrentInterface* tor)
+ {
+ torrents.erase(tor);
+ }
+
+ void TorrentGroup::save(bt::BEncoder* enc)
+ {
+ enc->beginDict();
+ enc->write("name"); enc->write(name.local8Bit());
+ enc->write("icon"); enc->write(icon_name.local8Bit());
+ enc->write("hashes"); enc->beginList();
+ std::set<TorrentInterface*>::iterator i = torrents.begin();
+ while (i != torrents.end())
+ {
+ TorrentInterface* tc = *i;
+ // write the info hash, because that will be unique for each torrent
+ const bt::SHA1Hash & h = tc->getInfoHash();
+ enc->write(h.getData(),20);
+ i++;
+ }
+ std::set<bt::SHA1Hash>::iterator j = hashes.begin();
+ while (j != hashes.end())
+ {
+ enc->write(j->getData(),20);
+ j++;
+ }
+ enc->end();
+ enc->end();
+ }
+
+ void TorrentGroup::load(bt::BDictNode* dn)
+ {
+ BValueNode* vn = dn->getValue("name");
+ if (!vn || vn->data().getType() != bt::Value::STRING)
+ throw bt::Error("invalid or missing name");
+
+ QByteArray tmp = vn->data().toByteArray();
+ name = QString::fromLocal8Bit(tmp.data(),tmp.size());
+
+ vn = dn->getValue("icon");
+ if (!vn || vn->data().getType() != bt::Value::STRING)
+ throw bt::Error("invalid or missing icon");
+
+ tmp = vn->data().toByteArray();
+ setIconByName(QString::fromLocal8Bit(tmp.data(),tmp.size()));
+
+ BListNode* ln = dn->getList("hashes");
+ if (!ln)
+ return;
+
+ for (Uint32 i = 0;i < ln->getNumChildren();i++)
+ {
+ vn = ln->getValue(i);
+ if (!vn || vn->data().getType() != bt::Value::STRING)
+ continue;
+
+ QByteArray ba = vn->data().toByteArray();
+ if (ba.size() != 20)
+ continue;
+
+ hashes.insert(SHA1Hash((const Uint8*)ba.data()));
+ }
+ }
+
+ void TorrentGroup::torrentRemoved(TorrentInterface* tor)
+ {
+ torrents.erase(tor);
+ }
+
+ void TorrentGroup::removeTorrent(TorrentInterface* tor)
+ {
+ torrents.erase(tor);
+ }
+
+ void TorrentGroup::addTorrent(TorrentInterface* tor)
+ {
+ torrents.insert(tor);
+ }
+}
diff --git a/apps/ktorrent/groups/torrentgroup.h b/apps/ktorrent/groups/torrentgroup.h
new file mode 100644
index 0000000..40989fd
--- /dev/null
+++ b/apps/ktorrent/groups/torrentgroup.h
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTTORRENTGROUP_H
+#define KTTORRENTGROUP_H
+
+#include <set>
+#include <group.h>
+#include <util/sha1hash.h>
+
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class TorrentGroup : public Group
+ {
+ std::set<TorrentInterface*> torrents;
+ std::set<bt::SHA1Hash> hashes;
+ public:
+ TorrentGroup(const QString& name);
+ virtual ~TorrentGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+ virtual void save(bt::BEncoder* enc);
+ virtual void load(bt::BDictNode* n);
+ virtual void torrentRemoved(TorrentInterface* tor);
+ virtual void removeTorrent(TorrentInterface* tor);
+ virtual void addTorrent(TorrentInterface* tor);
+
+ void add(TorrentInterface* tor);
+ void remove(TorrentInterface* tor);
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/uploadgroup.cpp b/apps/ktorrent/groups/uploadgroup.cpp
new file mode 100644
index 0000000..9baca6d
--- /dev/null
+++ b/apps/ktorrent/groups/uploadgroup.cpp
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <interfaces/torrentinterface.h>
+#include "uploadgroup.h"
+
+namespace kt
+{
+
+ UploadGroup::UploadGroup() : Group(i18n("Uploads"),UPLOADS_ONLY_GROUP)
+ {
+ setIconByName("up");
+ }
+
+
+ UploadGroup::~UploadGroup()
+ {}
+
+
+ bool UploadGroup::isMember(TorrentInterface* tor)
+ {
+ if (!tor)
+ return false;
+
+ return tor->getStats().completed;
+ }
+
+}
diff --git a/apps/ktorrent/groups/uploadgroup.h b/apps/ktorrent/groups/uploadgroup.h
new file mode 100644
index 0000000..f90a5bd
--- /dev/null
+++ b/apps/ktorrent/groups/uploadgroup.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTUPLOADGROUP_H
+#define KTUPLOADGROUP_H
+
+#include <group.h>
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class UploadGroup : public Group
+ {
+ public:
+ UploadGroup();
+ virtual ~UploadGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/userdownloadsgroup.cpp b/apps/ktorrent/groups/userdownloadsgroup.cpp
new file mode 100644
index 0000000..6a4960b
--- /dev/null
+++ b/apps/ktorrent/groups/userdownloadsgroup.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "userdownloadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ UserDownloadsGroup::UserDownloadsGroup()
+ : Group(i18n("User downloads"),DOWNLOADS_ONLY_GROUP)
+ {
+ setIconByName("userconfig");
+ }
+
+
+ UserDownloadsGroup::~UserDownloadsGroup()
+ {}
+}
+
+bool kt::UserDownloadsGroup::isMember(TorrentInterface* tor)
+{
+ if(!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return s.user_controlled && !s.completed;
+}
diff --git a/apps/ktorrent/groups/userdownloadsgroup.h b/apps/ktorrent/groups/userdownloadsgroup.h
new file mode 100644
index 0000000..a77e7ac
--- /dev/null
+++ b/apps/ktorrent/groups/userdownloadsgroup.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTUSERDOWNLOADSGROUP_H
+#define KTUSERDOWNLOADSGROUP_H
+
+#include <group.h>
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Torrents that are user controlled and in downloading phase.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class UserDownloadsGroup : public Group
+ {
+ public:
+ UserDownloadsGroup();
+ virtual ~UserDownloadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/groups/useruploadsgroup.cpp b/apps/ktorrent/groups/useruploadsgroup.cpp
new file mode 100644
index 0000000..d0e78bd
--- /dev/null
+++ b/apps/ktorrent/groups/useruploadsgroup.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "useruploadsgroup.h"
+
+#include <klocale.h>
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+
+ UserUploadsGroup::UserUploadsGroup()
+ : Group(i18n("User uploads"),UPLOADS_ONLY_GROUP)
+ {
+ setIconByName("userconfig");
+ }
+
+
+ UserUploadsGroup::~UserUploadsGroup()
+ {}
+}
+
+bool kt::UserUploadsGroup::isMember(TorrentInterface* tor)
+{
+ if(!tor)
+ return false;
+
+ const kt::TorrentStats& s = tor->getStats();
+
+ return s.user_controlled && s.completed;
+}
diff --git a/apps/ktorrent/groups/useruploadsgroup.h b/apps/ktorrent/groups/useruploadsgroup.h
new file mode 100644
index 0000000..9286c88
--- /dev/null
+++ b/apps/ktorrent/groups/useruploadsgroup.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTUSERUPLOADSGROUP_H
+#define KTUSERUPLOADSGROUP_H
+
+#include <group.h>
+
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * Torrents that are user controlled and in seeding phase.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class UserUploadsGroup : public Group
+ {
+ public:
+ UserUploadsGroup();
+ virtual ~UserUploadsGroup();
+
+ virtual bool isMember(TorrentInterface* tor);
+ };
+
+}
+
+#endif
diff --git a/apps/ktorrent/hi128-app-ktorrent.png b/apps/ktorrent/hi128-app-ktorrent.png
new file mode 100644
index 0000000..6cb2185
--- /dev/null
+++ b/apps/ktorrent/hi128-app-ktorrent.png
Binary files differ
diff --git a/apps/ktorrent/hi128-mime-torrent.png b/apps/ktorrent/hi128-mime-torrent.png
new file mode 100644
index 0000000..a7b8d7d
--- /dev/null
+++ b/apps/ktorrent/hi128-mime-torrent.png
Binary files differ
diff --git a/apps/ktorrent/hi16-app-ktorrent.png b/apps/ktorrent/hi16-app-ktorrent.png
new file mode 100644
index 0000000..da8aac9
--- /dev/null
+++ b/apps/ktorrent/hi16-app-ktorrent.png
Binary files differ
diff --git a/apps/ktorrent/hi16-mime-torrent.png b/apps/ktorrent/hi16-mime-torrent.png
new file mode 100644
index 0000000..f1eceaf
--- /dev/null
+++ b/apps/ktorrent/hi16-mime-torrent.png
Binary files differ
diff --git a/apps/ktorrent/hi22-action-ktencrypted.png b/apps/ktorrent/hi22-action-ktencrypted.png
new file mode 100644
index 0000000..d3a0020
--- /dev/null
+++ b/apps/ktorrent/hi22-action-ktencrypted.png
Binary files differ
diff --git a/apps/ktorrent/hi22-action-ktremove.png b/apps/ktorrent/hi22-action-ktremove.png
new file mode 100644
index 0000000..3da332f
--- /dev/null
+++ b/apps/ktorrent/hi22-action-ktremove.png
Binary files differ
diff --git a/apps/ktorrent/hi22-action-ktstart.png b/apps/ktorrent/hi22-action-ktstart.png
new file mode 100644
index 0000000..c7995a0
--- /dev/null
+++ b/apps/ktorrent/hi22-action-ktstart.png
Binary files differ
diff --git a/apps/ktorrent/hi22-action-ktstart_all.png b/apps/ktorrent/hi22-action-ktstart_all.png
new file mode 100644
index 0000000..1c55069
--- /dev/null
+++ b/apps/ktorrent/hi22-action-ktstart_all.png
Binary files differ
diff --git a/apps/ktorrent/hi22-action-ktstop.png b/apps/ktorrent/hi22-action-ktstop.png
new file mode 100644
index 0000000..5b59e46
--- /dev/null
+++ b/apps/ktorrent/hi22-action-ktstop.png
Binary files differ
diff --git a/apps/ktorrent/hi22-action-ktstop_all.png b/apps/ktorrent/hi22-action-ktstop_all.png
new file mode 100644
index 0000000..8086b69
--- /dev/null
+++ b/apps/ktorrent/hi22-action-ktstop_all.png
Binary files differ
diff --git a/apps/ktorrent/hi22-app-ktorrent.png b/apps/ktorrent/hi22-app-ktorrent.png
new file mode 100644
index 0000000..b0f3804
--- /dev/null
+++ b/apps/ktorrent/hi22-app-ktorrent.png
Binary files differ
diff --git a/apps/ktorrent/hi22-mime-torrent.png b/apps/ktorrent/hi22-mime-torrent.png
new file mode 100644
index 0000000..240a3c6
--- /dev/null
+++ b/apps/ktorrent/hi22-mime-torrent.png
Binary files differ
diff --git a/apps/ktorrent/hi32-app-ktorrent.png b/apps/ktorrent/hi32-app-ktorrent.png
new file mode 100644
index 0000000..661dc97
--- /dev/null
+++ b/apps/ktorrent/hi32-app-ktorrent.png
Binary files differ
diff --git a/apps/ktorrent/hi32-mime-torrent.png b/apps/ktorrent/hi32-mime-torrent.png
new file mode 100644
index 0000000..265c104
--- /dev/null
+++ b/apps/ktorrent/hi32-mime-torrent.png
Binary files differ
diff --git a/apps/ktorrent/hi48-action-ktplugins.png b/apps/ktorrent/hi48-action-ktplugins.png
new file mode 100644
index 0000000..ed3ead1
--- /dev/null
+++ b/apps/ktorrent/hi48-action-ktplugins.png
Binary files differ
diff --git a/apps/ktorrent/hi48-app-ktorrent.png b/apps/ktorrent/hi48-app-ktorrent.png
new file mode 100644
index 0000000..f35e53e
--- /dev/null
+++ b/apps/ktorrent/hi48-app-ktorrent.png
Binary files differ
diff --git a/apps/ktorrent/hi48-mime-torrent.png b/apps/ktorrent/hi48-mime-torrent.png
new file mode 100644
index 0000000..e158dfa
--- /dev/null
+++ b/apps/ktorrent/hi48-mime-torrent.png
Binary files differ
diff --git a/apps/ktorrent/hi64-action-ktinfowidget.png b/apps/ktorrent/hi64-action-ktinfowidget.png
new file mode 100644
index 0000000..1d49e5c
--- /dev/null
+++ b/apps/ktorrent/hi64-action-ktinfowidget.png
Binary files differ
diff --git a/apps/ktorrent/hi64-action-ktqueuemanager.png b/apps/ktorrent/hi64-action-ktqueuemanager.png
new file mode 100644
index 0000000..d829460
--- /dev/null
+++ b/apps/ktorrent/hi64-action-ktqueuemanager.png
Binary files differ
diff --git a/apps/ktorrent/hi64-action-ktupnp.png b/apps/ktorrent/hi64-action-ktupnp.png
new file mode 100644
index 0000000..1adb895
--- /dev/null
+++ b/apps/ktorrent/hi64-action-ktupnp.png
Binary files differ
diff --git a/apps/ktorrent/hi64-app-ktorrent.png b/apps/ktorrent/hi64-app-ktorrent.png
new file mode 100644
index 0000000..9d04f33
--- /dev/null
+++ b/apps/ktorrent/hi64-app-ktorrent.png
Binary files differ
diff --git a/apps/ktorrent/hi64-filesys-ktprefdownloads.png b/apps/ktorrent/hi64-filesys-ktprefdownloads.png
new file mode 100644
index 0000000..efd92f5
--- /dev/null
+++ b/apps/ktorrent/hi64-filesys-ktprefdownloads.png
Binary files differ
diff --git a/apps/ktorrent/hi64-mime-torrent.png b/apps/ktorrent/hi64-mime-torrent.png
new file mode 100644
index 0000000..fb1187e
--- /dev/null
+++ b/apps/ktorrent/hi64-mime-torrent.png
Binary files differ
diff --git a/apps/ktorrent/hisc-app-ktorrent.svgz b/apps/ktorrent/hisc-app-ktorrent.svgz
new file mode 100644
index 0000000..3d068d8
--- /dev/null
+++ b/apps/ktorrent/hisc-app-ktorrent.svgz
Binary files differ
diff --git a/apps/ktorrent/hisc-mime-torrent.svgz b/apps/ktorrent/hisc-mime-torrent.svgz
new file mode 100644
index 0000000..beb7c28
--- /dev/null
+++ b/apps/ktorrent/hisc-mime-torrent.svgz
Binary files differ
diff --git a/apps/ktorrent/ipfilterwidget.cpp b/apps/ktorrent/ipfilterwidget.cpp
new file mode 100644
index 0000000..ec32117
--- /dev/null
+++ b/apps/ktorrent/ipfilterwidget.cpp
@@ -0,0 +1,194 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "ipfilterwidget.h"
+
+#include <torrent/ipblocklist.h>
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/constants.h>
+
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qregexp.h>
+#include <qvalidator.h>
+
+#include <klistview.h>
+#include <klineedit.h>
+#include <ksocketaddress.h>
+#include <kfiledialog.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#define MAX_RANGES 500
+
+using namespace bt;
+
+IPFilterWidget::IPFilterWidget(QWidget *parent, const char *name)
+ :BlacklistWidgetBase(parent, name)
+{
+ IPBlocklist& ipfilter = IPBlocklist::instance();
+ QStringList* blocklist = ipfilter.getBlocklist();
+
+ for (QStringList::Iterator it = blocklist->begin(); it != blocklist->end(); ++it)
+ {
+ new KListViewItem(lstPeers, *it);
+ }
+
+ delete blocklist;
+}
+
+void IPFilterWidget::btnAdd_clicked()
+{
+ int var=0;
+
+ QRegExp rx("([*]|[0-9]{1,3}).([*]|[0-9]{1,3}).([*]|[0-9]{1,3}).([*]|[0-9]{1,3})");
+ QRegExpValidator v( rx,0);
+
+ QString ip = peerIP->text();
+
+ if(v.validate( ip, var ) == QValidator::Acceptable)
+ {
+ if(lstPeers->findItem(ip, 0) == 0)
+ new KListViewItem(lstPeers, ip);
+ }
+ else
+ KMessageBox::sorry(0, i18n("You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for ranges like '127.0.0.*'."));
+}
+
+void IPFilterWidget::btnRemove_clicked()
+{
+ if(lstPeers->currentItem())
+ delete lstPeers->currentItem();
+}
+
+void IPFilterWidget::btnClear_clicked()
+{
+ lstPeers->clear();
+}
+
+void IPFilterWidget::btnOpen_clicked()
+{
+ QString lf = KFileDialog::getOpenFileName(QString::null, "*.txt|",this,i18n("Choose a file"));
+
+ if(lf.isEmpty())
+ return;
+
+ btnClear_clicked();
+
+ loadFilter(lf);
+}
+
+void IPFilterWidget::btnSave_clicked()
+{
+ QString sf = KFileDialog::getSaveFileName(QString::null,"*.txt|",this,i18n("Choose a filename to save under"));
+
+ if(sf.isEmpty())
+ return;
+
+ saveFilter(sf);
+}
+
+void IPFilterWidget::btnOk_clicked()
+{
+ btnApply_clicked();
+ this->accept();
+}
+
+void IPFilterWidget::btnApply_clicked()
+{
+ IPBlocklist& ipfilter = IPBlocklist::instance();
+
+ int count = 0;
+
+ QStringList* peers = new QStringList();
+
+ QListViewItemIterator it(lstPeers);
+ while (it.current())
+ {
+ *peers << it.current()->text(0);
+ ++it;
+ ++count;
+ }
+
+ ipfilter.setBlocklist(peers);
+
+ delete peers;
+
+ Out(SYS_IPF|LOG_NOTICE) << "Loaded " << count << " blocked IP ranges." << endl;
+}
+
+void IPFilterWidget::saveFilter(QString& fn)
+{
+ QFile fptr(fn);
+
+ if (!fptr.open(IO_WriteOnly))
+ {
+ Out(SYS_GEN|LOG_NOTICE) << QString("Could not open file %1 for writing.").arg(fn) << endl;
+ return;
+ }
+
+ QTextStream out(&fptr);
+
+ QListViewItemIterator it(lstPeers);
+ while (it.current())
+ {
+ out << it.current()->text(0) << ::endl;
+ ++it;
+ }
+
+ fptr.close();
+}
+
+void IPFilterWidget::loadFilter(QString& fn)
+{
+ QFile dat(fn);
+ dat.open(IO_ReadOnly);
+
+ QTextStream stream( &dat );
+ QString line;
+
+ QRegExp rx("([*]|[0-9]{1,3}).([*]|[0-9]{1,3}).([*]|[0-9]{1,3}).([*]|[0-9]{1,3})");
+ QRegExpValidator v( rx,0);
+
+
+ int i=0;
+ int var=0;
+ bool err = false;
+
+ while ( !stream.atEnd() && i < MAX_RANGES )
+ {
+ line = stream.readLine();
+ if ( v.validate( line, var ) != QValidator::Acceptable )
+ {
+ err = true;
+ continue;
+ }
+
+ new KListViewItem(lstPeers, line);
+ ++i;
+ }
+
+ if(err)
+ Out(SYS_IPF|LOG_NOTICE) << "Some lines could not be loaded. Check your filter file..." << endl;
+
+ dat.close();
+}
+
+#include "ipfilterwidget.moc"
diff --git a/apps/ktorrent/ipfilterwidget.h b/apps/ktorrent/ipfilterwidget.h
new file mode 100644
index 0000000..29d5a04
--- /dev/null
+++ b/apps/ktorrent/ipfilterwidget.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 IPFILTERWIDGET_H
+#define IPFILTERWIDGET_H
+
+#include "ipfilterwidgetbase.h"
+
+/**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief Integrated IPFilter GUI class.
+ * Used to show, add and remove banned peers from blacklist.
+ */
+class IPFilterWidget: public BlacklistWidgetBase
+{
+ Q_OBJECT
+ public:
+ IPFilterWidget(QWidget *parent = 0, const char *name = 0);
+
+ virtual void btnApply_clicked();
+ virtual void btnOk_clicked();
+ virtual void btnSave_clicked();
+ virtual void btnOpen_clicked();
+ virtual void btnClear_clicked();
+ virtual void btnRemove_clicked();
+ virtual void btnAdd_clicked();
+
+ void saveFilter(QString& fn);
+ void loadFilter(QString& fn);
+};
+
+#endif
diff --git a/apps/ktorrent/ipfilterwidgetbase.ui b/apps/ktorrent/ipfilterwidgetbase.ui
new file mode 100644
index 0000000..b41fb68
--- /dev/null
+++ b/apps/ktorrent/ipfilterwidgetbase.ui
@@ -0,0 +1,368 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>BlacklistWidgetBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BlacklistWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>490</width>
+ <height>437</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KTorrent Blacklist</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>Minimum</enum>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Note: Blacklist applies to current session only. Use save/open to save your entries or use IPFilter plugin (PeerGuardian).</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Banned Peers</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KListView" row="2" column="0">
+ <column>
+ <property name="text">
+ <string>Peer IP address</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>lstPeers</cstring>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer5_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Add peer:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kLineEdit1</cstring>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>peerIP</cstring>
+ </property>
+ <property name="text">
+ <string>127.0.0.1</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1" rowspan="3" colspan="1">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnAdd</cstring>
+ </property>
+ <property name="text">
+ <string>Add</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>27</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Adds a peer to blacklist</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnRemove</cstring>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>28</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Removes selected peer from blacklist</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnClear</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;lear</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>10</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Clears this list</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnOpen</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Open...</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>18</number>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnSave</cstring>
+ </property>
+ <property name="text">
+ <string>Save &amp;As...</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>8</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Save this blacklist to use with KTorrent IPFilter plugin</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnApply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>9</number>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnCancel</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>2</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>btnCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>btnAdd</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>btnAdd_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnRemove</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>btnRemove_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnClear</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>btnClear_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnOpen</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>btnOpen_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnSave</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>btnSave_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnOk</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>btnOk_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnApply</sender>
+ <signal>clicked()</signal>
+ <receiver>BlacklistWidgetBase</receiver>
+ <slot>btnApply_clicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>btnOk</tabstop>
+ <tabstop>btnApply</tabstop>
+ <tabstop>btnCancel</tabstop>
+ <tabstop>lstPeers</tabstop>
+ <tabstop>btnRemove</tabstop>
+ <tabstop>btnClear</tabstop>
+ <tabstop>btnOpen</tabstop>
+ <tabstop>btnSave</tabstop>
+ <tabstop>peerIP</tabstop>
+ <tabstop>btnAdd</tabstop>
+</tabstops>
+<slots>
+ <slot>btnAdd_clicked()</slot>
+ <slot>btnRemove_clicked()</slot>
+ <slot>btnClear_clicked()</slot>
+ <slot>btnOpen_clicked()</slot>
+ <slot>btnSave_clicked()</slot>
+ <slot>btnOk_clicked()</slot>
+ <slot>btnApply_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/ktorrent.cpp b/apps/ktorrent/ktorrent.cpp
new file mode 100644
index 0000000..50b6e7f
--- /dev/null
+++ b/apps/ktorrent/ktorrent.cpp
@@ -0,0 +1,1017 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <qdragobject.h>
+#include <qsplitter.h>
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qtooltip.h>
+#include <qtoolbutton.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kiconloader.h>
+#include <kdeversion.h>
+#include <kmenubar.h>
+#include <kstatusbar.h>
+#include <kkeydialog.h>
+#include <kaccel.h>
+#include <kstandarddirs.h>
+#include <kio/netaccess.h>
+#include <kfiledialog.h>
+#include <kconfig.h>
+#include <kurl.h>
+#include <kurldrag.h>
+#include <kprogress.h>
+#include <kpopupmenu.h>
+#include <ktabwidget.h>
+#include <kedittoolbar.h>
+#include <ksqueezedtextlabel.h>
+#include <kpushbutton.h>
+
+#include <kstdaccel.h>
+#include <kaction.h>
+#include <kstdaction.h>
+
+#include <interfaces/torrentinterface.h>
+#include <torrent/peermanager.h>
+#include <torrent/chunkmanager.h>
+#include <torrent/uploadcap.h>
+#include <torrent/downloadcap.h>
+#include <util/error.h>
+#include <torrent/serverauthenticate.h>
+#include <torrent/globals.h>
+#include <torrent/tracker.h>
+#include <torrent/downloader.h>
+#include <torrent/choker.h>
+#include <torrent/server.h>
+#include <torrent/downloadcap.h>
+#include <torrent/udptrackersocket.h>
+#include <net/socketmonitor.h>
+#include <util/log.h>
+#include <util/fileops.h>
+#include <kademlia/dhtbase.h>
+
+#include "ktorrentcore.h"
+#include "ktorrentview.h"
+#include "ktorrent.h"
+#include "pref.h"
+#include "settings.h"
+#include "trayicon.h"
+#include "ktorrentdcop.h"
+#include "torrentcreatordlg.h"
+#include "pastedialog.h"
+#include "queuedialog.h"
+#include "ipfilterwidget.h"
+#include <util/functions.h>
+#include <interfaces/functions.h>
+#include <interfaces/plugin.h>
+#include <interfaces/prefpageinterface.h>
+#include <newui/dtabwidget.h>
+#include <pluginmanager.h>
+#include <groups/group.h>
+#include <groups/groupview.h>
+#include <groups/groupmanager.h>
+#include <mse/streamsocket.h>
+#include "viewmanager.h"
+#include "ktorrentviewitem.h"
+
+
+
+namespace kt
+{
+ QString DataDir();
+}
+
+#include <util/profiler.h>
+
+
+
+using namespace bt;
+using namespace kt;
+
+KTorrent::KTorrent()
+ : DMainWindow(0,"KTorrent"),m_group_view(0),
+ m_view_man(0), m_systray_icon(0),m_status_prog(0)
+{
+ setHidden(true);
+ //setToolviewStyle(KMdi::TextAndIcon);
+ connect(this,SIGNAL(widgetChanged(QWidget*)),this,SLOT(currentTabChanged(QWidget*)));
+
+ m_view_man = new ViewManager(this);
+ m_group_view = new kt::GroupView(m_view_man,actionCollection());
+ connect(m_group_view,SIGNAL(openNewTab(kt::Group*)),this,SLOT(openView(kt::Group*)));
+
+
+ m_pref = new KTorrentPreferences(*this);
+
+ m_core = new KTorrentCore(this);
+ m_core->setGroupManager(m_group_view->groupManager());
+
+ m_systray_icon = new TrayIcon(m_core, this);
+
+ m_group_view->loadGroups();
+ m_view_man->restoreViewState(KGlobal::config(),this);
+
+ QToolButton* tb = new QToolButton(m_activeTabWidget);
+ tb->setIconSet(SmallIcon("tab_new"));
+ tb->adjustSize();
+ connect(tb,SIGNAL(clicked()),this,SLOT(openDefaultView()));
+ m_activeTabWidget->setCornerWidget(tb, TopLeft);
+
+ connect(m_group_view,SIGNAL(currentGroupChanged( kt::Group* )),
+ this,SLOT(groupChanged(kt::Group*)));
+
+ connect(m_group_view,SIGNAL(groupRenamed(kt::Group*)),
+ this,SLOT(groupRenamed(kt::Group*)));
+
+ connect(m_group_view,SIGNAL(groupRemoved(kt::Group*)),
+ this,SLOT(groupRemoved(kt::Group*)));
+
+ connect(m_core,SIGNAL(torrentAdded(kt::TorrentInterface* )),
+ m_view_man,SLOT(addTorrent(kt::TorrentInterface* )));
+
+ connect(m_core,SIGNAL(torrentRemoved(kt::TorrentInterface* )),
+ m_view_man,SLOT(removeTorrent(kt::TorrentInterface* )));
+
+ connect(m_core, SIGNAL(torrentRemoved( kt::TorrentInterface* )),
+ m_group_view, SLOT(onTorrentRemoved( kt::TorrentInterface* )));
+
+ m_statusInfo = new KSqueezedTextLabel(this);
+ m_statusSpeed = new QLabel(this);
+ m_statusTransfer = new QLabel(this);
+ m_statusDHT = new QLabel(this);
+ m_statusFirewall = new QLabel(this);
+ m_statusFirewall->setPixmap(SmallIcon("messagebox_warning"));
+ QToolTip::add(m_statusFirewall,i18n("No incoming connections (possibly firewalled)"));
+
+ statusBar()->addWidget(m_statusFirewall);
+ statusBar()->addWidget(m_statusInfo,1);
+ statusBar()->addWidget(m_statusDHT);
+ statusBar()->addWidget(m_statusSpeed);
+ statusBar()->addWidget(m_statusTransfer);
+
+ m_statusFirewall->hide();
+
+ setupActions();
+ currentTorrentChanged(0);
+
+ m_dcop = new KTorrentDCOP(this);
+
+ setStandardToolBarMenuEnabled(true);
+
+ QToolTip::add(m_statusInfo, i18n("Info"));
+ QToolTip::add(m_statusTransfer, i18n("Data transferred during the current session"));
+ QToolTip::add(m_statusSpeed, i18n("Current speed of all torrents combined"));
+
+ //first apply settings..
+ applySettings(false);
+ //then load stuff from core
+ m_core->loadTorrents();
+ m_core->loadPlugins();
+
+ connect(&m_gui_update_timer, SIGNAL(timeout()), this, SLOT(updatedStats()));
+ //Apply GUI update interval
+ int val = 500;
+ switch(Settings::guiUpdateInterval())
+ {
+ case 1:
+ val = 1000;
+ break;
+ case 2:
+ val = 2000;
+ break;
+ case 3:
+ val = 5000;
+ break;
+ default:
+ val = 500;
+ }
+ m_gui_update_timer.start(val);
+
+ statusBar()->show();
+
+ addToolWidget(m_group_view,"player_playlist",i18n("Groups"),DOCK_LEFT);
+
+ setAutoSaveSettings("WindowStatus",true);
+ KGlobal::config()->setGroup("WindowStatus");
+ bool hidden_on_exit = KGlobal::config()->readBoolEntry("hidden_on_exit",false);
+ if (Settings::showSystemTrayIcon())
+ {
+ if (hidden_on_exit)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Starting minimized" << endl;
+ hide();
+ }
+ else
+ {
+ show();
+ }
+ }
+ else
+ {
+ show();
+ }
+
+ bool menubar_hidden = KGlobal::config()->readBoolEntry("menubar_hidden",false);
+ menuBar()->setHidden(menubar_hidden);
+ m_menubarAction->setChecked(!menubar_hidden);
+
+ bool statusbar_hidden = KGlobal::config()->readBoolEntry("statusbar_hidden",false);
+ statusBar()->setHidden(statusbar_hidden);
+ m_statusbarAction->setChecked(!statusbar_hidden);
+
+ MaximizeLimits();
+ connect(&m_status_msg_expire,SIGNAL(timeout()),this,SLOT(statusBarMsgExpired()));
+
+ m_view_man->updateActions();
+}
+
+KTorrent::~KTorrent()
+{
+ delete m_dcop;
+ delete m_core;
+ delete m_pref;
+ delete m_statusInfo;
+ delete m_statusTransfer;
+ delete m_statusSpeed;
+ delete m_statusFirewall;
+}
+
+void KTorrent::openView(kt::Group* g)
+{
+ if (!g)
+ return;
+
+ KTorrentView* v = m_view_man->newView();
+ v->setCurrentGroup((Group*)g);
+ v->setupViewColumns();
+
+ addTabPage(v,g->groupIcon(),v->caption(),m_view_man);
+
+ connect(v,SIGNAL(currentChanged(kt::TorrentInterface* )),
+ this,SLOT(currentTorrentChanged(kt::TorrentInterface* )));
+
+ connect(v,SIGNAL(wantToRemove(kt::TorrentInterface*,bool )),
+ m_core,SLOT(remove(kt::TorrentInterface*,bool )));
+
+ connect(v->listView(),SIGNAL(dropped(QDropEvent*,QListViewItem*)),
+ this,SLOT(urlDropped(QDropEvent*,QListViewItem*)));
+
+ connect(v,SIGNAL(wantToStart( kt::TorrentInterface* )),
+ m_core,SLOT(start( kt::TorrentInterface* )));
+
+ connect(v,SIGNAL(wantToStop( kt::TorrentInterface*, bool )),
+ m_core,SLOT(stop( kt::TorrentInterface*, bool )));
+
+ connect(v,SIGNAL(needsDataCheck( kt::TorrentInterface* )),
+ m_core,SLOT(doDataCheck( kt::TorrentInterface* )));
+
+ connect(v,SIGNAL(updateActions( int )),
+ this,SLOT(onUpdateActions( int )));
+
+ //connect Core queue() with queue() from KTView.
+ connect(v, SIGNAL(queue( kt::TorrentInterface* )),
+ m_core, SLOT(queue( kt::TorrentInterface* )));
+
+ connect(v,SIGNAL(updateGroupsSubMenu(KPopupMenu*)),
+ m_group_view,SLOT(updateGroupsSubMenu(KPopupMenu*)));
+
+ connect(v,SIGNAL(groupsSubMenuItemActivated(KTorrentView*, const QString&)),
+ m_group_view,SLOT(onGroupsSubMenuItemActivated(KTorrentView*, const QString&)));
+
+ if (m_core)
+ {
+ QueueManager* qman = m_core->getQueueManager();
+ QueueManager::iterator i = qman->begin();
+ while (i != qman->end())
+ {
+ v->addTorrent(*i);
+ i++;
+ }
+ }
+}
+
+void KTorrent::openView(const QString & group_name)
+{
+ const kt::Group* g = m_group_view->findGroup(group_name);
+ if (g)
+ openView((kt::Group*)g);
+}
+
+void KTorrent::groupChanged(kt::Group* g)
+{
+ KTorrentView* v = m_view_man->getCurrentView();
+ if (v)
+ {
+ m_activeTabWidget->changeTab(v,g->groupName());
+ v->setIcon(g->groupIcon());
+ v->setCurrentGroup(g);
+ }
+}
+
+void KTorrent::groupRenamed(kt::Group* g)
+{
+ m_view_man->groupRenamed(g,m_activeTabWidget);
+}
+
+void KTorrent::groupRemoved(kt::Group* g)
+{
+ kt::Group* allg = m_group_view->groupManager()->allGroup();
+ m_view_man->groupRemoved(g,m_activeTabWidget,this,allg);
+}
+
+void KTorrent::addTabPage(QWidget* page,const QIconSet & icon,
+ const QString & caption,kt::CloseTabListener* ctl)
+{
+ addWidget(page,caption);
+ page->setIcon(icon.pixmap(QIconSet::Small,QIconSet::Active));
+ m_tab_map[page] = ctl;
+ currentTabChanged(page);
+}
+
+void KTorrent::addTabPage(QWidget* page,const QPixmap & icon,
+ const QString & caption,kt::CloseTabListener* ctl)
+{
+ addWidget(page,caption);
+ page->setIcon(icon);
+ m_tab_map[page] = ctl;
+ currentTabChanged(page);
+}
+
+
+void KTorrent::removeTabPage(QWidget* page)
+{
+ if (!m_tab_map.contains(page))
+ return;
+
+ m_tab_map.erase(page);
+ page->reparent(0,QPoint());
+ removeWidget(page);
+}
+
+void KTorrent::addPrefPage(PrefPageInterface* page)
+{
+ m_pref->addPrefPage(page);
+}
+
+void KTorrent::removePrefPage(PrefPageInterface* page)
+{
+ m_pref->removePrefPage(page);
+}
+
+void KTorrent::applySettings(bool change_port)
+{
+ m_core->setMaxDownloads(Settings::maxDownloads());
+ m_core->setMaxSeeds(Settings::maxSeeds());
+ PeerManager::setMaxConnections(Settings::maxConnections());
+ PeerManager::setMaxTotalConnections(Settings::maxTotalConnections());
+ net::SocketMonitor::setDownloadCap(Settings::maxDownloadRate()*1024);
+ net::SocketMonitor::setUploadCap(Settings::maxUploadRate()*1024);
+ net::SocketMonitor::setSleepTime(Settings::cpuUsage());
+ m_core->setKeepSeeding(Settings::keepSeeding());
+ mse::StreamSocket::setTOS(Settings::dSCP() << 2);
+ mse::StreamSocket::setMaxConnecting(Settings::maxConnectingSockets());
+ if (Settings::allwaysDoUploadDataCheck())
+ ChunkManager::setMaxChunkSizeForDataCheck(0);
+ else
+ ChunkManager::setMaxChunkSizeForDataCheck(Settings::maxSizeForUploadDataCheck() * 1024);
+
+ if (Settings::showSystemTrayIcon())
+ {
+ m_systray_icon->show();
+ m_set_max_upload_rate->update();
+ m_set_max_download_rate->update();
+ }
+ else
+ {
+ m_systray_icon->hide();
+ }
+
+ m_core->changeDataDir(Settings::tempDir());
+ UDPTrackerSocket::setPort(Settings::udpTrackerPort());
+ if (change_port)
+ m_core->changePort(Settings::port());
+
+ if (Settings::useExternalIP())
+ Tracker::setCustomIP(Settings::externalIP());
+ else
+ Tracker::setCustomIP(QString::null);
+
+ Downloader::setMemoryUsage(Settings::memoryUsage());
+ Choker::setNumUploadSlots(Settings::numUploadSlots());
+
+ //Apply GUI update interval
+ int val = 500;
+ switch(Settings::guiUpdateInterval())
+ {
+ case 1:
+ val = 1000;
+ break;
+ case 2:
+ val = 2000;
+ break;
+ case 3:
+ val = 5000;
+ break;
+ default:
+ val = 500;
+ }
+ m_gui_update_timer.changeInterval(val);
+
+ //update QM
+ m_core->getQueueManager()->orderQueue();
+ dht::DHTBase & ht = Globals::instance().getDHT();
+ if (Settings::dhtSupport() && !ht.isRunning())
+ {
+ ht.start(kt::DataDir() + "dht_table",kt::DataDir() + "dht_key",Settings::dhtPort());
+ }
+ else if (!Settings::dhtSupport() && ht.isRunning())
+ {
+ ht.stop();
+ }
+ else if (Settings::dhtSupport() && ht.getPort() != Settings::dhtPort())
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Restarting DHT with new port " << Settings::dhtPort() << endl;
+ ht.stop();
+ ht.start(kt::DataDir() + "dht_table",kt::DataDir() + "dht_key",Settings::dhtPort());
+ }
+
+ if (Settings::useEncryption())
+ {
+ Globals::instance().getServer().enableEncryption(Settings::allowUnencryptedConnections());
+ }
+ else
+ {
+ Globals::instance().getServer().disableEncryption();
+ }
+}
+
+void KTorrent::load(const KURL& url)
+{
+ m_core->load(url);
+}
+
+void KTorrent::loadSilently(const KURL& url)
+{
+ m_core->loadSilently(url);
+}
+
+void KTorrent::onUpdateActions(int flags)
+{
+ m_start->setEnabled(flags & KTorrentView::START);
+ m_stop->setEnabled(flags & KTorrentView::STOP);
+ m_remove->setEnabled(flags & KTorrentView::REMOVE);
+ m_queueaction->setEnabled(flags & KTorrentView::REMOVE);
+ m_datacheck->setEnabled(flags & KTorrentView::SCAN);
+ m_startall->setEnabled(flags & KTorrentView::START_ALL);
+ m_stopall->setEnabled(flags & KTorrentView::STOP_ALL);
+}
+
+void KTorrent::currentTorrentChanged(kt::TorrentInterface* tc)
+{
+ notifyViewListeners(tc);
+}
+
+
+void KTorrent::setupActions()
+{
+ KStdAction::openNew(this,SLOT(fileNew()),actionCollection());
+ KStdAction::open(this, SLOT(fileOpen()), actionCollection());
+ KStdAction::quit(kapp, SLOT(quit()), actionCollection());
+
+ KStdAction::paste(kapp,SLOT(paste()),actionCollection());
+
+ m_statusbarAction = KStdAction::showStatusbar(this, SLOT(optionsShowStatusbar()), actionCollection());
+ m_menubarAction = KStdAction::showMenubar(this, SLOT(optionsShowMenubar()), actionCollection());
+
+ KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
+ KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection());
+
+ KAction* pref = KStdAction::preferences(this, SLOT(optionsPreferences()), actionCollection());
+
+ m_start = new KAction(
+ i18n("to start", "Start"), "ktstart",0,this, SLOT(startDownload()),
+ actionCollection(), "Start");
+
+ m_stop = new KAction(
+ i18n("to stop", "Stop"), "ktstop",0,this, SLOT(stopDownload()),
+ actionCollection(), "Stop");
+
+ m_remove = new KAction(
+ i18n("Remove"), "ktremove",0,this, SLOT(removeDownload()),
+ actionCollection(), "Remove");
+
+ m_startall = new KAction(
+ i18n("to start all", "Start All"), "ktstart_all",0,this, SLOT(startAllDownloadsCurrentView()),
+ actionCollection(), "Start all");
+
+ m_startall_systray = new KAction(i18n("to start all", "Start All"), "ktstart_all",0,this, SLOT(startAllDownloads()),actionCollection());
+
+ m_stopall = new KAction(
+ i18n("to stop all", "Stop All"), "ktstop_all",0,this, SLOT(stopAllDownloadsCurrentView()),
+ actionCollection(), "Stop all");
+
+ m_stopall_systray = new KAction(i18n("to stop all", "Stop All"), "ktstop_all",0,this, SLOT(stopAllDownloads()),actionCollection());
+
+ m_pasteurl = new KAction(
+ i18n("to paste torrent URL", "Paste Torrent URL..."), "ktstart",0,this, SLOT(torrentPaste()),
+ actionCollection(), "paste_url");
+
+ m_queuemgr = new KAction(
+ i18n("to open Queue Manager", "Open Queue Manager..."),
+ "ktqueuemanager", 0, this, SLOT(queueManagerShow()),
+ actionCollection(), "Queue manager");
+
+ m_queueaction = new KAction(
+ i18n("Enqueue/Dequeue"),
+ "player_playlist", 0, m_view_man, SLOT(queueAction()),
+ actionCollection(), "queue_action");
+
+ m_ipfilter = new KAction(
+ i18n("IPFilter"),
+ "filter", 0, this, SLOT(showIPFilter()),
+ actionCollection(), "ipfilter_action");
+
+ m_datacheck = new KAction(
+ i18n("Check Data Integrity"),
+ QString::null,0,m_view_man,SLOT(checkDataIntegrity()),actionCollection(),"check_data");
+
+ m_find = KStdAction::find(this,SLOT(find()),actionCollection());
+
+ //Plug actions to systemtray context menu
+ m_startall_systray->plug(m_systray_icon->contextMenu());
+ m_stopall_systray->plug(m_systray_icon->contextMenu());
+ m_systray_icon->contextMenu()->insertSeparator();
+ m_pasteurl->plug(m_systray_icon->contextMenu());
+ m_systray_icon->contextMenu()->insertSeparator();
+
+ m_set_max_upload_rate = new SetMaxRate(m_core, 0, this);
+ m_systray_icon->contextMenu()->insertItem(i18n("Set max upload rate"),m_set_max_upload_rate);
+
+ m_set_max_download_rate = new SetMaxRate(m_core, 1, this);
+ m_systray_icon->contextMenu()->insertItem(i18n("Set max download rate"),m_set_max_download_rate);
+
+ pref->plug(m_systray_icon->contextMenu());
+
+ createGUI(0);
+}
+
+
+
+bool KTorrent::queryClose()
+{
+ if (Settings::showSystemTrayIcon() && !KApplication::kApplication()->sessionSaving())
+ {
+ hide();
+ return false;
+ }
+ else
+ {
+ return true;
+ }
+}
+
+bool KTorrent::queryExit()
+{
+ // stop timers to prevent update
+ m_gui_update_timer.stop();
+
+ KGlobal::config()->setGroup("WindowStatus");
+ KGlobal::config()->writeEntry("hidden_on_exit",this->isHidden());
+ KGlobal::config()->writeEntry("menubar_hidden",menuBar()->isHidden());
+ KGlobal::config()->writeEntry("statusbar_hidden",statusBar()->isHidden());
+ m_view_man->saveViewState(KGlobal::config());
+ saveSettings();
+ hide();
+ m_systray_icon->hide(); // hide system tray icon upon exit
+ m_core->onExit();
+ if (Globals::instance().getDHT().isRunning())
+ Globals::instance().getDHT().stop();
+ return true;
+}
+
+
+void KTorrent::fileNew()
+{
+ TorrentCreatorDlg dlg(m_core,this);
+
+ dlg.show();
+ dlg.exec();
+}
+
+void KTorrent::fileOpen()
+{
+ QString filter = "*.torrent|" + i18n("Torrent Files") + "\n*|" + i18n("All Files");
+ KURL url = KFileDialog::getOpenURL(QString::null, filter, this, i18n("Open Location"));
+
+ if (url.isValid())
+ load(url);
+}
+
+void KTorrent::torrentPaste()
+{
+ PasteDialog dlg(m_core,this);
+ dlg.exec();
+}
+
+void KTorrent::queueManagerShow()
+{
+ QueueDialog dlg(m_core->getQueueManager(), this);
+ dlg.exec();
+}
+
+void KTorrent::startDownload()
+{
+ m_view_man->startDownloads();
+ TorrentInterface* tc = m_view_man->getCurrentTC();
+ currentTorrentChanged(tc);
+}
+
+void KTorrent::startAllDownloadsCurrentView()
+{
+ m_view_man->startAllDownloads();
+}
+
+void KTorrent::startAllDownloads()
+{
+ m_core->startAll(3);
+}
+
+void KTorrent::stopDownload()
+{
+ m_view_man->stopDownloads();
+ TorrentInterface* tc = m_view_man->getCurrentTC();
+ currentTorrentChanged(tc);
+}
+
+void KTorrent::stopAllDownloads()
+{
+ m_core->stopAll(3);
+}
+
+void KTorrent::stopAllDownloadsCurrentView()
+{
+ m_view_man->stopAllDownloads();
+}
+
+void KTorrent::removeDownload()
+{
+ m_view_man->removeDownloads();
+ currentTorrentChanged(m_view_man->getCurrentTC());
+}
+
+void KTorrent::optionsShowStatusbar()
+{
+ // this is all very cut and paste code for showing/hiding the
+ // statusbar
+ if (m_statusbarAction->isChecked())
+ statusBar()->show();
+ else
+ statusBar()->hide();
+}
+
+void KTorrent::optionsShowMenubar()
+{
+ // this is all very cut and paste code for showing/hiding the
+ // menubar
+ if (m_menubarAction->isChecked())
+ menuBar()->show();
+ else
+ menuBar()->hide();
+}
+
+void KTorrent::optionsConfigureKeys()
+{
+ KKeyDialog::configure(actionCollection());
+}
+
+void KTorrent::optionsConfigureToolbars()
+{
+ // use the standard toolbar editor
+#if defined(KDE_MAKE_VERSION)
+# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
+ saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
+# else
+ saveMainWindowSettings(KGlobal::config());
+# endif
+#else
+ saveMainWindowSettings(KGlobal::config());
+#endif
+ KEditToolbar dlg(factory());
+ connect(&dlg,SIGNAL(newToolbarConfig()),this,SLOT(newToolbarConfig()));
+ dlg.exec();
+}
+
+void KTorrent::newToolbarConfig()
+{
+ // this slot is called when user clicks "Ok" or "Apply" in the toolbar editor.
+ // recreate our GUI, and re-apply the settings (e.g. "text under icons", etc.)
+ createGUI(0);
+
+#if defined(KDE_MAKE_VERSION)
+# if KDE_VERSION >= KDE_MAKE_VERSION(3,1,0)
+ applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
+# else
+ applyMainWindowSettings(KGlobal::config());
+# endif
+#else
+ applyMainWindowSettings(KGlobal::config());
+#endif
+}
+
+void KTorrent::optionsPreferences()
+{
+ // popup some sort of preference dialog, here
+ m_pref->updateData();
+ m_pref->exec();
+}
+
+void KTorrent::changeStatusbar(const QString& text)
+{
+ // display the text on the statusbar
+ //statusBar()->message(text);
+ m_statusInfo->setText(text);
+ m_status_msg_expire.stop();
+ m_status_msg_expire.start(5000,true);
+}
+
+void KTorrent::changeCaption(const QString& text)
+{
+ // display the text on the caption
+ setCaption(text);
+}
+
+void KTorrent::saveProperties(KConfig* )
+{
+}
+
+void KTorrent::readProperties(KConfig*)
+{
+}
+
+void KTorrent::urlDropped(QDropEvent* event,QListViewItem*)
+{
+ KURL::List urls;
+
+ if (KURLDrag::decode(event, urls) && !urls.isEmpty())
+ {
+ for (KURL::List::iterator i = urls.begin();i != urls.end();i++)
+ load(*i);
+ }
+}
+
+void KTorrent::updatedStats()
+{
+ m_startall_systray->setEnabled(m_core->getNumTorrentsNotRunning() > 0);
+ m_stopall_systray->setEnabled(m_core->getNumTorrentsRunning() > 0);
+
+ CurrentStats stats = this->m_core->getStats();
+
+ //m_statusInfo->setText(i18n("Some info here e.g. connected/disconnected"));
+ QString tmp = i18n("Speed down: %1 / up: %2")
+ .arg(KBytesPerSecToString((double)stats.download_speed/1024.0))
+ .arg(KBytesPerSecToString((double)stats.upload_speed/1024.0));
+
+ m_statusSpeed->setText(tmp);
+
+ QString tmp1 = i18n("Transferred down: %1 / up: %2")
+ .arg(BytesToString(stats.bytes_downloaded))
+ .arg(BytesToString(stats.bytes_uploaded));
+ m_statusTransfer->setText(tmp1);
+
+ if (ServerAuthenticate::isFirewalled() && m_core->getNumTorrentsRunning() > 0)
+ m_statusFirewall->show();
+ else
+ m_statusFirewall->hide();
+
+ m_view_man->update();
+
+ m_systray_icon->updateStats(stats,Settings::showSpeedBarInTrayIcon(),Settings::downloadBandwidth(), Settings::uploadBandwidth());
+
+ m_core->getPluginManager().updateGuiPlugins();
+
+
+ if (Globals::instance().getDHT().isRunning())
+ {
+ const dht::Stats & s = Globals::instance().getDHT().getStats();
+ m_statusDHT->setText(i18n("DHT: %1 nodes, %2 tasks")
+ .arg(s.num_peers).arg(s.num_tasks));
+ }
+ else
+ m_statusDHT->setText(i18n("DHT: off"));
+}
+
+void KTorrent::mergePluginGui(Plugin* p)
+{
+ if (!p) return;
+ guiFactory()->addClient(p);
+}
+
+void KTorrent::removePluginGui(Plugin* p)
+{
+ if (!p) return;
+ guiFactory()->removeClient(p);
+}
+
+void KTorrent::addWidgetInView(QWidget* w,Position pos)
+{
+}
+
+void KTorrent::removeWidgetFromView(QWidget* w)
+{
+}
+
+void KTorrent::addWidgetBelowView(QWidget* w,const QString & icon,const QString & caption)
+{
+ addToolWidget(w,icon,caption,DOCK_BOTTOM);
+}
+
+void KTorrent::removeWidgetBelowView(QWidget* w)
+{
+ removeToolWidget(w);
+}
+
+void KTorrent::addToolWidget(QWidget* w,const QString & icon,const QString & caption,ToolDock dock)
+{
+ if (!w) return;
+
+
+ if (!icon.isNull())
+ w->setIcon(KGlobal::iconLoader()->loadIcon(icon,KIcon::Small));
+
+ switch (dock)
+ {
+ case DOCK_BOTTOM:
+ addDockWidget(DDockWindow::Bottom,w,caption);
+ break;
+
+ case DOCK_LEFT:
+ addDockWidget(DDockWindow::Left,w,caption);
+ break;
+
+ case DOCK_RIGHT:
+ default:
+ addDockWidget(DDockWindow::Right,w,caption);
+ break;
+ }
+}
+
+void KTorrent::removeToolWidget(QWidget* w)
+{
+ if (!w) return;
+
+ removeDockWidget(w);
+ w->reparent(0,QPoint());
+}
+
+const TorrentInterface* KTorrent::getCurrentTorrent() const
+{
+ return m_view_man->getCurrentTC();
+}
+
+QString KTorrent::getStatusInfo()
+{
+ return m_statusInfo->text();
+}
+
+QString KTorrent::getStatusTransfer()
+{
+ return m_statusTransfer->text();
+}
+
+QString KTorrent::getStatusSpeed()
+{
+ return m_statusSpeed->text();
+}
+
+QString KTorrent::getStatusDHT()
+{
+ return m_statusDHT->text();
+}
+
+QString KTorrent::getStatusFirewall()
+{
+ return m_statusFirewall->text();
+}
+
+QCStringList KTorrent::getTorrentInfo(kt::TorrentInterface* tc)
+{
+ return KTorrentViewItem::getTorrentInfo(tc);
+}
+
+void KTorrent::showIPFilter()
+{
+ IPFilterWidget ipf(this);
+ ipf.exec();
+}
+
+
+void KTorrent::closeTab()
+{
+ QWidget* w = m_currentWidget;
+ if (!w)
+ return;
+
+ CloseTabListener* ctl = m_tab_map[w];
+ if (ctl)
+ {
+ ctl->tabCloseRequest(this,w);
+ currentTabChanged(m_activeTabWidget->currentPage());
+ }
+}
+
+void KTorrent::currentTabChanged(QWidget* w)
+{
+ m_view_man->onCurrentTabChanged(w);
+ currentTorrentChanged(m_view_man->getCurrentTC());
+ if (!m_activeTabWidget || !w)
+ return;
+
+ bool close_allowed = false;
+ CloseTabListener* ctl = m_tab_map[w];
+ if (ctl)
+ close_allowed = ctl->closeAllowed(w);
+
+ m_activeTabWidget->closeButton()->setEnabled(close_allowed);
+}
+
+void KTorrent::openDefaultView()
+{
+ openView(i18n("All Torrents"));
+}
+
+KToolBar* KTorrent::addToolBar(const char* name)
+{
+ return toolBar(name);
+}
+
+void KTorrent::removeToolBar(KToolBar* tb)
+{
+ delete tb;
+}
+
+void KTorrent::loadSilentlyDir(const KURL& url, const KURL& savedir)
+{
+ m_core->loadSilentlyDir(url, savedir);
+}
+
+KProgress* KTorrent::addProgressBarToStatusBar()
+{
+ if (m_status_prog)
+ return 0;
+
+ KStatusBar* sb = statusBar();
+ m_status_prog = new KProgress(100,sb);
+ m_status_prog->setValue(0);
+ sb->addWidget(m_status_prog);
+ m_status_prog->show();
+ return m_status_prog;
+}
+
+void KTorrent::removeProgressBarFromStatusBar(KProgress* p)
+{
+ if (m_status_prog != p)
+ return;
+
+ KStatusBar* sb = statusBar();
+ sb->removeWidget(p);
+ delete p;
+ m_status_prog = 0;
+}
+
+void KTorrent::statusBarMsgExpired()
+{
+ m_statusInfo->clear();
+}
+
+void KTorrent::find()
+{
+ KTorrentView* v = m_view_man->getCurrentView();
+ if (v)
+ v->toggleFilterBar();
+}
+
+#include "ktorrent.moc"
+
diff --git a/apps/ktorrent/ktorrent.desktop b/apps/ktorrent/ktorrent.desktop
new file mode 100644
index 0000000..ba48aae
--- /dev/null
+++ b/apps/ktorrent/ktorrent.desktop
@@ -0,0 +1,85 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=KTorrent
+Name[sv]=Ktorrent
+Name[xx]=xxKTorrentxx
+GenericName=BitTorrent Client
+GenericName[ar]=زبون BitTorrent
+GenericName[bg]=Бит Торент клиент
+GenericName[br]=Kliant BitTorrent
+GenericName[ca]=Client de BitTorrent
+GenericName[cs]=BitTorrent klient
+GenericName[da]=BitTorrent klient
+GenericName[de]=BitTorrent-Programm
+GenericName[el]=Πελάτης BitTorrent
+GenericName[es]=Cliente de BitTorrent
+GenericName[et]=BitTorrenti klient
+GenericName[fa]=کارخواه BitTorrent
+GenericName[fr]=Client BitTorrent
+GenericName[gl]=Cliente BitTorrent
+GenericName[it]=Client BitTorrent
+GenericName[ja]=BitTorrent クライアント
+GenericName[ka]=BitTorrent-ის კლიენტი
+GenericName[lt]=BitTorrent klientas
+GenericName[ms]=Klien BitTorrent
+GenericName[nb]=BitTorrent-klient
+GenericName[nds]=Bittorrent-Programm
+GenericName[nl]=BitTorrent-cliënt
+GenericName[pa]=BitTorrent ਕਲਾਂਇਟ
+GenericName[pl]=Klient BitTorrenta
+GenericName[pt]=Cliente de BitTorrent
+GenericName[pt_BR]=Cliente BitTorrent
+GenericName[ru]=Клиент BitTorrent
+GenericName[sk]=BitTorrent Klient
+GenericName[sr]=BitTorrent клијент
+GenericName[sr@Latn]=BitTorrent klijent
+GenericName[sv]=BitTorrent-klient
+GenericName[tr]=BitTorrent İstemcisi
+GenericName[uk]=Клієнт BitTorrent
+GenericName[xx]=xxBitTorrent Clientxx
+GenericName[zh_CN]=BitTorrent 客户端
+GenericName[zh_TW]=BitTorrent 客戶端程式
+Exec=ktorrent %i %m -caption "%c" %u
+Icon=ktorrent
+Type=Application
+DocPath=ktorrent/index.html
+MimeType=application/x-bittorrent;application/x-torrent;
+X-DCOP-ServiceType=Unique
+Comment=A BitTorrent program for KDE
+Comment[ar]=برنامِج BitTorrent لِــ KDE
+Comment[bg]=Бит Торент клиент за KDE
+Comment[br]=Ur programm BitTorrent evit KDE
+Comment[ca]=Un programa de BitTorrent per KDE
+Comment[cs]=BitTorrent pro KDE
+Comment[da]=Et BitTorrent program for KDE
+Comment[de]=Ein BitTorrent-Programm für KDE
+Comment[el]=Μία εφαρμογή BitTorrent για το KDE
+Comment[es]=Un programa de BitTorrent para KDE
+Comment[et]=KDE BitTorrenti rakendus
+Comment[fa]=یک برنامۀ BitTorrent برای KDE
+Comment[fr]=Un programme BitTorrent pour KDE
+Comment[gl]=Programa de BitTorrent para KDE
+Comment[it]=Un programma BitTorrent per KDE
+Comment[ja]=KDE のための BitTorrent プログラム
+Comment[ka]=BitTorrent-ის პროგრამა KDE-თვის
+Comment[lt]=BitTorrent programa skirta KDE aplinkai
+Comment[ms]=Program BitTorrent untuk KDE
+Comment[nb]=Et BitTorrent-program for KDE
+Comment[nds]=En Bittorrent-Programm för KDE
+Comment[nl]=Een BitTorrent-programma voor KDE
+Comment[pa]=KDE ਲਈ BitTorrent ਕਾਰਜ
+Comment[pl]=Program BitTorrent dla KDE
+Comment[pt]=Um programa de BitTorrent para o KDE
+Comment[pt_BR]=Um programa BitTorrent para o KDE
+Comment[ru]=Клиент BitTorrent для KDE
+Comment[sk]=BitTorrent klient pre KDE
+Comment[sr]=BitTorrent програм за KDE
+Comment[sr@Latn]=BitTorrent program za KDE
+Comment[sv]=Ett BitTorrent-program för KDE
+Comment[tr]=KDE için BitTorrent uygulaması
+Comment[uk]=Програма BitTorrent для KDE
+Comment[xx]=xxA BitTorrent program for KDExx
+Comment[zh_CN]=一个 KDE 的 BitTorrent 程序
+Comment[zh_TW]=KDE 的 BitTorrent 程式
+Terminal=false
+Categories=Qt;KDE;Network;FileTransfer;
diff --git a/apps/ktorrent/ktorrent.h b/apps/ktorrent/ktorrent.h
new file mode 100644
index 0000000..8821f50
--- /dev/null
+++ b/apps/ktorrent/ktorrent.h
@@ -0,0 +1,238 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 _KTORRENT_H_
+#define _KTORRENT_H_
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kapplication.h>
+#include <newui/dmainwindow.h>
+#include <qtimer.h>
+#include <interfaces/guiinterface.h>
+
+typedef QValueList<QCString> QCStringList;
+
+class KAction;
+class KToggleAction;
+class KURL;
+class KTorrentCore;
+class KTorrentView;
+class TrayIcon;
+class SetMaxRate;
+class KTorrentDCOP;
+class QLabel;
+class QListViewItem;
+class KTorrentPreferences;
+class ViewManager;
+
+
+namespace kt
+{
+ class TorrentInterface;
+ class Group;
+ class GroupView;
+}
+
+
+/**
+ * This class serves as the main window for KTorrent. It handles the
+ * menus, toolbars, and status bars.
+ *
+ * @short Main window class
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ * @version 0.1
+ */
+class KTorrent : public DMainWindow, public kt::GUIInterface
+{
+ Q_OBJECT
+public:
+ /**
+ * Default Constructor
+ */
+ KTorrent();
+
+ /**
+ * Default Destructor
+ */
+ virtual ~KTorrent();
+
+ /// Open a view with the given group
+ void openView(const QString & group_name);
+
+ /// Get the core
+ KTorrentCore & getCore() {return *m_core;}
+
+ /**
+ * Apply the settings.
+ * @param change_port Wether or not to change the server port
+ */
+ void applySettings(bool change_port = true);
+
+ virtual void addTabPage(QWidget* page,const QIconSet & icon,
+ const QString & caption,kt::CloseTabListener* ctl = 0);
+ virtual void addTabPage(QWidget* page,const QPixmap & icon,
+ const QString & caption,kt::CloseTabListener* ctl = 0);
+ virtual void removeTabPage(QWidget* page);
+ virtual void addPrefPage(kt::PrefPageInterface* page);
+ virtual void removePrefPage(kt::PrefPageInterface* page);
+ virtual void mergePluginGui(kt::Plugin* p);
+ virtual void removePluginGui(kt::Plugin* p);
+ virtual void addWidgetBelowView(QWidget* w,const QString & icon,const QString & caption);
+ virtual void removeWidgetBelowView(QWidget* w);
+ virtual void addToolWidget(QWidget* w,const QString & icon,const QString & caption,ToolDock dock);
+ virtual void removeToolWidget(QWidget* w);
+ virtual const kt::TorrentInterface* getCurrentTorrent() const;
+ virtual KToolBar* addToolBar(const char* name);
+ virtual void removeToolBar(KToolBar* tb);
+ virtual KProgress* addProgressBarToStatusBar();
+ virtual void removeProgressBarFromStatusBar(KProgress* p);
+
+ QString getStatusInfo();
+ QString getStatusTransfer();
+ QString getStatusSpeed();
+ QString getStatusDHT();
+ QString getStatusFirewall();
+ QCStringList getTorrentInfo(kt::TorrentInterface* tc);
+
+public slots:
+ /**
+ * Use this method to load whatever file/URL you have
+ */
+ void load(const KURL& url);
+
+ /**
+ * Does the same as load, but doesn't ask any questions
+ */
+ void loadSilently(const KURL& url);
+
+ /**
+ * Does the same as loadSilently, except accepts a directory to
+ * save to
+ */
+ void loadSilentlyDir(const KURL& url, const KURL& savedir);
+
+ /// Open a view with the given group
+ void openView(kt::Group* g);
+
+protected:
+ /**
+ * This function is called when it is time for the app to save its
+ * properties for session management purposes.
+ */
+ void saveProperties(KConfig *);
+
+ /**
+ * This function is called when this app is restored. The KConfig
+ * object points to the session management config file that was saved
+ * with @ref saveProperties
+ */
+ void readProperties(KConfig *);
+
+
+private slots:
+ void fileOpen();
+ void fileNew();
+ void torrentPaste();
+ void startDownload();
+ void startAllDownloadsCurrentView();
+ void startAllDownloads();
+ void stopDownload();
+ void stopAllDownloadsCurrentView();
+ void stopAllDownloads();
+ void showIPFilter();
+ void removeDownload();
+ void queueManagerShow();
+ void optionsShowStatusbar();
+ void optionsShowMenubar();
+ void optionsConfigureKeys();
+ void optionsConfigureToolbars();
+ void optionsPreferences();
+ void newToolbarConfig();
+ void changeStatusbar(const QString& text);
+ void changeCaption(const QString& text);
+ void currentTorrentChanged(kt::TorrentInterface* tc);
+ void updatedStats();
+ void urlDropped(QDropEvent*,QListViewItem*);
+ void onUpdateActions(int flags);
+ void groupChanged(kt::Group* g);
+ void groupRenamed(kt::Group* g);
+ void groupRemoved(kt::Group* g);
+ void currentTabChanged(QWidget* w);
+ void openDefaultView();
+ void statusBarMsgExpired();
+ void find();
+
+private:
+ void setupAccel();
+ void setupActions();
+ bool queryClose();
+ bool queryExit();
+
+
+ virtual void addWidgetInView(QWidget* w,kt::Position pos);
+ virtual void removeWidgetFromView(QWidget* w);
+ virtual void closeTab();
+
+private:
+ kt::GroupView* m_group_view;
+ ViewManager* m_view_man;
+ KToggleAction *m_statusbarAction;
+ KToggleAction* m_menubarAction;
+
+ KTorrentCore* m_core;
+ TrayIcon* m_systray_icon;
+ SetMaxRate* m_set_max_upload_rate;
+ SetMaxRate* m_set_max_download_rate;
+
+ KTorrentDCOP* m_dcop;
+ QTimer m_gui_update_timer;
+ QTimer m_status_msg_expire;
+ KTorrentPreferences* m_pref;
+
+ QMap<QWidget*,kt::CloseTabListener*> m_tab_map;
+
+ QLabel* m_statusInfo;
+ QLabel* m_statusTransfer;
+ QLabel* m_statusSpeed;
+ QLabel* m_statusDHT;
+ QLabel* m_statusFirewall;
+
+ KAction* m_start;
+ KAction* m_stop;
+ KAction* m_remove;
+ KAction* m_startall;
+ KAction* m_startall_systray;
+ KAction* m_stopall;
+ KAction* m_stopall_systray;
+ KAction* m_pasteurl;
+ KAction* m_queuemgr;
+ KAction* m_queueaction;
+ KAction* m_datacheck;
+ KAction* m_ipfilter;
+ KAction* m_find;
+
+ KProgress* m_status_prog;
+};
+
+#endif // _KTORRENT_H_
diff --git a/apps/ktorrent/ktorrent.lsm b/apps/ktorrent/ktorrent.lsm
new file mode 100644
index 0000000..285eb74
--- /dev/null
+++ b/apps/ktorrent/ktorrent.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: KTorrent -- Some description
+Version: 0.1
+Entered-date:
+Description:
+Keywords: KDE Qt
+Author: Joris Guisson <joris.guisson@gmail.com>
+Maintained-by: Joris Guisson <joris.guisson@gmail.com>
+Home-page:
+Alternate-site:
+Primary-site: ftp://ftp.kde.org/pub/kde/unstable/apps/utils
+ xxxxxx ktorrent-0.1.tar.gz
+ xxx ktorrent-0.1.lsm
+Platform: Linux. Needs KDE
+Copying-policy: Custom
+End
diff --git a/apps/ktorrent/ktorrentapp.cpp b/apps/ktorrent/ktorrentapp.cpp
new file mode 100644
index 0000000..591848f
--- /dev/null
+++ b/apps/ktorrent/ktorrentapp.cpp
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Adam Treat *
+ * treat@kde.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 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 "ktorrentapp.h"
+
+#include <kglobal.h>
+#include <kstartupinfo.h>
+#include <kcmdlineargs.h>
+#include <kstandarddirs.h>
+#include <dcopclient.h>
+
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <util/functions.h>
+
+#include "ktorrent.h"
+
+KTorrentApp::KTorrentApp()
+ : KUniqueApplication()
+{}
+
+KTorrentApp::~KTorrentApp()
+{}
+
+int KTorrentApp::newInstance()
+{
+ // register ourselves as a dcop client
+ if (!dcopClient()->isRegistered() )
+ dcopClient()->registerAs(name(), false);
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ bt::Globals::instance().setDebugMode(args->isSet("debug"));
+
+ QString data_dir = KGlobal::dirs()->saveLocation("data","ktorrent");
+ if (!data_dir.endsWith(bt::DirSeparator()))
+ data_dir += bt::DirSeparator();
+ bt::Globals::instance().initLog(data_dir + "log");
+
+ if (!mainWidget())
+ {
+ KTorrent *widget = new KTorrent();
+ setMainWidget(widget);
+ }
+ else
+ KStartupInfo::setNewStartupId( mainWidget(), kapp->startupId());
+
+
+ KTorrent *widget = ::qt_cast<KTorrent*>( mainWidget() );
+
+ for (int i = 0; i < args->count(); i++)
+ {
+ if (args->isSet("silent"))
+ widget->loadSilently(args->url(i));
+ else
+ widget->load(args->url(i));
+ }
+
+ args->clear();
+ return 0;
+}
+
+#include "ktorrentapp.moc"
+
diff --git a/apps/ktorrent/ktorrentapp.h b/apps/ktorrent/ktorrentapp.h
new file mode 100644
index 0000000..db6048d
--- /dev/null
+++ b/apps/ktorrent/ktorrentapp.h
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Adam Treat *
+ * treat@kde.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 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 _KTORRENTAPP_H_
+#define _KTORRENTAPP_H_
+
+#include "dcopinterface.h"
+#include <kuniqueapplication.h>
+
+class KTorrentApp : public KUniqueApplication
+{
+ Q_OBJECT
+public:
+ KTorrentApp();
+ virtual ~KTorrentApp();
+
+ virtual int newInstance();
+};
+
+#endif // _KTORRENTAPP_H_
+
diff --git a/apps/ktorrent/ktorrentcore.cpp b/apps/ktorrent/ktorrentcore.cpp
new file mode 100644
index 0000000..1760fce
--- /dev/null
+++ b/apps/ktorrent/ktorrentcore.cpp
@@ -0,0 +1,1145 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <unistd.h>
+#include <qdir.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kfiledialog.h>
+#include <kprogress.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kapplication.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <qregexp.h>
+
+#include <util/log.h>
+#include <torrent/torrentcontrol.h>
+#include <torrent/globals.h>
+#include <util/error.h>
+#include <util/fileops.h>
+#include <util/waitjob.h>
+#include <torrent/torrentcreator.h>
+#include <torrent/server.h>
+#include <torrent/authenticationmonitor.h>
+#include <util/functions.h>
+#include <torrent/ipblocklist.h>
+#include <kademlia/dhtbase.h>
+#include <torrent/torrentfile.h>
+
+#include "pluginmanager.h"
+#include <torrent/queuemanager.h>
+
+#include "ktorrentcore.h"
+#include "settings.h"
+#include "functions.h"
+#include "fileselectdlg.h"
+#include "scandialog.h"
+
+
+#include <util/profiler.h>
+
+
+using namespace bt;
+using namespace kt;
+
+const Uint32 CORE_UPDATE_INTERVAL = 250;
+
+
+
+KTorrentCore::KTorrentCore(kt::GUIInterface* gui) : max_downloads(0),keep_seeding(true),pman(0)
+{
+ UpdateCurrentTime();
+
+ qman = new QueueManager();
+ connect(qman, SIGNAL(lowDiskSpace(kt::TorrentInterface*,bool)), this, SLOT(onLowDiskSpace(kt::TorrentInterface*,bool)));
+
+
+ data_dir = Settings::tempDir();
+ bool dd_not_exist = !bt::Exists(data_dir);
+ if (data_dir == QString::null || dd_not_exist)
+ {
+ data_dir = KGlobal::dirs()->saveLocation("data","ktorrent");
+ if (dd_not_exist)
+ {
+ Settings::setTempDir(data_dir);
+ Settings::writeConfig();
+ }
+ }
+
+ removed_bytes_up = removed_bytes_down = 0;
+
+ if (!data_dir.endsWith(bt::DirSeparator()))
+ data_dir += bt::DirSeparator();
+ // downloads.setAutoDelete(true);
+
+ connect(&update_timer,SIGNAL(timeout()),this,SLOT(update()));
+ update_timer.start(CORE_UPDATE_INTERVAL);
+
+ Uint16 port = Settings::port();
+ if (port == 0)
+ {
+ port = 6881;
+ Settings::setPort(6881);
+ }
+ Uint16 i = 0;
+ do
+ {
+ Globals::instance().initServer(port + i);
+ i++;
+ }
+ while (!Globals::instance().getServer().isOK() && i < 10);
+
+ if (Globals::instance().getServer().isOK())
+ {
+ if (port != port + i - 1)
+ KMessageBox::information(0,
+ i18n("Specified port (%1) is unavailable or in"
+ " use by another application. KTorrent is now using port %2.")
+ .arg(port).arg(port + i - 1));
+
+ Out(SYS_GEN|LOG_NOTICE) << "Bound to port " << (port + i - 1) << endl;
+ }
+ else
+ {
+ KMessageBox::error(0,
+ i18n("KTorrent is unable to accept connections because the ports %1 to %2 are "
+ "already in use by another program.").arg(port).arg(port + i - 1));
+ Out(SYS_GEN|LOG_IMPORTANT) << "Cannot find free port" << endl;
+ }
+
+
+ pman = new kt::PluginManager(this,gui);
+}
+
+
+KTorrentCore::~KTorrentCore()
+{
+ delete qman;
+ delete pman;
+}
+
+void KTorrentCore::loadPlugins()
+{
+ pman->loadConfigFile(KGlobal::dirs()->saveLocation("data","ktorrent") + "plugins");
+ pman->loadPluginList();
+}
+
+bool KTorrentCore::init(TorrentControl* tc,bool silently)
+{
+ connectSignals(tc);
+ qman->append(tc);
+
+ bool user = false;
+ bool start_torrent = false;
+
+ if (!silently)
+ {
+ FileSelectDlg dlg(gman, &user, &start_torrent);
+
+ if (dlg.execute(tc) != QDialog::Accepted)
+ {
+ remove(tc,false);
+ return false;
+ }
+ }
+
+ try
+ {
+ tc->createFiles();
+ }
+ catch (bt::Error & err)
+ {
+ // if we can't create files, just remove the torrent
+ KMessageBox::error(0,err.toString());
+ remove(tc,false);
+ return false;
+ }
+
+ if (tc->hasExistingFiles())
+ {
+ ScanDialog* scan_dlg = new ScanDialog(this,true);
+ scan_dlg->show();
+ scan_dlg->execute(tc,true);
+ }
+
+ tc->setPreallocateDiskSpace(true);
+
+ if(Settings::maxRatio()>0)
+ tc->setMaxShareRatio(Settings::maxRatio());
+
+ if (Settings::maxSeedTime() > 0)
+ tc->setMaxSeedTime(Settings::maxSeedTime());
+
+ torrentAdded(tc);
+ qman->torrentAdded(tc, user, start_torrent);
+
+
+ //now copy torrent file to user specified dir if needed
+ if(Settings::useTorrentCopyDir())
+ {
+ QString torFile = tc->getTorDir();
+
+ if(!torFile.endsWith("/"))
+ torFile += "/";
+
+ torFile += "torrent";
+
+ QString destination = Settings::torrentCopyDir();
+
+ if(!destination.endsWith("/"))
+ destination += "/";
+
+ destination += tc->getStats().torrent_name + ".torrent";
+
+ try
+ {
+ bt::CopyFile(torFile, destination, TRUE);
+ }
+ catch(bt::Error& err)
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Could not copy torrent file to " << destination << endl;
+ }
+ }
+
+ return true;
+}
+
+bool KTorrentCore::load(const QByteArray & data,const QString & dir,bool silently, const KURL& url)
+{
+ QString tdir = findNewTorrentDir();
+ TorrentControl* tc = 0;
+ try
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Loading torrent from data " << endl;
+ tc = new TorrentControl();
+ tc->init(qman, data, tdir, dir,
+ Settings::useSaveDir() ? Settings::saveDir() : QString());
+
+ if(!init(tc,silently))
+ loadingFinished(url, false, true);
+ else
+ loadingFinished(url, true, false);
+
+ return true;
+ }
+ catch (bt::Error & err)
+ {
+ KMessageBox::error(0,err.toString());
+ delete tc;
+ tc = 0;
+ // delete tdir if necesarry
+ if (bt::Exists(tdir))
+ bt::Delete(tdir,true);
+
+ loadingFinished(url, false, false);
+
+ return false;
+ }
+}
+
+bool KTorrentCore::load(const QString & target,const QString & dir,bool silently)
+{
+ QString tdir = findNewTorrentDir();
+ TorrentControl* tc = 0;
+ try
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Loading file " << target << endl;
+ tc = new TorrentControl();
+ tc->init(qman, target, tdir, dir,
+ Settings::useSaveDir() ? Settings::saveDir() : QString());
+
+ init(tc,silently);
+ return true;
+ }
+ catch (bt::Error & err)
+ {
+ KMessageBox::error(0,err.toString());
+ delete tc;
+ tc = 0;
+ // delete tdir if necesarry
+ if (bt::Exists(tdir))
+ bt::Delete(tdir,true);
+ return false;
+ }
+}
+
+void KTorrentCore::downloadFinished(KIO::Job *job)
+{
+ KIO::StoredTransferJob* j = (KIO::StoredTransferJob*)job;
+ int err = j->error();
+ if (err == KIO::ERR_USER_CANCELED)
+ {
+ loadingFinished(j->url(),false,true);
+ return;
+ }
+
+ if (err)
+ {
+ loadingFinished(j->url(),false,false);
+ j->showErrorDialog(0);
+ }
+ else
+ {
+ // load in the file (target is always local)
+ QString dir = Settings::saveDir();
+ if (!Settings::useSaveDir() || dir.isNull())
+ dir = QDir::homeDirPath();
+
+ if (dir != QString::null && load(j->data(),dir,false, j->url()))
+ loadingFinished(j->url(),true,false);
+ else
+ loadingFinished(j->url(),false,true);
+ }
+}
+
+void KTorrentCore::load(const KURL& url)
+{
+ if (url.isLocalFile())
+ {
+ QString path = url.path();
+ QString dir = Settings::saveDir();
+ if (!Settings::useSaveDir() || dir.isNull())
+ dir = QDir::homeDirPath();
+
+ if (dir != QString::null && load(path,dir,false))
+ loadingFinished(url,true,false);
+ else
+ loadingFinished(url,false,true);
+ }
+ else
+ {
+ KIO::Job* j = KIO::storedGet(url,false,true);
+ connect(j,SIGNAL(result(KIO::Job*)),this,SLOT(downloadFinished( KIO::Job* )));
+ }
+}
+
+void KTorrentCore::downloadFinishedSilently(KIO::Job *job)
+{
+ KIO::StoredTransferJob* j = (KIO::StoredTransferJob*)job;
+ int err = j->error();
+ if (err == KIO::ERR_USER_CANCELED)
+ {
+ loadingFinished(j->url(),false,true);
+ }
+ else if (err)
+ {
+ loadingFinished(j->url(),false,false);
+ }
+ else
+ {
+ QString dir;
+ if (custom_save_locations.contains(j))
+ {
+ // we have a custom save location so save to that
+ dir = custom_save_locations[j].path();
+ custom_save_locations.erase(j);
+ }
+ else if (!Settings::useSaveDir())
+ {
+ // incase save dir is not set, use home director
+ Out(SYS_GEN|LOG_NOTICE) << "Cannot load " << j->url() << " silently, default save location not set !" << endl;
+ Out(SYS_GEN|LOG_NOTICE) << "Using home directory instead !" << endl;
+ dir = QDir::homeDirPath();
+ }
+ else
+ {
+ dir = Settings::saveDir();
+ }
+
+
+ if (dir != QString::null && load(j->data(),dir,true,j->url()))
+ loadingFinished(j->url(),true,false);
+ else
+ loadingFinished(j->url(),false,false);
+ }
+}
+
+void KTorrentCore::loadSilently(const KURL& url)
+{
+ if (url.isLocalFile())
+ {
+ QString path = url.path();
+ QString dir = Settings::saveDir();
+ if (!Settings::useSaveDir() || dir.isNull())
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Cannot load " << path << " silently, default save location not set !" << endl;
+ Out(SYS_GEN|LOG_NOTICE) << "Using home directory instead !" << endl;
+ dir = QDir::homeDirPath();
+ }
+
+ if (dir != QString::null && load(path,dir,true))
+ loadingFinished(url,true,false);
+ else
+ loadingFinished(url,false,true);
+ }
+ else
+ {
+ // download to a random file in tmp
+ KIO::Job* j = KIO::storedGet(url,false,true);
+ connect(j,SIGNAL(result(KIO::Job*)),this,SLOT(downloadFinishedSilently( KIO::Job* )));
+ }
+}
+
+void KTorrentCore::loadSilentlyDir(const KURL& url, const KURL& savedir)
+{
+ if (url.isLocalFile())
+ {
+ QString path = url.path();
+ QString dir = savedir.path();
+ QFileInfo fi(dir);
+ if (!fi.exists() || !fi.isWritable() || !fi.isDir())
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Cannot load " << path << " silently, destination directory is not OK ! Using default save directory." << endl;
+ dir = Settings::saveDir();
+ if (!Settings::useSaveDir())
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Default save directory not set, using home directory !" << endl;
+ dir = QDir::homeDirPath();
+ }
+ }
+
+ if (dir != QString::null && load(path,dir,true))
+ loadingFinished(url,true,false);
+ else
+ loadingFinished(url,false,true);
+ }
+ else
+ {
+ // download to a random file in tmp
+ KIO::Job* j = KIO::storedGet(url,false,true);
+ custom_save_locations.insert(j,savedir); // keep track of save location
+ connect(j,SIGNAL(result(KIO::Job*)),this,SLOT(downloadFinishedSilently( KIO::Job* )));
+ }
+}
+
+void KTorrentCore::start(kt::TorrentInterface* tc)
+{
+ kt::TorrentStartResponse reason = qman->start(tc);
+ switch (reason)
+ {
+ // we can return, the question to ignore the limits will have informed the user
+ case MAX_SHARE_RATIO_REACHED:
+ case START_OK: // start OK is normal
+ case BUSY_WITH_DATA_CHECK: // checking data, so let the torrent be
+ case USER_CANCELED:
+ return;
+ case NOT_ENOUGH_DISKSPACE:
+ case QM_LIMITS_REACHED:
+ canNotStart(tc,reason);
+ break;
+ }
+}
+
+void KTorrentCore::stop(TorrentInterface* tc, bool user)
+{
+ qman->stop(tc, user);
+}
+
+int KTorrentCore::getNumRunning(bool onlyDownloads, bool onlySeeds) const
+{
+ return qman->getNumRunning(onlyDownloads, onlySeeds);
+}
+
+QString KTorrentCore::findNewTorrentDir() const
+{
+ int i = 0;
+ while (true)
+ {
+ QDir d;
+ QString dir = data_dir + QString("tor%1/").arg(i);
+ if (!d.exists(dir))
+ {
+ return dir;
+ }
+ i++;
+ }
+ return QString::null;
+}
+
+void KTorrentCore::loadExistingTorrent(const QString & tor_dir)
+{
+ TorrentControl* tc = 0;
+
+ QString idir = tor_dir;
+ if (!idir.endsWith(bt::DirSeparator()))
+ idir += bt::DirSeparator();
+
+ if (!bt::Exists(idir + "torrent"))
+ return;
+
+ try
+ {
+ tc = new TorrentControl();
+ tc->init(qman,idir + "torrent",idir,QString::null,
+ Settings::useSaveDir() ? Settings::saveDir() : QString());
+
+ qman->append(tc);
+ connectSignals(tc);
+ if (tc->getStats().autostart && tc->getStats().user_controlled)
+ start(tc);
+ torrentAdded(tc);
+ }
+ catch (bt::Error & err)
+ {
+ KMessageBox::error(0,err.toString());
+ delete tc;
+ }
+}
+
+void KTorrentCore::loadTorrents()
+{
+ QDir dir(data_dir);
+ QStringList sl = dir.entryList("tor*",QDir::Dirs);
+ for (Uint32 i = 0;i < sl.count();i++)
+ {
+
+ QString idir = data_dir + *sl.at(i);
+ if (!idir.endsWith(DirSeparator()))
+ idir.append(DirSeparator());
+
+ Out(SYS_GEN|LOG_NOTICE) << "Loading " << idir << endl;
+ loadExistingTorrent(idir);
+ }
+ qman->orderQueue();
+}
+
+void KTorrentCore::remove(TorrentInterface* tc,bool data_to)
+{
+ try
+ {
+ const TorrentStats & s = tc->getStats();
+ removed_bytes_up += s.session_bytes_uploaded;
+ removed_bytes_down += s.session_bytes_downloaded;
+ stop(tc);
+
+ QString dir = tc->getTorDir();
+
+ try
+ {
+ if (data_to)
+ tc->deleteDataFiles();
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(0,e.toString());
+ }
+
+ torrentRemoved(tc);
+ qman->torrentRemoved(tc);
+
+ bt::Delete(dir,false);
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(0,e.toString());
+ }
+}
+
+void KTorrentCore::setMaxDownloads(int max)
+{
+ qman->setMaxDownloads(max);
+}
+
+void KTorrentCore::setMaxSeeds(int max)
+{
+ qman->setMaxSeeds(max);
+}
+
+void KTorrentCore::torrentFinished(kt::TorrentInterface* tc)
+{
+ if (!keep_seeding)
+ tc->stop(false);
+
+ finished(tc);
+ qman->torrentFinished(tc);
+}
+
+void KTorrentCore::setKeepSeeding(bool ks)
+{
+ keep_seeding = ks;
+ qman->setKeepSeeding(ks);
+}
+
+void KTorrentCore::onExit()
+{
+ // stop timer to prevent updates during wait
+ update_timer.stop();
+ // stop all authentications going on
+ AuthenticationMonitor::instance().clear();
+ // shutdown the server
+ Globals::instance().shutdownServer();
+
+ WaitJob* job = new WaitJob(5000);
+ qman->onExit(job);
+ // wait for completion of stopped events
+ if (job->needToWait())
+ WaitJob::execute(job);
+ else
+ delete job;
+
+ pman->unloadAll(false);
+ qman->clear();
+}
+
+bool KTorrentCore::changeDataDir(const QString & new_dir)
+{
+ try
+ {
+ update_timer.stop();
+ // do nothing if new and old dir are the same
+ if (KURL(data_dir) == KURL(new_dir) || data_dir == (new_dir + bt::DirSeparator()))
+ {
+ update_timer.start(CORE_UPDATE_INTERVAL);
+ return true;
+ }
+
+ // safety check
+ if (!bt::Exists(new_dir))
+ bt::MakeDir(new_dir);
+
+
+ // make sure new_dir ends with a /
+ QString nd = new_dir;
+ if (!nd.endsWith(DirSeparator()))
+ nd += DirSeparator();
+
+ Out() << "Switching to datadir " << nd << endl;
+
+ qman->setPausedState(true);
+
+ QPtrList<kt::TorrentInterface> succes;
+
+ QPtrList<kt::TorrentInterface>::iterator i = qman->begin();
+ while (i != qman->end())
+ {
+ kt::TorrentInterface* tc = *i;
+ if (!tc->changeDataDir(nd))
+ {
+ // failure time to roll back all the succesfull tc's
+ rollback(succes);
+ // set back the old data_dir in Settings
+ Settings::setTempDir(data_dir);
+ Settings::self()->writeConfig();
+ qman->setPausedState(false);
+ update_timer.start(CORE_UPDATE_INTERVAL);
+ return false;
+ }
+ else
+ {
+ succes.append(tc);
+ }
+ i++;
+ }
+ data_dir = nd;
+ qman->setPausedState(false);
+ update_timer.start(CORE_UPDATE_INTERVAL);
+ return true;
+ }
+ catch (bt::Error & e)
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Error : " << e.toString() << endl;
+ update_timer.start(CORE_UPDATE_INTERVAL);
+ return false;
+ }
+}
+
+void KTorrentCore::rollback(const QPtrList<kt::TorrentInterface> & succes)
+{
+ Out() << "Error, rolling back" << endl;
+ update_timer.stop();
+ QPtrList<kt::TorrentInterface> ::const_iterator i = succes.begin();
+ while (i != succes.end())
+ {
+ (*i)->rollback();
+ i++;
+ }
+ update_timer.start(CORE_UPDATE_INTERVAL);
+}
+
+void KTorrentCore::startAll(int type)
+{
+ qman->startall(type);
+}
+
+void KTorrentCore::stopAll(int type)
+{
+ qman->stopall(type);
+}
+
+void KTorrentCore::update()
+{
+ bt::UpdateCurrentTime();
+ AuthenticationMonitor::instance().update();
+
+ QPtrList<kt::TorrentInterface>::iterator i = qman->begin();
+ //Uint32 down_speed = 0;
+ while (i != qman->end())
+ {
+ bool finished = false;
+ kt::TorrentInterface* tc = *i;
+ if (tc->isCheckingData(finished))
+ {
+ if (finished)
+ tc->afterDataCheck();
+ }
+ else if (tc->getStats().running)
+ {
+ // see if we need to do a auto data check
+ if (Settings::autoRecheck() && tc->getStats().num_corrupted_chunks >= Settings::maxCorruptedBeforeRecheck())
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Doing an automatic data check on "
+ << tc->getStats().torrent_name << endl;
+
+ ScanDialog* scan_dlg = new ScanDialog(this,false);
+ scan_dlg->show();
+ scan_dlg->execute(tc,true);
+ }
+ else
+ {
+ tc->update();
+ }
+ }
+ i++;
+ }
+}
+
+void KTorrentCore::makeTorrent(const QString & file,const QStringList & trackers,
+ int chunk_size,const QString & name,
+ const QString & comments,bool seed,
+ const QString & output_file,bool priv_tor,KProgress* prog, bool decentralized)
+{
+ QString tdir;
+ try
+ {
+ if (chunk_size < 0)
+ chunk_size = 256;
+
+ bt::TorrentCreator mktor(file,trackers,chunk_size,name,comments,priv_tor, decentralized);
+ prog->setTotalSteps(mktor.getNumChunks());
+ Uint32 ns = 0;
+ while (!mktor.calculateHash())
+ {
+ prog->setProgress(ns);
+ ns++;
+ if (ns % 10 == 0)
+ KApplication::kApplication()->processEvents();
+ }
+
+ mktor.saveTorrent(output_file);
+ tdir = findNewTorrentDir();
+ kt::TorrentInterface* tc = mktor.makeTC(tdir);
+ if (tc)
+ {
+ connectSignals(tc);
+ qman->append(tc);
+ if (seed)
+ start(tc);
+ torrentAdded(tc);
+ }
+ }
+ catch (bt::Error & e)
+ {
+ // cleanup if necessary
+ if (bt::Exists(tdir))
+ bt::Delete(tdir,true);
+
+ // Show error message
+ KMessageBox::error(0,
+ i18n("Cannot create torrent: %1").arg(e.toString()),
+ i18n("Error"));
+ }
+}
+
+CurrentStats KTorrentCore::getStats()
+{
+ CurrentStats stats;
+ Uint64 bytes_dl = 0, bytes_ul = 0;
+ Uint32 speed_dl = 0, speed_ul = 0;
+
+
+ for ( QPtrList<kt::TorrentInterface>::iterator i = qman->begin(); i != qman->end(); ++i )
+ {
+ kt::TorrentInterface* tc = *i;
+ const TorrentStats & s = tc->getStats();
+ speed_dl += s.download_rate;
+ speed_ul += s.upload_rate;
+ bytes_dl += s.session_bytes_downloaded;
+ bytes_ul += s.session_bytes_uploaded;
+ }
+ stats.download_speed = speed_dl;
+ stats.upload_speed = speed_ul;
+ stats.bytes_downloaded = bytes_dl + removed_bytes_down;
+ stats.bytes_uploaded = bytes_ul + removed_bytes_up;
+
+ return stats;
+}
+
+bool KTorrentCore::changePort(Uint16 port)
+{
+ if (getNumTorrentsRunning() == 0)
+ {
+ Globals::instance().getServer().changePort(port);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void KTorrentCore::slotStoppedByError(kt::TorrentInterface* tc, QString msg)
+{
+ emit torrentStoppedByError(tc, msg);
+}
+
+Uint32 KTorrentCore::getNumTorrentsRunning() const
+{
+ return qman->getNumRunning();
+}
+
+Uint32 KTorrentCore::getNumTorrentsNotRunning() const
+{
+ return qman->count() - qman->getNumRunning();
+}
+
+int KTorrentCore::countSeeds() const
+{
+ return qman->countSeeds();
+}
+
+int KTorrentCore::countDownloads() const
+{
+ return qman->countDownloads();
+}
+
+void KTorrentCore::addBlockedIP(QString& ip)
+{
+ IPBlocklist& filter = IPBlocklist::instance();
+ filter.addRange(ip);
+}
+
+void KTorrentCore::removeBlockedIP(QString& ip)
+{
+ IPBlocklist& filter = IPBlocklist::instance();
+ filter.removeRange(ip);
+}
+
+bt::QueueManager* KTorrentCore::getQueueManager()
+{
+ return this->qman;
+}
+
+void KTorrentCore::torrentSeedAutoStopped( kt::TorrentInterface * tc,kt::AutoStopReason reason )
+{
+ qman->startNext();
+ if (reason == kt::MAX_RATIO_REACHED)
+ maxShareRatioReached(tc);
+ else
+ maxSeedTimeReached(tc);
+}
+
+int KTorrentCore::getMaxUploadSpeed()
+{
+ return Settings::maxUploadRate();
+}
+
+int KTorrentCore::getMaxDownloadSpeed()
+{
+ return Settings::maxDownloadRate();
+}
+
+void KTorrentCore::setMaxUploadSpeed(int v)
+{
+ return Settings::setMaxUploadRate(v);
+}
+
+void KTorrentCore::setMaxDownloadSpeed(int v)
+{
+ return Settings::setMaxDownloadRate(v);
+}
+
+void KTorrentCore::setPausedState(bool pause)
+{
+ qman->setPausedState(pause);
+}
+
+void KTorrentCore::queue(kt::TorrentInterface* tc)
+{
+ qman->queue(tc);
+}
+
+TorrentInterface* KTorrentCore::getTorFromNumber(int tornumber)
+{
+ QString tordir = data_dir + "tor" + QString("%1").arg(tornumber) + "/";
+ Out() << "tordir " << tordir << endl;
+ QPtrList<TorrentInterface>::iterator i = qman->begin();
+ while(i != qman->end())
+ {
+ TorrentInterface* tc = *i;
+ QString td = tc->getTorDir();
+ if(td == tordir)
+ return tc;
+ i++;
+ }
+ TorrentInterface* nullinterface = 0;
+ return nullinterface;
+}
+
+QValueList<int> KTorrentCore::getTorrentNumbers(int type = 3)
+{
+ QValueList<int> tornums;
+ QPtrList<TorrentInterface>::iterator i = qman->begin();
+ while(i != qman->end())
+ {
+ TorrentInterface* tc = *i;
+ if((type == 1 && tc->getStats().completed) ||
+ (type == 2 && !(tc->getStats().completed)))
+ {
+ Out() << "Skipping a torrent" << endl;
+ i++;
+ continue;
+ }
+ QString td = tc->getTorDir();
+ Out() << td << endl;
+ td = td.remove(0, td.length() - 6);
+ td = td.remove(QRegExp("[^0-9]*"));
+ Out() << td << endl;
+ tornums.append(td.toInt());
+ i++;
+ }
+ return tornums;
+}
+
+Uint32 KTorrentCore::getFileCount(int tornumber)
+{
+ kt::TorrentInterface* tc = getTorFromNumber(tornumber);
+ if(tc)
+ return tc->getNumFiles();
+ else
+ return 0;
+}
+
+QCStringList KTorrentCore::getFileNames(int tornumber)
+{
+ QCStringList filenames;
+ kt::TorrentInterface* tc = getTorFromNumber(tornumber);
+ if(!tc || tc->getNumFiles() == 0)
+ return filenames;
+ for(Uint32 i = 0; i < tc->getNumFiles(); i++)
+ {
+ QCString filename = tc->getTorrentFile(i).getPath().ascii();
+ filenames.append(filename);
+ }
+
+ return filenames;
+}
+
+QValueList<int> KTorrentCore::getFilePriorities(int tornumber)
+{
+ QValueList<int> priorities;
+ kt::TorrentInterface* tc = getTorFromNumber(tornumber);
+ if(!tc || tc->getNumFiles() == 0)
+ return priorities;
+
+ for(Uint32 i = 0; i < tc->getNumFiles(); i++)
+ {
+ bt::Priority priority = tc->getTorrentFile(i).getPriority();
+ int newpriority;
+ switch(priority)
+ {
+ case bt::FIRST_PRIORITY:
+ newpriority = 3;
+ break;
+ case bt::LAST_PRIORITY:
+ newpriority = 1;
+ break;
+ case bt::EXCLUDED:
+ newpriority = 0;
+ break;
+ default:
+ newpriority = 2;
+ break;
+ }
+ priorities.append(newpriority);
+ }
+ return priorities;
+}
+
+void KTorrentCore::setFilePriority(kt::TorrentInterface* tc, Uint32 index,
+ int priority)
+{
+ bt::Priority newpriority;
+ switch(priority)
+ {
+ case 3:
+ newpriority = bt::FIRST_PRIORITY;
+ break;
+ case 1:
+ newpriority = bt::LAST_PRIORITY;
+ break;
+ case 0:
+ newpriority = bt::EXCLUDED;
+ break;
+ default:
+ newpriority = bt::NORMAL_PRIORITY;
+ break;
+ }
+
+ tc->getTorrentFile(index).setPriority(newpriority);
+}
+
+void KTorrentCore::announceByTorNum(int tornumber)
+{
+ kt::TorrentInterface* tc = getTorFromNumber(tornumber);
+ if(tc)
+ tc->updateTracker();
+}
+
+void KTorrentCore::aboutToBeStarted(kt::TorrentInterface* tc,bool & ret)
+{
+ ret = true;
+
+ QStringList missing;
+ if (!tc->hasMissingFiles(missing))
+ return;
+
+
+ if (tc->getStats().multi_file_torrent)
+ {
+ QString msg = i18n("Several data files of the torrent \"%1\" are missing, do you want to recreate them, or do you want to not download them?").arg(tc->getStats().torrent_name);
+
+ int ret = KMessageBox::warningYesNoCancelList(0,msg,missing,QString::null,
+ KGuiItem(i18n("Recreate")),KGuiItem(i18n("Do Not Download")));
+ if (ret == KMessageBox::Yes)
+ {
+ try
+ {
+ // recreate them
+ tc->recreateMissingFiles();
+ }
+ catch (bt::Error & e)
+ {
+ KMessageBox::error(0,i18n("Cannot recreate missing files: %1").arg(e.toString()));
+ tc->handleError(i18n("Data files are missing"));
+ ret = false;
+ }
+ }
+ else if (ret == KMessageBox::No)
+ {
+ try
+ {
+ // mark them as do not download
+ tc->dndMissingFiles();
+ }
+ catch (bt::Error & e)
+ {
+ KMessageBox::error(0,i18n("Cannot deselect missing files: %1").arg(e.toString()));
+ tc->handleError(i18n("Data files are missing"));
+ ret = false;
+ }
+ }
+ else
+ {
+ tc->handleError(i18n("Data files are missing"));
+ ret = false;
+ }
+ }
+ else
+ {
+ QString msg = i18n("The file where the data is saved of the torrent \"%1\" is missing, do you want to recreate it?").arg(tc->getStats().torrent_name);
+ int ret = KMessageBox::warningYesNo(0,msg, i18n("Recreate"),KGuiItem(i18n("Recreate")),KGuiItem(i18n("Do Not Recreate")));
+ if (ret == KMessageBox::Yes)
+ {
+ try
+ {
+ tc->recreateMissingFiles();
+ }
+ catch (bt::Error & e)
+ {
+ KMessageBox::error(0,i18n("Cannot recreate data file: %1").arg(e.toString()));
+ tc->handleError(i18n("Data file is missing"));
+ ret = false;
+ }
+ }
+ else
+ {
+ tc->handleError(i18n("Data file is missing"));
+ ret = false;
+ }
+ }
+
+}
+
+void KTorrentCore::emitCorruptedData(kt::TorrentInterface* tc)
+{
+ corruptedData(tc);
+
+}
+
+void KTorrentCore::connectSignals(kt::TorrentInterface* tc)
+{
+ connect(tc,SIGNAL(finished(kt::TorrentInterface*)),
+ this,SLOT(torrentFinished(kt::TorrentInterface* )));
+ connect(tc, SIGNAL(stoppedByError(kt::TorrentInterface*, QString )),
+ this, SLOT(slotStoppedByError(kt::TorrentInterface*, QString )));
+ connect(tc, SIGNAL(seedingAutoStopped(kt::TorrentInterface*, kt::AutoStopReason)),
+ this, SLOT(torrentSeedAutoStopped(kt::TorrentInterface*, kt::AutoStopReason)));
+ connect(tc,SIGNAL(aboutToBeStarted( kt::TorrentInterface*,bool & )),
+ this, SLOT(aboutToBeStarted( kt::TorrentInterface*,bool & )));
+ connect(tc,SIGNAL(corruptedDataFound( kt::TorrentInterface* )),
+ this, SLOT(emitCorruptedData( kt::TorrentInterface* )));
+ connect(qman, SIGNAL(queuingNotPossible(kt::TorrentInterface*)),
+ this, SLOT(enqueueTorrentOverMaxRatio( kt::TorrentInterface* )));
+ connect(qman, SIGNAL(lowDiskSpace(kt::TorrentInterface*, bool)),
+ this, SLOT(onLowDiskSpace(kt::TorrentInterface*, bool)));
+
+}
+
+float KTorrentCore::getGlobalMaxShareRatio() const
+{
+ return Settings::maxRatio();
+}
+
+void KTorrentCore::enqueueTorrentOverMaxRatio(kt::TorrentInterface* tc)
+{
+ emit queuingNotPossible(tc);
+}
+
+
+void KTorrentCore::doDataCheck(kt::TorrentInterface* tc)
+{
+ bool dummy = false;
+ if (tc->isCheckingData(dummy))
+ return;
+
+ ScanDialog* scan_dlg = new ScanDialog(this,false);
+ scan_dlg->setCaption(i18n("Checking Data Integrity"));
+ scan_dlg->show();
+ scan_dlg->execute(tc,false);
+}
+
+void KTorrentCore::onLowDiskSpace(kt::TorrentInterface * tc, bool stopped)
+{
+ emit lowDiskSpace(tc, stopped);
+}
+
+#include "ktorrentcore.moc"
diff --git a/apps/ktorrent/ktorrentcore.h b/apps/ktorrent/ktorrentcore.h
new file mode 100644
index 0000000..e0ed362
--- /dev/null
+++ b/apps/ktorrent/ktorrentcore.h
@@ -0,0 +1,357 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTORRENTCORE_H
+#define KTORRENTCORE_H
+
+#include <qmap.h>
+#include <qtimer.h>
+#include <qcstring.h>
+#include <util/constants.h>
+#include <interfaces/coreinterface.h>
+
+typedef QValueList<QCString> QCStringList;
+
+namespace bt
+{
+ class Server;
+ class QueueManager;
+ class TorrentControl;
+}
+
+namespace KIO
+{
+ class Job;
+}
+
+namespace kt
+{
+ class Plugin;
+ class PluginManager;
+ class GUIInterface;
+ class TorrentInterface;
+ class GroupManager;
+}
+
+
+
+
+class KProgress;
+
+/**
+ * @author Joris Guisson
+ * @brief Keeps track of all TorrentInterface objects
+ *
+ * This class keeps track of all TorrentInterface objects.
+ */
+class KTorrentCore : public kt::CoreInterface
+{
+ Q_OBJECT
+public:
+ KTorrentCore(kt::GUIInterface* gui);
+ virtual ~KTorrentCore();
+
+
+ kt::PluginManager & getPluginManager() {return *pman;}
+ const kt::PluginManager & getPluginManager() const {return *pman;}
+
+ /**
+ * Load all torrents from the data dir.
+ */
+ void loadTorrents();
+
+ /**
+ * Load an existing torrent, which has already a properly set up torX dir.
+ * @param tor_dir The torX dir
+ */
+ void loadExistingTorrent(const QString & tor_dir);
+
+ /**
+ * Set the maximum number of simultanious downloads.
+ * @param max The max num (0 == no limit)
+ */
+ void setMaxDownloads(int max);
+
+ /**
+ * Set the maximum number of simultaneous seeds.
+ * @param max The max num (0 == no limit)
+ */
+ void setMaxSeeds(int max);
+
+ /**
+ * Set wether or not we should keep seeding after
+ * a download has finished.
+ * @param ks Keep seeding yes or no
+ */
+ void setKeepSeeding(bool ks);
+
+ /**
+ * Change the data dir. This involves copying
+ * all data from the old dir to the new.
+ * This can offcourse go horribly wrong, therefore
+ * if it doesn't succeed it returns false
+ * and leaves everything where it supposed to be.
+ * @param new_dir The new directory
+ */
+ bool changeDataDir(const QString & new_dir);
+
+ /**
+ * Save active torrents on exit.
+ */
+ void onExit();
+
+ /**
+ * Start all, takes into account the maximum number of downloads.
+ * @param type Wether to start all downloads or seeds. 1=Downloads, 2=Seeds, 3=All
+ */
+ void startAll(int type);
+
+ /**
+ * Stop all torrents.
+ * @param type Wether to start all downloads or seeds. 1=Downloads, 2=Seeds, 3=All
+ */
+ void stopAll(int type);
+
+ /**
+ * Make a torrent file
+ * @param file The file or dir to make a torrent of
+ * @param trackers A list of trackers
+ * @param chunk_size The size of each chunk (in KB)
+ * @param name The torrents name (usually filename)
+ * @param comments The comments
+ * @param seed Wether or not to start seeding or not
+ * @param output_file File to store the torrent file
+ * @param priv_tor Is this a private torrent
+ * @param prog Progress bar to update
+ */
+ void makeTorrent(const QString & file,const QStringList & trackers,
+ int chunk_size,const QString & name,const QString & comments,
+ bool seed,const QString & output_file,bool priv_tor,KProgress* prog, bool decentralized);
+
+ CurrentStats getStats();
+
+ /**
+ * Switch the port when no torrents are running.
+ * @param port The new port
+ * @return true if we can, false if there are torrents running
+ */
+ bool changePort(bt::Uint16 port);
+
+ /// Get the number of torrents running (including seeding torrents).
+ bt::Uint32 getNumTorrentsRunning() const;
+
+ /// Get the number of torrents not running.
+ bt::Uint32 getNumTorrentsNotRunning() const;
+
+ ///Inserts blocked IP range into IPBlocklist
+ void addBlockedIP(QString& ip);
+
+ ///Removes blocked IP range from IPBlocklist
+ void removeBlockedIP(QString& ip);
+
+ /**
+ * Find the next free torX dir.
+ * @return Path to the dir (including the torX part)
+ */
+ QString findNewTorrentDir() const;
+
+ /**
+ * Load plugins.
+ */
+ void loadPlugins();
+
+ virtual void load(const KURL& url);
+ virtual void loadSilently(const KURL& url);
+ virtual void loadSilentlyDir(const KURL& url, const KURL& savedir);
+ virtual float getGlobalMaxShareRatio() const;
+
+
+ bt::QueueManager* getQueueManager();
+
+ kt::GroupManager* getGroupManager() const { return gman; }
+ void setGroupManager(kt::GroupManager* g) { gman = g; }
+
+ ///Gets the number of torrents running
+ int getNumRunning(bool onlyDownloads = true, bool onlySeeds = false) const;
+ ///Gets the number of torrents that are in state 'download' - total
+ int countDownloads() const;
+ ///Gets the number of torrents that are in state 'seed' - total
+ int countSeeds() const;
+
+ int getMaxDownloadSpeed();
+ int getMaxUploadSpeed();
+ void setMaxDownloadSpeed(int v);
+ void setMaxUploadSpeed(int v);
+
+ void setPausedState(bool pause);
+
+ kt::TorrentInterface* getTorFromNumber(int tornumber);
+ QValueList<int> getTorrentNumbers(int type);
+ unsigned int getFileCount(int tornumber);
+ QCStringList getFileNames(int tornumber);
+ QValueList<int> getFilePriorities(int tornumber);
+ void setFilePriority(kt::TorrentInterface* tc, bt::Uint32 index, int priority);
+ void announceByTorNum(int tornumber);
+
+
+public slots:
+ /**
+ * Load a torrent file. Pops up an error dialog
+ * if something goes wrong.
+ * @param file The torrent file (always a local file)
+ * @param dir Directory to save the data
+ * @param silently Wether or not to do this silently
+ */
+ bool load(const QString & file,const QString & dir,bool silently);
+
+ /**
+ * Load a torrent file. Pops up an error dialog
+ * if something goes wrong.
+ * @param data Byte array of the torrent file
+ * @param dir Directory to save the data
+ * @param silently Wether or not to do this silently
+ */
+ bool load(const QByteArray & data,const QString & dir,bool silently, const KURL& url);
+
+ /**
+ * Remove a download.This will delete all temp
+ * data from this TorrentInterface And delete the
+ * TorrentInterface itself. It can also potentially
+ * start a new download (when one is waiting to be downloaded).
+ * @param tc
+ * @param data_to
+ */
+ void remove(kt::TorrentInterface* tc,bool data_to);
+
+ /**
+ * Update all torrents.
+ */
+ void update();
+
+ /**
+ * Start a torrent, takes into account the maximum number of downloads.
+ * @param tc The TorrentInterface
+ */
+ void start(kt::TorrentInterface* tc);
+
+ /**
+ * Stop a torrent, may start another download if it hasn't been started.
+ * @param tc The TorrentInterface
+ */
+ void stop(kt::TorrentInterface* tc, bool user = false);
+
+ /**
+ * Enqueue/Dequeue function. Places a torrent in queue.
+ * If the torrent is already in queue this will remove it from queue.
+ * @param tc TorrentControl pointer.
+ */
+ void queue(kt::TorrentInterface* tc);
+
+ /**
+ * A torrent is about to be started. We will do some file checks upon this signal.
+ * @param tc The TorrentInterface
+ */
+ void aboutToBeStarted(kt::TorrentInterface* tc,bool & ret);
+
+ /**
+ * User tried to enqueue a torrent that has reached max share ratio.
+ * Emits appropriate signal.
+ */
+ void enqueueTorrentOverMaxRatio(kt::TorrentInterface* tc);
+
+ /**
+ * Do a data check on a torrent
+ * @param tc
+ */
+ void doDataCheck(kt::TorrentInterface* tc);
+
+ ///Fires when disk space is running low
+ void onLowDiskSpace(kt::TorrentInterface* tc, bool stopped);
+
+signals:
+ /**
+ * TorrentCore torrents have beed updated. Stats are changed.
+ **/
+ void statsUpdated();
+
+ /**
+ * Emitted when a torrent has reached it's max share ratio.
+ * @param tc The torrent
+ */
+ void maxShareRatioReached(kt::TorrentInterface* tc);
+
+ /**
+ * Emitted when a torrent has reached it's max seed time
+ * @param tc The torrent
+ */
+ void maxSeedTimeReached(kt::TorrentInterface* tc);
+
+ /**
+ * Corrupted data has been detected.
+ * @param tc The torrent with the corrupted data
+ */
+ void corruptedData(kt::TorrentInterface* tc);
+
+ /**
+ * User tried to enqueue a torrent that has reached max share ratio. It's not possible.
+ * Signal should be connected to SysTray slot which shows appropriate KPassivePopup info.
+ * @param tc The torrent in question.
+ */
+ void queuingNotPossible(kt::TorrentInterface* tc);
+
+ /**
+ * Emitted when a torrent cannot be started
+ * @param tc The torrent
+ * @param reason The reason
+ */
+ void canNotStart(kt::TorrentInterface* tc,kt::TorrentStartResponse reason);
+
+ /**
+ * Diskspace is running low.
+ * Signal should be connected to SysTray slot which shows appropriate KPassivePopup info.
+ * @param tc The torrent in question.
+ */
+ void lowDiskSpace(kt::TorrentInterface* tc, bool stopped);
+
+private:
+ void rollback(const QPtrList<kt::TorrentInterface> & success);
+ void connectSignals(kt::TorrentInterface* tc);
+ bool init(bt::TorrentControl* tc,bool silently);
+
+private slots:
+ void torrentFinished(kt::TorrentInterface* tc);
+ void slotStoppedByError(kt::TorrentInterface* tc, QString msg);
+ void torrentSeedAutoStopped(kt::TorrentInterface* tc,kt::AutoStopReason reason);
+ void downloadFinished(KIO::Job *job);
+ void downloadFinishedSilently(KIO::Job *job);
+ void emitCorruptedData(kt::TorrentInterface* tc);
+
+private:
+ QString data_dir;
+ int max_downloads;
+ bool keep_seeding;
+ QTimer update_timer;
+ bt::Uint64 removed_bytes_up,removed_bytes_down;
+ kt::PluginManager* pman;
+ bt::QueueManager* qman;
+ kt::GroupManager* gman;
+ QMap<KIO::Job*,KURL> custom_save_locations; // map to store save locations
+};
+
+#endif
diff --git a/apps/ktorrent/ktorrentdcop.cpp b/apps/ktorrent/ktorrentdcop.cpp
new file mode 100644
index 0000000..592f74d
--- /dev/null
+++ b/apps/ktorrent/ktorrentdcop.cpp
@@ -0,0 +1,254 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include "ktorrentdcop.h"
+#include "ktorrent.h"
+#include "ktorrentcore.h"
+#include "settings.h"
+#include <torrent/ipblocklist.h>
+
+KTorrentDCOP::KTorrentDCOP(KTorrent* app)
+ : DCOPObject("KTorrent"),app(app)
+{}
+
+
+KTorrentDCOP::~KTorrentDCOP()
+{}
+
+
+bool KTorrentDCOP::changeDataDir(const QString& new_dir)
+{
+ Settings::setTempDir(new_dir);
+ Settings::writeConfig();
+ return app->getCore().changeDataDir(new_dir);
+}
+
+void KTorrentDCOP::openTorrent(const QString& file)
+{
+ app->load(KURL::fromPathOrURL(file));
+}
+
+void KTorrentDCOP::openTorrentSilently(const QString & file)
+{
+ app->loadSilently(KURL::fromPathOrURL(file));
+}
+
+void KTorrentDCOP::setKeepSeeding(bool ks)
+{
+ Settings::setKeepSeeding(ks);
+ Settings::writeConfig();
+ app->applySettings();
+}
+
+void KTorrentDCOP::setMaxConnectionsPerDownload(int max)
+{
+ Settings::setMaxConnections(max);
+ Settings::writeConfig();
+ app->applySettings();
+}
+
+void KTorrentDCOP::setMaxDownloads(int max)
+{
+ Settings::setMaxDownloads(max);
+ Settings::writeConfig();
+ app->applySettings();
+}
+
+void KTorrentDCOP::setMaxSeeds(int max)
+{
+ Settings::setMaxSeeds(max);
+ Settings::writeConfig();
+ app->applySettings();
+}
+
+void KTorrentDCOP::setMaxUploadSpeed(int kbytes_per_sec)
+{
+ Settings::setMaxUploadRate(kbytes_per_sec);
+ Settings::writeConfig();
+ app->applySettings();
+}
+
+void KTorrentDCOP::setMaxDownloadSpeed(int kbytes_per_sec)
+{
+ Settings::setMaxDownloadRate(kbytes_per_sec);
+ Settings::writeConfig();
+ app->applySettings();
+}
+
+void KTorrentDCOP::setShowSysTrayIcon(bool yes)
+{
+ Settings::setShowSystemTrayIcon(yes);
+ Settings::writeConfig();
+ app->applySettings();
+}
+
+void KTorrentDCOP::startAll(int type)
+{
+ app->getCore().startAll(type);
+}
+
+void KTorrentDCOP::stopAll(int type)
+{
+ app->getCore().stopAll(type);
+}
+
+void KTorrentDCOP::start(int tornumber)
+{
+ kt::TorrentInterface* tc = app->getCore().getTorFromNumber(tornumber);
+ if(tc)
+ app->getCore().start(tc);
+}
+
+void KTorrentDCOP::stop(int tornumber, bool user)
+{
+ kt::TorrentInterface* tc = app->getCore().getTorFromNumber(tornumber);
+ if(tc)
+ app->getCore().stop(tc, user);
+}
+
+QValueList<int> KTorrentDCOP::getTorrentNumbers(int type)
+{
+ return app->getCore().getTorrentNumbers(type);
+}
+
+QCStringList KTorrentDCOP::getTorrentInfo(int tornumber)
+{
+ QCStringList torrentinfo;
+ kt::TorrentInterface* tc = app->getCore().getTorFromNumber(tornumber);
+ if(tc)
+ torrentinfo = app->getTorrentInfo(tc);
+ return torrentinfo;
+}
+
+
+QCStringList KTorrentDCOP::getInfo()
+{
+ QCStringList info;
+ QString thisinfo = app->getStatusInfo();
+ info.append(thisinfo.ascii());
+ thisinfo = app->getStatusTransfer();
+ info.append(thisinfo.ascii());
+ thisinfo = app->getStatusSpeed();
+ info.append(thisinfo.ascii());
+ thisinfo = app->getStatusDHT();
+ info.append(thisinfo.ascii());
+ return info;
+}
+
+int KTorrentDCOP::getFileCount(int tornumber)
+{
+ return app->getCore().getFileCount(tornumber);
+}
+
+QCStringList KTorrentDCOP::getFileNames(int tornumber)
+{
+ return app->getCore().getFileNames(tornumber);
+}
+
+QValueList<int> KTorrentDCOP::getFilePriorities(int tornumber)
+{
+ return app->getCore().getFilePriorities(tornumber);
+}
+
+void KTorrentDCOP::setFilePriority(int tornumber,
+ int index, int priority)
+{
+ kt::TorrentInterface* tc = app->getCore().getTorFromNumber(tornumber);
+ if(tc)
+ app->getCore().setFilePriority(tc, index, priority);
+}
+
+void KTorrentDCOP::remove(int tornumber, bool del_data)
+{
+ kt::TorrentInterface* tc = app->getCore().getTorFromNumber(tornumber);
+ if(tc)
+ app->getCore().remove(tc, del_data);
+}
+
+void KTorrentDCOP::announce(int tornumber)
+{
+ app->getCore().announceByTorNum(tornumber);
+}
+
+QCString KTorrentDCOP::dataDir()
+{
+ QCString dir = Settings::tempDir().ascii();
+ return dir;
+}
+
+int KTorrentDCOP::maxDownloads()
+{
+ return Settings::maxDownloads();
+}
+
+int KTorrentDCOP::maxSeeds()
+{
+ return Settings::maxSeeds();
+}
+
+int KTorrentDCOP::maxConnections()
+{
+ return Settings::maxConnections();
+}
+
+int KTorrentDCOP::maxUploadRate()
+{
+ return Settings::maxUploadRate();
+}
+
+int KTorrentDCOP::maxDownloadRate()
+{
+ return Settings::maxDownloadRate();
+}
+
+bool KTorrentDCOP::keepSeeding()
+{
+ return Settings::keepSeeding();
+}
+
+bool KTorrentDCOP::showSystemTrayIcon()
+{
+ return Settings::showSystemTrayIcon();
+}
+
+QValueList<int> KTorrentDCOP::intSettings()
+{
+ QValueList<int> intsettings;
+ intsettings.append(Settings::maxDownloads());
+ intsettings.append(Settings::maxSeeds());
+ intsettings.append(Settings::maxConnections());
+ intsettings.append(Settings::maxUploadRate());
+ intsettings.append(Settings::maxDownloadRate());
+ intsettings.append((int)Settings::keepSeeding());
+ intsettings.append((int)Settings::showSystemTrayIcon());
+ return intsettings;
+}
+
+bool KTorrentDCOP::isBlockedIP(QString ip)
+{
+ return bt::IPBlocklist::instance().isBlocked(ip);
+}
+
+void KTorrentDCOP::openTorrentSilentlyDir(const QString & file, const QString & savedir)
+{
+ app->loadSilentlyDir(KURL::fromPathOrURL(file), KURL::fromPathOrURL(savedir));
+}
+
+#include "ktorrentdcop.moc"
diff --git a/apps/ktorrent/ktorrentdcop.h b/apps/ktorrent/ktorrentdcop.h
new file mode 100644
index 0000000..287e191
--- /dev/null
+++ b/apps/ktorrent/ktorrentdcop.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTORRENTDCOP_H
+#define KTORRENTDCOP_H
+
+#include "dcopinterface.h"
+
+class KTorrent;
+
+/**
+@author Joris Guisson
+*/
+class KTorrentDCOP : public QObject,virtual public DCOPInterface
+{
+ Q_OBJECT
+ KTorrent* app;
+public:
+ KTorrentDCOP(KTorrent* app);
+ ~KTorrentDCOP();
+
+ virtual bool changeDataDir(const QString& new_dir);
+ virtual void openTorrent(const QString& file);
+ virtual void openTorrentSilently(const QString & file);
+ virtual void setKeepSeeding(bool ks);
+ virtual void setMaxConnectionsPerDownload(int max);
+ virtual void setMaxDownloads(int max);
+ virtual void setMaxSeeds(int max);
+ virtual void setMaxUploadSpeed(int kbytes_per_sec);
+ virtual void setMaxDownloadSpeed(int kbytes_per_sec);
+ virtual void setShowSysTrayIcon(bool yes);
+ virtual void startAll(int type = 3);
+ virtual void stopAll(int type = 3);
+ virtual QValueList<int> getTorrentNumbers(int type = 3);
+ virtual QCStringList getTorrentInfo(int tornumber);
+ virtual int getFileCount(int tornumber);
+ virtual QCStringList getInfo();
+ virtual QCStringList getFileNames(int tornumber);
+ virtual QValueList<int> getFilePriorities(int tornumber);
+ virtual void setFilePriority(int tornumber, int index, int priority);
+ virtual void start(int tornumber);
+ virtual void stop(int tornumber, bool user);
+ virtual void remove(int tornumber, bool del_data);
+ virtual void announce(int tornumber);
+ virtual QCString dataDir();
+ virtual int maxDownloads();
+ virtual int maxSeeds();
+ virtual int maxConnections();
+ virtual int maxUploadRate();
+ virtual int maxDownloadRate();
+ virtual bool keepSeeding();
+ virtual bool showSystemTrayIcon();
+ virtual QValueList<int> intSettings();
+ virtual bool isBlockedIP(QString ip);
+ virtual void openTorrentSilentlyDir(const QString & file, const QString & savedir);
+
+};
+
+#endif
diff --git a/apps/ktorrent/ktorrentplugin.desktop b/apps/ktorrent/ktorrentplugin.desktop
new file mode 100644
index 0000000..40cfe9c
--- /dev/null
+++ b/apps/ktorrent/ktorrentplugin.desktop
@@ -0,0 +1,33 @@
+[Desktop Entry]
+Type=ServiceType
+X-KDE-ServiceType=KTorrent/Plugin
+Name=KTorrent Plugin
+Name[ar]=قابس KTorrent
+Name[bg]=Приставка за KTorrent
+Name[br]=Lugent KTorrent
+Name[ca]=Connector KTorrent
+Name[cs]=KTorrent modul
+Name[da]=KTorrent-plugin
+Name[de]=KTorrent-Modul
+Name[el]=Πρόσθετο KTorrent
+Name[es]=Complemento de KTorrent
+Name[et]=KTorrenti plugin
+Name[fa]=وصلۀ KTorrent
+Name[gl]=Plugin KTorrent
+Name[it]=Plugin KTorrent
+Name[ja]=KTorrent プラグイン
+Name[ka]=KTorrent-ის მოდული
+Name[nb]=KTorrent-modul
+Name[nds]=KTorrent-Moduul
+Name[nl]=KTorrent-plugin
+Name[pl]=Wtyczka KTorrent
+Name[pt]='Plugin' do KTorrent
+Name[pt_BR]=Plugin KTorrent
+Name[sr]=KTorrent прикључак
+Name[sr@Latn]=KTorrent priključak
+Name[sv]=Ktorrent-insticksprogram
+Name[tr]=KTorrent Eklentisi
+Name[uk]=Втулок KTorrent
+Name[xx]=xxKTorrent Pluginxx
+Name[zh_CN]=KTorrent 插件
+Name[zh_TW]=KTorrent 外掛程式
diff --git a/apps/ktorrent/ktorrentui.rc b/apps/ktorrent/ktorrentui.rc
new file mode 100644
index 0000000..a5845a1
--- /dev/null
+++ b/apps/ktorrent/ktorrentui.rc
@@ -0,0 +1,44 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="ktorrent" version="1">
+<MenuBar>
+ <Menu name="file"><text>&amp;File</text>
+ <Action name="paste_url"/>
+ <Action name="ipfilter_action"/>
+ <Merge/>
+ </Menu>
+ <Menu name="Downloads"><text>Downloads</text>
+ <Action name="Start" />
+ <Action name="Stop" />
+ <Action name="Remove" />
+ <Separator/>
+ <Action name="Start all"/>
+ <Action name="Stop all"/>
+ <Separator/>
+ <Action name="check_data"/>
+ <Separator/>
+ <Action name="queue_action"/>
+ <Action name="Queue manager"/>
+ </Menu>
+</MenuBar>
+
+<ToolBar name="mainToolBar" noMerge="1"><text>Main Toolbar</text>
+ <Action name="file_new"/>
+ <Action name="file_open"/>
+ <Action name="file_save"/>
+ <Separator/>
+ <Action name="edit_copy"/>
+ <Action name="edit_paste"/>
+ <Separator/>
+ <Action name="ipfilter_action"/>
+</ToolBar>
+<ToolBar name="DownloadToolBar" noMerge="1"><text>Download Toolbar</text>
+ <Action name="Start"/>
+ <Action name="Stop"/>
+ <Action name="Remove"/>
+ <Action name="Start all"/>
+ <Action name="Stop all"/>
+ <Action name="queue_action"/>
+ <Separator/>
+ <Action name="Queue manager"/>
+</ToolBar>
+</kpartgui>
diff --git a/apps/ktorrent/ktorrentview.cpp b/apps/ktorrent/ktorrentview.cpp
new file mode 100644
index 0000000..d1b41c5
--- /dev/null
+++ b/apps/ktorrent/ktorrentview.cpp
@@ -0,0 +1,912 @@
+/***************************************************************************
+ * Copyright (C) 2005,2006 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kpopupmenu.h>
+#include <krun.h>
+#include <kurl.h>
+#include <kurldrag.h>
+#include <kmessagebox.h>
+#include <kstdguiitem.h>
+#include <kfiledialog.h>
+
+#include <interfaces/torrentinterface.h>
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/functions.h>
+
+#include <groups/group.h>
+#include <groups/torrentdrag.h>
+
+#include <qcursor.h>
+#include <qheader.h>
+#include <qvaluelist.h>
+#include <qlayout.h>
+
+#include "ktorrentview.h"
+#include "ktorrentviewitem.h"
+#include "settings.h"
+#include "scandialog.h"
+#include "addpeerwidget.h"
+#include "ktorrentviewmenu.h"
+#include "speedlimitsdlg.h"
+#include "filterbar.h"
+
+using namespace bt;
+using namespace kt;
+
+
+TorrentView::TorrentView(KTorrentView* parent) : KListView(parent),ktview(parent)
+{}
+
+TorrentView::~TorrentView()
+{}
+
+bool TorrentView::eventFilter(QObject* watched, QEvent* e)
+{
+ if((QHeader*)watched == header())
+ {
+ switch(e->type())
+ {
+ case QEvent::MouseButtonPress:
+ {
+ if(static_cast<QMouseEvent *>(e)->button() == RightButton)
+ ktview->m_headerMenu->popup(QCursor::pos());
+
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ return KListView::eventFilter(watched, e);
+}
+
+KTorrentView::KTorrentView(QWidget *parent)
+ : QWidget(parent),menu(0),current_group(0),running(0),total(0),view(0),filter_bar(0)
+{
+ QVBoxLayout* layout = new QVBoxLayout(this);
+ layout->setAutoAdd(true);
+ view = new TorrentView(this);
+ filter_bar = new FilterBar(this);
+ filter_bar->setHidden(true);
+
+ setupColumns();
+
+ connect(view,SIGNAL(executed(QListViewItem* )),
+ this,SLOT(onExecuted(QListViewItem* )));
+
+ connect(view,SIGNAL(currentChanged(QListViewItem* )),
+ this,SLOT(onExecuted(QListViewItem* )));
+
+ connect(view,SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint& )),
+ this,SLOT(showContextMenu(KListView*, QListViewItem*, const QPoint& )));
+
+ connect(view,SIGNAL(selectionChanged()),this,SLOT(onSelectionChanged()));
+
+ menu = new KTorrentViewMenu(this);
+ connect(menu,SIGNAL(groupItemActivated(const QString&)),this,SLOT(gsmItemActived(const QString&)));
+
+ connect(m_headerMenu, SIGNAL(activated(int)), this, SLOT(onColumnVisibilityChange( int )));
+
+ view->setFrameShape(QFrame::NoFrame);
+}
+
+KTorrentView::~KTorrentView()
+{
+}
+
+void KTorrentView::insertColumn(QString label, Qt::AlignmentFlags align)
+{
+ m_headerMenu->insertItem(label);
+
+ int ind = view->addColumn(label);
+ view->setColumnAlignment(ind, align);
+}
+
+void KTorrentView::setupColumns()
+{
+ //Header menu
+ m_headerMenu = new KPopupMenu(view);
+ m_headerMenu->setCheckable(true);
+ m_headerMenu->insertTitle(i18n("Visible columns"));
+
+ insertColumn(i18n("File"), Qt::AlignLeft);
+ insertColumn(i18n("Status"), Qt::AlignLeft);
+ insertColumn(i18n("Downloaded"), Qt::AlignRight);
+ insertColumn(i18n("Size"), Qt::AlignRight);
+ insertColumn(i18n("Uploaded"), Qt::AlignRight);
+ insertColumn(i18n("Down Speed"), Qt::AlignRight);
+ insertColumn(i18n("Up Speed"), Qt::AlignRight);
+ insertColumn(i18n("Time Left"), Qt::AlignCenter);
+ insertColumn(i18n("Seeders"), Qt::AlignRight);
+ insertColumn(i18n("Leechers"), Qt::AlignRight);
+ insertColumn(i18n("% Complete"), Qt::AlignRight);
+ insertColumn(i18n("Share Ratio"), Qt::AlignRight);
+ insertColumn(i18n("Time Downloaded"), Qt::AlignRight);
+ insertColumn(i18n("Time Seeded"), Qt::AlignRight);
+
+ view->setAllColumnsShowFocus(true);
+ view->setShowSortIndicator(true);
+ view->setAcceptDrops(true);
+ view->setSelectionMode(QListView::Extended);
+ for (Uint32 i = 0;i < (Uint32)view->columns();i++)
+ {
+ view->setColumnWidth(i, 100);
+ view->setColumnWidthMode(i,QListView::Manual);
+ }
+}
+
+void KTorrentView::setCurrentGroup(Group* group)
+{
+ if (current_group == group)
+ return;
+
+ current_group = group;
+
+ running = 0;
+ total = 0;
+ // go over the current items, if they still match keep them, else remove them
+ // add new itesm if necessary
+ QMap<TorrentInterface*,KTorrentViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ KTorrentViewItem* tvi = i.data();
+ TorrentInterface* tc = i.key();
+ if (current_group && !current_group->isMember(tc))
+ {
+ if (tvi)
+ {
+ delete tvi;
+ i.data() = 0;
+ }
+ }
+ else if (!tvi)
+ {
+ tvi = new KTorrentViewItem(this,tc);
+ i.data() = tvi;
+ }
+
+ if (i.data())
+ {
+ total++;
+ if (tc->getStats().running)
+ running++;
+ }
+
+ i++;
+ }
+
+ if (current_group)
+ setCaption(QString("%1 %2/%3").arg(current_group->groupName()).arg(running).arg(total));
+ else
+ setCaption(i18n("All Torrents %1/%2").arg(running).arg(total));
+
+ onSelectionChanged();
+ onExecuted(view->currentItem());
+}
+
+void KTorrentView::saveSettings(KConfig* cfg,int idx)
+{
+ QString group = QString("KTorrentView-%1").arg(idx);
+ view->saveLayout(cfg,group);
+ cfg->setGroup(group);
+ filter_bar->saveSettings(cfg);
+}
+
+
+void KTorrentView::loadSettings(KConfig* cfg,int idx)
+{
+ QString group = QString("KTorrentView-%1").arg(idx);
+ view->restoreLayout(cfg,group);
+ view->setDragEnabled(true);
+
+ for(int i=0; i < view->columns();++i)
+ {
+ bool visible = columnVisible(i);
+
+ m_headerMenu->setItemChecked(m_headerMenu->idAt(i+1), visible);
+ view->header()->setResizeEnabled(visible, i);
+ }
+ cfg->setGroup(group);
+ filter_bar->loadSettings(cfg);
+}
+
+
+int KTorrentView::getNumRunning()
+{
+ int num = 0;
+ QMap<TorrentInterface*,KTorrentViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ KTorrentViewItem* tvi = i.data();
+ if (tvi)
+ {
+ TorrentInterface* tc = tvi->getTC();
+ num += tc->getStats().running ? 1 : 0;
+ }
+ i++;
+ }
+ return num;
+}
+
+bool KTorrentView::startDownload(kt::TorrentInterface* tc)
+{
+ if (tc && !tc->getStats().running)
+ {
+ wantToStart(tc);
+ if (!tc->getStats().running && !tc->getStats().stopped_by_error)
+ {
+ if (tc->getStats().completed)
+ {
+ if (!tc->overMaxRatio() && !tc->overMaxSeedTime())
+ return false;
+ }
+ else
+ return false;
+ }
+ }
+ return true;
+}
+
+void KTorrentView::stopDownload(kt::TorrentInterface* tc)
+{
+ if (tc && tc->getStats().running)
+ {
+ wantToStop(tc,true);
+ }
+}
+
+void KTorrentView::showStartError()
+{
+ QString err = i18n("Cannot start more than 1 download, ",
+ "Cannot start more than %n downloads, ",Settings::maxDownloads());
+
+ err += i18n("and 1 seed. ","and %n seeds. ",Settings::maxSeeds());
+ err += i18n("Go to Settings -> Configure KTorrent, if you want to change the limits.");
+ KMessageBox::error(this,err);
+}
+
+void KTorrentView::startDownloads()
+{
+ bool err = false;
+
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (!startDownload(tc))
+ err = true;;
+ }
+
+ /*
+ if (err)
+ {
+ showStartError();
+ }
+ */
+ // make sure toolbuttons get updated
+ onSelectionChanged();
+}
+
+void KTorrentView::stopDownloads()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ stopDownload(kvi->getTC());
+ }
+
+ // make sure toolbuttons get updated
+ onSelectionChanged();
+}
+
+void KTorrentView::startAllDownloads()
+{
+ bool err = false;
+ QMap<TorrentInterface*,KTorrentViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ KTorrentViewItem* tvi = i.data();
+ if (tvi && !startDownload(tvi->getTC()))
+ err = true;
+
+ i++;
+ }
+ /*
+ if (err)
+ {
+ showStartError();
+ }
+ */
+ onSelectionChanged();
+}
+
+void KTorrentView::stopAllDownloads()
+{
+ QMap<TorrentInterface*,KTorrentViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ KTorrentViewItem* tvi = i.data();
+ if (tvi)
+ stopDownload(tvi->getTC());
+
+ i++;
+ }
+ onSelectionChanged();
+}
+
+void KTorrentView::removeDownloads()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ bool dummy = false;
+ if (tc && !tc->isCheckingData(dummy))
+ {
+ const TorrentStats & s = tc->getStats();
+ bool data_to = false;
+ if (!s.completed)
+ {
+ QString msg = i18n("The torrent %1 has not finished downloading, "
+ "do you want to delete the incomplete data, too?").arg(s.torrent_name);
+ int ret = KMessageBox::questionYesNoCancel(
+ this,msg,i18n("Remove Download"),
+ i18n("Delete Data"),i18n("Keep Data"));
+ if (ret == KMessageBox::Cancel)
+ return;
+ else if (ret == KMessageBox::Yes)
+ data_to = true;
+ }
+ wantToRemove(tc,data_to);
+ }
+ }
+
+ // make sure toolbuttons get updated
+ onSelectionChanged();
+}
+
+void KTorrentView::removeDownloadsAndData()
+{
+ QString msg = i18n("You will lose all the downloaded data. Are you sure you want to do this?");
+ // TODO: replace i18n("Remove") by KStdGuiItem::remove() in KDE4
+ if (KMessageBox::warningYesNo(this,msg, i18n("Remove Torrent"), i18n("&Remove"),
+ KStdGuiItem::cancel()) == KMessageBox::No)
+ return;
+
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (tc)
+ wantToRemove(tc,true);
+ }
+
+ // make sure toolbuttons get updated
+ onSelectionChanged();
+}
+
+void KTorrentView::manualAnnounce()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (tc && tc->getStats().running)
+ tc->updateTracker();
+ }
+}
+
+void KTorrentView::previewFiles()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (tc && tc->readyForPreview() && !tc->getStats().multi_file_torrent)
+ {
+ QFileInfo fi(tc->getTorDir()+"cache");
+ new KRun(KURL::fromPathOrURL(fi.readLink()), 0, true, true);
+ }
+ }
+}
+
+TorrentInterface* KTorrentView::getCurrentTC()
+{
+ KTorrentViewItem* tvi = dynamic_cast<KTorrentViewItem*>(view->currentItem());
+ if (tvi)
+ return tvi->getTC();
+ else
+ return 0;
+}
+
+void KTorrentView::onExecuted(QListViewItem* item)
+{
+ KTorrentViewItem* tvi = dynamic_cast<KTorrentViewItem*>(item);
+ if (tvi)
+ {
+ torrentClicked(tvi->getTC());
+ currentChanged(tvi->getTC());
+ }
+ else
+ {
+ currentChanged(0);
+ }
+}
+
+void KTorrentView::showContextMenu(KListView* ,QListViewItem*,const QPoint & p)
+{
+ updateGroupsSubMenu(menu->getGroupsSubMenu());
+ menu->show(p);
+}
+
+void KTorrentView::addTorrent(TorrentInterface* tc)
+{
+ if (current_group && !current_group->isMember(tc))
+ {
+ items.insert(tc,0);
+ }
+ else
+ {
+ KTorrentViewItem* tvi = new KTorrentViewItem(this,tc);
+ items.insert(tc,tvi);
+ tvi->update();
+ if (items.count() == 1)
+ currentChanged(tc);
+ }
+}
+
+void KTorrentView::removeTorrent(TorrentInterface* tc)
+{
+ QMap<kt::TorrentInterface*,KTorrentViewItem*>::iterator i = items.find(tc);
+ if (i != items.end())
+ {
+ KTorrentViewItem* tvi = i.data();
+ items.erase(i);
+ delete tvi;
+ tvi = dynamic_cast<KTorrentViewItem*>(view->currentItem());
+ if (tvi)
+ currentChanged(tvi->getTC());
+ else
+ currentChanged(0);
+ }
+}
+
+
+void KTorrentView::update()
+{
+ Uint32 r = 0;
+ Uint32 t = 0;
+
+ QMap<kt::TorrentInterface*,KTorrentViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ bool count = true;
+ KTorrentViewItem* tvi = i.data();
+ if (tvi)
+ tvi->update();
+ // check if the torrent still is part of the group
+ kt::TorrentInterface* ti = i.key();
+
+ bool member = (current_group->isMember(ti) && filter_bar->matchesFilter(ti));
+
+ if (tvi && current_group && !member)
+ {
+ // torrent is no longer a member of this group so remove it from the view
+ delete tvi;
+ i.data() = 0;
+ count = false;
+ }
+ else if (!tvi && (!current_group || member))
+ {
+ tvi = new KTorrentViewItem(this,ti);
+ i.data() = tvi;
+ }
+
+ if (i.data())
+ {
+ t++;
+ if (ti->getStats().running)
+ r++;
+ }
+
+ i++;
+ }
+
+ if (running != r || total != t)
+ {
+ running = r;
+ total = t;
+
+ if (current_group)
+ setCaption(QString("%1 %2/%3").arg(current_group->groupName()).arg(running).arg(total));
+ else
+ setCaption(i18n("All Torrents %1/%2").arg(running).arg(total));
+ onSelectionChanged();
+ }
+
+ view->sort();
+}
+
+bool KTorrentView::acceptDrag(QDropEvent* event) const
+{
+ // accept uri drops only
+ return KURLDrag::canDecode(event);
+}
+
+void KTorrentView::onSelectionChanged()
+{
+ int flags = 0;
+
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ bool dummy;
+ if (tc && !tc->isCheckingData(dummy))
+ {
+ const TorrentStats & s = tc->getStats();
+ if (!s.running)
+ flags |= START;
+ else
+ flags |= STOP;
+
+ if (flags & (START|STOP))
+ break;
+ }
+ }
+
+ if (sel.count() > 0)
+ flags |= REMOVE;
+
+ if (sel.count() == 1)
+ flags |= SCAN;
+
+ if (running > 0)
+ flags |= STOP_ALL;
+
+ if (running == 0 && total > 0)
+ flags |= START_ALL;
+
+ updateActions(flags);
+}
+
+void KTorrentView::queueSlot()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ bool dummy;
+ if (tc && !tc->isCheckingData(dummy))
+ emit queue(tc);
+ }
+}
+
+
+void KTorrentView::checkDataIntegrity()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ if (sel.count() == 0)
+ return;
+
+ bool dummy = false;
+ KTorrentViewItem* kvi = (KTorrentViewItem*)sel.first();
+ TorrentInterface* tc = kvi->getTC();
+ if (!tc->isCheckingData(dummy))
+ {
+ needsDataCheck(tc);
+ }
+ else
+ {
+ KMessageBox::error(0,i18n("You are already checking the data of the torrent %1 !").arg(tc->getStats().torrent_name));
+ }
+}
+
+QDragObject* KTorrentView::dragObject()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ if (sel.count() == 0)
+ return 0;
+
+ return new TorrentDrag(this);
+}
+
+void KTorrentView::getSelection(QValueList<kt::TorrentInterface*> & sel)
+{
+ QPtrList<QListViewItem> s = view->selectedItems();
+ if (s.count() == 0)
+ return;
+
+ QPtrList<QListViewItem>::iterator i = s.begin();
+ while (i != s.end())
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*i;
+ TorrentInterface* tc = kvi->getTC();
+ sel.append(tc);
+ i++;
+ }
+}
+
+void KTorrentView::removeFromGroup()
+{
+ QPtrList<QListViewItem> s = view->selectedItems();
+ if (s.count() == 0 || !current_group || current_group->isStandardGroup())
+ return;
+
+ QPtrList<QListViewItem>::iterator i = s.begin();
+ while (i != s.end())
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*i;
+ TorrentInterface* tc = kvi->getTC();
+ current_group->removeTorrent(tc);
+ delete kvi;
+ items[tc] = 0;
+ i++;
+ }
+}
+
+void KTorrentView::addSelectionToGroup(kt::Group* g)
+{
+ QPtrList<QListViewItem> s = view->selectedItems();
+ if (s.count() == 0 || !g)
+ return;
+
+ QPtrList<QListViewItem>::iterator i = s.begin();
+ while (i != s.end())
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*i;
+ TorrentInterface* tc = kvi->getTC();
+ g->addTorrent(tc);
+ i++;
+ }
+}
+
+void KTorrentView::showAddPeersWidget()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ bool dummy;
+ if (tc && !tc->isCheckingData(dummy))
+ {
+ AddPeerWidget dlg(tc, this);
+ dlg.exec();
+ }
+ }
+}
+
+void KTorrentView::openOutputDirectory()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (tc)
+ {
+ if(tc->getStats().multi_file_torrent)
+ new KRun(KURL::fromPathOrURL(tc->getStats().output_path), 0, true, true);
+ else
+ new KRun(KURL::fromPathOrURL(tc->getDataDir()), 0, true, true);
+ }
+ }
+}
+
+void KTorrentView::openTorXDirectory()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (tc)
+ {
+ new KRun(KURL::fromPathOrURL(tc->getTorDir()), 0, true, true);
+ }
+ }
+}
+
+void KTorrentView::setDownloadLocationSlot()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (tc)
+ {
+ QString dn;
+ dn = KFileDialog::getExistingDirectory(tc->getStats().output_path, this, i18n("Choose download location for %1").arg(tc->getStats().torrent_name));
+
+ if(dn.isNull() || dn.isEmpty())
+ continue;
+
+ if(!dn.endsWith(bt::DirSeparator()))
+ dn += bt::DirSeparator();
+
+ if(!dn.isEmpty())
+ tc->changeOutputDir(dn);
+ }
+ }
+}
+
+void KTorrentView::dhtSlot()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ bool dummy;
+ if (tc && !tc->isCheckingData(dummy))
+ {
+ bool on = tc->isFeatureEnabled(kt::DHT_FEATURE);
+ tc->setFeatureEnabled(kt::DHT_FEATURE,!on);
+ }
+ }
+}
+
+void KTorrentView::utPexSlot()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ bool dummy;
+ if (tc && !tc->isCheckingData(dummy))
+ {
+ bool on = tc->isFeatureEnabled(kt::UT_PEX_FEATURE);
+ tc->setFeatureEnabled(kt::UT_PEX_FEATURE,!on);
+ }
+ }
+}
+
+void KTorrentView::speedLimits()
+{
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ if (sel.count() != 1)
+ return;
+
+ KTorrentViewItem* kvi = (KTorrentViewItem*)sel.first();
+ TorrentInterface* tc = kvi->getTC();
+ SpeedLimitsDlg dlg(tc,0);
+ dlg.show();
+ dlg.exec();
+}
+
+
+void KTorrentView::columnHide(int index)
+{
+ view->hideColumn(index);
+ view->header()->setResizeEnabled(FALSE, index);
+}
+
+void KTorrentView::columnShow(int index)
+{
+ view->setColumnWidth(index, 100);
+ view->header()->setResizeEnabled(TRUE, index);
+}
+
+bool KTorrentView::columnVisible(int index)
+{
+ if (index < view->columns() && index >= 0)
+ return view->columnWidth(index) != 0;
+ else
+ return true;
+}
+
+void KTorrentView::onColumnVisibilityChange(int id)
+{
+ int mid = m_headerMenu->indexOf(id) - 1;
+ if(mid == -1)
+ return;
+
+ bool visible = !columnVisible(mid);
+
+ m_headerMenu->setItemChecked(id, visible);
+
+ if(visible)
+ columnShow(mid);
+ else
+ columnHide(mid);
+}
+
+void KTorrentView::gsmItemActived(const QString & group)
+{
+ groupsSubMenuItemActivated(this,group);
+}
+
+void KTorrentView::updateCaption()
+{
+ Uint32 r = 0;
+ Uint32 t = 0;
+ QMap<kt::TorrentInterface*,KTorrentViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ if (!current_group || current_group->isMember(i.key()))
+ {
+ t++;
+ if (i.key()->getStats().running)
+ r++;
+ }
+
+ i++;
+ }
+
+ if (running != r || total != t)
+ {
+ running = r;
+ total = t;
+
+ if (current_group)
+ setCaption(QString("%1 %2/%3").arg(current_group->groupName()).arg(running).arg(total));
+ else
+ setCaption(i18n("All Torrents %1/%2").arg(running).arg(total));
+ }
+}
+
+void KTorrentView::setupViewColumns()
+{
+ if (current_group->groupFlags() == kt::Group::UPLOADS_ONLY_GROUP)
+ {
+ // we are an uploads group so lets hide, downloaded, percentage, download speed and time left
+ columnHide(2); // Downloaded
+ columnHide(5); // Down speed
+ columnHide(7); // Time left
+ columnHide(10); // Percentage
+ }
+ else if (current_group->groupFlags() == kt::Group::DOWNLOADS_ONLY_GROUP)
+ {
+ columnHide(13); // Seed time is not necessary for a download
+ }
+
+ // make sure menu is OK
+ for(int i=0; i< view->columns();++i)
+ {
+ bool visible = columnVisible(i);
+ m_headerMenu->setItemChecked(m_headerMenu->idAt(i+1), visible);
+ view->header()->setResizeEnabled(visible, i);
+ }
+}
+
+
+
+void KTorrentView::toggleFilterBar()
+{
+ filter_bar->setHidden(!filter_bar->isHidden());
+}
+
+#include "ktorrentview.moc"
diff --git a/apps/ktorrent/ktorrentview.h b/apps/ktorrent/ktorrentview.h
new file mode 100644
index 0000000..218b0b0
--- /dev/null
+++ b/apps/ktorrent/ktorrentview.h
@@ -0,0 +1,216 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 _KTORRENTVIEW_H_
+#define _KTORRENTVIEW_H_
+
+#include <klistview.h>
+
+typedef QValueList<QCString> QCStringList;
+
+class KURL;
+class KTorrentViewItem;
+class KPopupMenu;
+class KTorrentCore;
+class KTorrentViewMenu;
+class KTorrentView;
+class ScanDialog;
+class QString;
+class FilterBar;
+
+namespace kt
+{
+ class TorrentInterface;
+ class Group;
+}
+
+using namespace bt;
+
+class TorrentView : public KListView
+{
+public:
+ TorrentView(KTorrentView* parent);
+ virtual ~TorrentView();
+
+ virtual bool eventFilter(QObject* watched, QEvent* e);
+
+private:
+ KTorrentView* ktview;
+};
+
+
+
+
+/**
+ * List view which shows information about torrents.
+ */
+class KTorrentView : public QWidget
+{
+ Q_OBJECT
+public:
+ enum ActionEnableFlags
+ {
+ START = 1,
+ STOP = 2,
+ START_ALL = 4,
+ STOP_ALL = 8,
+ REMOVE = 16,
+ SCAN = 32
+ };
+
+ /**
+ * Default constructor
+ */
+ KTorrentView(QWidget *parent);
+
+ /**
+ * Destructor
+ */
+ virtual ~KTorrentView();
+
+ /// Update the caption, so the correct number of running torrents is shown in the tab
+ void updateCaption();
+
+ /// Trigger an updateActions signal
+ void updateActions() {onSelectionChanged();}
+
+ /// Get the current group
+ const kt::Group* getCurrentGroup() const {return current_group;}
+
+ /// Get the current TorrentInterface object
+ kt::TorrentInterface* getCurrentTC();
+
+ /// Save the views settings
+ void saveSettings(KConfig* cfg,int idx);
+
+ /// Load the views settings
+ void loadSettings(KConfig* cfg,int idx);
+
+ /**
+ * Put the current selection in a list.
+ * @param sel The list to put it in
+ */
+ void getSelection(QValueList<kt::TorrentInterface*> & sel);
+
+ /**
+ * Add the current selection to a group.
+ * @param g The group
+ */
+ void addSelectionToGroup(kt::Group* g);
+
+ /**
+ * Is column visible?
+ */
+ bool columnVisible(int index);
+
+ /**
+ * Setup the view columns, based upon the current group
+ * This will hide some columns for uploads only groups.
+ */
+ void setupViewColumns();
+
+ QPtrList<QListViewItem> selectedItems() {return view->selectedItems();}
+
+ KListView* listView() {return view;}
+
+ /**
+ * Toggle the visibility of the filter bar
+ */
+ void toggleFilterBar();
+
+public slots:
+ void setCurrentGroup(kt::Group* group);
+ void addTorrent(kt::TorrentInterface* tc);
+ void removeTorrent(kt::TorrentInterface* tc);
+ void update();
+ void startDownloads();
+ void stopDownloads();
+ void startAllDownloads();
+ void stopAllDownloads();
+ void manualAnnounce();
+ void previewFiles();
+ void removeDownloads();
+ void removeDownloadsAndData();
+ void onSelectionChanged();
+ void queueSlot();
+ void checkDataIntegrity();
+ void removeFromGroup();
+ void showAddPeersWidget();
+ void openOutputDirectory();
+ void openTorXDirectory();
+ void setDownloadLocationSlot();
+ void dhtSlot();
+ void utPexSlot();
+ void speedLimits();
+
+private slots:
+ void onExecuted(QListViewItem* item);
+ void showContextMenu(KListView* ,QListViewItem* item,const QPoint & p);
+ void onColumnVisibilityChange(int);
+ void gsmItemActived(const QString & group);
+
+
+signals:
+ void torrentClicked(kt::TorrentInterface* tc);
+ void currentChanged(kt::TorrentInterface* tc);
+ void wantToRemove(kt::TorrentInterface* tc,bool data_to);
+ void wantToStop(kt::TorrentInterface* tc,bool user);
+ void wantToStart(kt::TorrentInterface* tc);
+ void viewChange(kt::TorrentInterface* tc);
+
+ /**
+ * Emit that actions need to be updated
+ * @param flags OR of ActionEnableFlags
+ */
+ void updateActions(int flags);
+ void queue(kt::TorrentInterface* tc);
+ void needsDataCheck(kt::TorrentInterface* tc);
+ void updateGroupsSubMenu(KPopupMenu* gsm);
+ void groupsSubMenuItemActivated(KTorrentView* v,const QString & group);
+
+private:
+ bool acceptDrag(QDropEvent* event) const;
+ int getNumRunning();
+ bool startDownload(kt::TorrentInterface* tc);
+ void stopDownload(kt::TorrentInterface* tc);
+ void showStartError();
+ virtual QDragObject* dragObject();
+ void setupColumns();
+ void insertColumn(QString label, Qt::AlignmentFlags);
+ void columnHide(int index);
+ void columnShow(int index);
+
+
+private:
+ QMap<kt::TorrentInterface*,KTorrentViewItem*> items;
+ KTorrentViewMenu* menu;
+ KPopupMenu* m_headerMenu;
+ kt::Group* current_group;
+ Uint32 running;
+ Uint32 total;
+ TorrentView* view;
+ FilterBar* filter_bar;
+
+ friend class TorrentView;
+};
+
+#endif // _KTORRENTVIEW_H_
diff --git a/apps/ktorrent/ktorrentviewitem.cpp b/apps/ktorrent/ktorrentviewitem.cpp
new file mode 100644
index 0000000..d00e2f7
--- /dev/null
+++ b/apps/ktorrent/ktorrentviewitem.cpp
@@ -0,0 +1,354 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kglobal.h>
+#include <interfaces/torrentinterface.h>
+#include <qdatetime.h>
+#include <qpainter.h>
+#include <math.h>
+#include <interfaces/functions.h>
+#include "ktorrentview.h"
+#include "ktorrentviewitem.h"
+
+using namespace bt;
+using namespace kt;
+/*
+static QString StatusToString(TorrentInterface* tc,TorrentStatus s)
+{
+ switch (s)
+ {
+ case kt::NOT_STARTED :
+ return i18n("Not started");
+ case kt::COMPLETE :
+ return i18n("Completed");
+ case kt::SEEDING :
+ return i18n("Seeding");
+ case kt::DOWNLOADING:
+ return i18n("Downloading");
+ case kt::STALLED:
+ return i18n("Stalled");
+ case kt::STOPPED:
+ return i18n("Stopped");
+ case kt::ERROR :
+ return i18n("Error: ") + tc->getShortErrorMessage();
+ case kt::ALLOCATING_DISKSPACE:
+ return i18n("Allocating diskspace");
+ }
+ return QString::null;
+}
+*/
+
+static QColor StatusToColor(TorrentStatus s,const QColorGroup & cg)
+{
+ QColor green(40,205,40);
+ QColor yellow(255,174,0);
+ switch (s)
+ {
+ case kt::SEEDING :
+ case kt::DOWNLOADING:
+ case kt::ALLOCATING_DISKSPACE :
+ return green;
+ case kt::STALLED:
+ case kt::CHECKING_DATA:
+ return yellow;
+ case kt::ERROR :
+ return Qt::red;
+ case kt::NOT_STARTED :
+ case kt::STOPPED:
+ case kt::QUEUED:
+ case kt::DOWNLOAD_COMPLETE :
+ case kt::SEEDING_COMPLETE :
+ default:
+ return cg.text();
+ }
+ return cg.text();
+}
+
+static QColor ratioToColor(float ratio)
+{
+ QColor green(40,205,40);
+ return ratio > 0.8 ? green : Qt::red;
+}
+
+static double Percentage(const TorrentStats & s)
+{
+ if (s.bytes_left_to_download == 0)
+ {
+ return 100.0;
+ }
+ else
+ {
+ if (s.total_bytes_to_download == 0)
+ {
+ return 100.0;
+ }
+ else
+ {
+ double perc = 100.0 - ((double)s.bytes_left_to_download / s.total_bytes_to_download) * 100.0;
+ if (perc > 100.0)
+ perc = 100.0;
+ else if (perc > 99.9)
+ perc = 99.9;
+ else if (perc < 0.0)
+ perc = 0.0;
+
+ return perc;
+ }
+ }
+}
+
+
+
+KTorrentViewItem::KTorrentViewItem(KTorrentView* parent,TorrentInterface* tc)
+ : KListViewItem(parent->listView()),tc(tc)
+{
+ m_parent = parent;
+ update();
+}
+
+
+KTorrentViewItem::~KTorrentViewItem()
+{}
+
+QCStringList KTorrentViewItem::getTorrentInfo(kt::TorrentInterface* tc)
+{
+ QCStringList info;
+ const TorrentStats & s = tc->getStats();
+ info.append(s.torrent_name.local8Bit());
+ info.append(tc->statusToString().local8Bit());
+ info.append(BytesToString(s.bytes_downloaded).local8Bit());
+ info.append(BytesToString(s.total_bytes_to_download).local8Bit());
+ info.append(BytesToString(s.bytes_uploaded).local8Bit());
+ if (s.bytes_left_to_download == 0)
+ info.append(KBytesPerSecToString(0).local8Bit());
+ else
+ info.append(KBytesPerSecToString(s.download_rate / 1024.0).local8Bit());
+
+ info.append(KBytesPerSecToString(s.upload_rate / 1024.0).local8Bit());
+ if (s.bytes_left_to_download == 0)
+ {
+ info.append(QCString(""));
+ }
+ else if (s.running)
+ {
+ Uint32 secs = tc->getETA();
+ if(secs == -1)
+ info.append(i18n("infinity").local8Bit());
+ else
+ info.append(DurationToString(secs).local8Bit());
+ }
+ else
+ {
+ info.append(i18n("infinity").local8Bit());
+ }
+
+ info.append(QString::number(s.num_peers).local8Bit());
+ info.append(QString(KGlobal::locale()->formatNumber(Percentage(s),2) + " %").local8Bit());
+ info.append(KGlobal::locale()->formatNumber(kt::ShareRatio(s),2).local8Bit());
+ info.append(QString::number(s.seeders_connected_to).local8Bit());
+ info.append(QString::number(s.leechers_connected_to).local8Bit());
+ return info;
+}
+
+void KTorrentViewItem::update()
+{
+ const TorrentStats & s = tc->getStats();
+
+ if(m_parent->columnVisible(0))
+ setText(0,s.torrent_name);
+
+ if(m_parent->columnVisible(1))
+ setText(1,tc->statusToString());
+
+ if(m_parent->columnVisible(2))
+ {
+ Uint64 nb = /*s.bytes_downloaded > s.total_bytes ? s.total_bytes : */s.bytes_downloaded;
+ setText(2,BytesToString(nb));
+ }
+
+ if(m_parent->columnVisible(3))
+ setText(3,BytesToString(s.total_bytes_to_download));
+
+ if(m_parent->columnVisible(4))
+ setText(4,BytesToString(s.bytes_uploaded));
+
+ if(m_parent->columnVisible(5))
+ {
+ if (s.download_rate >= 103) // lowest "visible" speed, all below will be 0,0 Kb/s
+ {
+ if (s.bytes_left_to_download == 0)
+ setText(5,KBytesPerSecToString(0));
+ else
+ setText(5,KBytesPerSecToString(s.download_rate / 1024.0));
+ }
+ else
+ setText(5, "");
+ }
+
+ if(m_parent->columnVisible(6))
+ {
+ if (s.upload_rate >= 103) // lowest "visible" speed, all below will be 0,0 Kb/s
+ setText(6,KBytesPerSecToString(s.upload_rate / 1024.0));
+ else
+ setText(6, "");
+ }
+
+ if(m_parent->columnVisible(7))
+ {
+ if (s.bytes_left_to_download == 0)
+ {
+ setText(7,QString::null);
+ eta = -1;
+ }
+ else if (s.running)
+ {
+ Uint32 secs = tc->getETA();
+ if(secs == -1)
+ {
+ setText(7,QString("%1").arg(QChar(0x221E)));
+ eta = -2;
+ }
+ else
+ {
+ eta = secs;
+ setText(7,DurationToString(secs));
+ }
+ }
+ else
+ {
+ setText(7,QString("%1").arg(QChar(0x221E)));
+ eta = -2;
+ }
+ }
+ if(m_parent->columnVisible(8))
+ setText(8,QString::number(s.num_peers));
+
+ if(m_parent->columnVisible(8))
+ {
+ setText(8,QString("%1 (%2)").arg(QString::number(s.seeders_connected_to)).arg(QString::number(s.seeders_total)));
+ }
+
+ if(m_parent->columnVisible(9))
+ {
+ setText(9,QString("%1 (%2)").arg(QString::number(s.leechers_connected_to)).arg(QString::number(s.leechers_total)));
+ }
+
+ if(m_parent->columnVisible(10))
+ {
+ setText(10,i18n("%1 %").arg(KGlobal::locale()->formatNumber(Percentage(s),2)));
+ }
+
+ if(m_parent->columnVisible(11))
+ {
+ float ratio = kt::ShareRatio(s);
+ setText(11,QString("%1").arg(KGlobal::locale()->formatNumber(ratio,2)));
+ }
+
+ if (m_parent->columnVisible(12))
+ {
+ Uint32 secs = tc->getRunningTimeDL();
+ setText(12,secs > 0 ? DurationToString(secs) : "");
+ }
+
+ if (m_parent->columnVisible(13))
+ {
+ Uint32 secs = tc->getRunningTimeUL() - tc->getRunningTimeDL();
+ setText(13,secs > 0 ? DurationToString(secs) : "");
+ }
+}
+
+
+
+int KTorrentViewItem::compare(QListViewItem * i,int col,bool) const
+{
+ KTorrentViewItem* other = (KTorrentViewItem*)i;
+ TorrentInterface* otc = other->tc;
+ const TorrentStats & s = tc->getStats();
+ const TorrentStats & os = otc->getStats();
+ switch (col)
+ {
+ case 0: return QString::compare(s.torrent_name,os.torrent_name);
+ case 1: return QString::compare(tc->statusToString(),otc->statusToString());
+ case 2: return CompareVal(s.bytes_downloaded,os.bytes_downloaded);
+ case 3: return CompareVal(s.total_bytes_to_download,os.total_bytes_to_download);
+ case 4: return CompareVal(s.bytes_uploaded,os.bytes_uploaded);
+ case 5: return CompareVal(s.download_rate,os.download_rate);
+ case 6: return CompareVal(s.upload_rate,os.upload_rate);
+ case 7:
+ if (eta == other->eta)
+ return 0;
+ else if (eta >= 0 && other->eta >= 0)
+ return CompareVal(eta,other->eta);
+ else if (eta == -1) // finsihed is minux one
+ return -1;
+ else if (other->eta == -1)
+ return 1;
+ else if (eta == -2) // infinity is minus 2
+ return 1;
+ else if (other->eta == -2)
+ return -1;
+ else
+ return CompareVal(eta,other->eta);
+ case 8: return CompareVal(s.seeders_total,os.seeders_total);
+ case 9: return CompareVal(s.leechers_total,os.leechers_total);
+ case 10:
+ {
+ double perc = s.total_bytes_to_download == 0 ? 100.0 : ((double)s.bytes_downloaded / s.total_bytes_to_download) * 100.0;
+ if (perc > 100.0)
+ perc = 100.0;
+ double operc = os.total_bytes_to_download == 0 ? 100.0 : ((double)os.bytes_downloaded / os.total_bytes_to_download) * 100.0;
+ if (operc > 100.0)
+ operc = 100.0;
+ return CompareVal(perc,operc);
+ }
+ case 11:
+ {
+ float r1 = kt::ShareRatio(s);
+ float r2 = kt::ShareRatio(os);
+ return CompareVal(r1,r2);
+ }
+ case 12:
+ return CompareVal(tc->getRunningTimeDL(),otc->getRunningTimeDL());
+ case 13:
+ {
+ Uint32 t = tc->getRunningTimeUL() - tc->getRunningTimeDL();
+ Uint32 ot = otc->getRunningTimeUL() - otc->getRunningTimeDL();
+ return CompareVal(t,ot);
+ }
+ }
+
+ return 0;
+}
+
+void KTorrentViewItem::paintCell(QPainter* p,const QColorGroup & cg,
+ int column,int width,int align)
+{
+ QColorGroup _cg( cg );
+ QColor c = _cg.text();
+
+ if (column == 1)
+ _cg.setColor(QColorGroup::Text, StatusToColor(tc->getStats().status,cg));
+
+ if (column == 11)
+ _cg.setColor(QColorGroup::Text, ratioToColor(kt::ShareRatio(tc->getStats())));
+
+
+ KListViewItem::paintCell(p,_cg,column,width,align);
+}
diff --git a/apps/ktorrent/ktorrentviewitem.h b/apps/ktorrent/ktorrentviewitem.h
new file mode 100644
index 0000000..a49e868
--- /dev/null
+++ b/apps/ktorrent/ktorrentviewitem.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTORRENTVIEWITEM_H
+#define KTORRENTVIEWITEM_H
+
+#include <klistview.h>
+#include <dcopclient.h>
+#include <util/constants.h>
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+class KTorrentView;
+
+/**
+ * @author Joris Guisson
+*/
+class KTorrentViewItem : public KListViewItem
+{
+ kt::TorrentInterface* tc;
+ bt::Int64 eta;
+public:
+ KTorrentViewItem(KTorrentView* parent,kt::TorrentInterface* tc);
+ virtual ~KTorrentViewItem();
+
+ kt::TorrentInterface* getTC() {return tc;}
+ void update();
+
+ static QCStringList getTorrentInfo(kt::TorrentInterface* tc);
+
+private:
+ int compare(QListViewItem * i,int col,bool ascending) const;
+ void paintCell(QPainter* p,const QColorGroup & cg,int column,int width,int align);
+
+ KTorrentView* m_parent;
+
+};
+
+#endif
diff --git a/apps/ktorrent/ktorrentviewmenu.cpp b/apps/ktorrent/ktorrentviewmenu.cpp
new file mode 100644
index 0000000..6ddafb2
--- /dev/null
+++ b/apps/ktorrent/ktorrentviewmenu.cpp
@@ -0,0 +1,217 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <interfaces/torrentinterface.h>
+#include <groups/group.h>
+#include "ktorrentviewmenu.h"
+#include "ktorrentviewitem.h"
+#include "ktorrentview.h"
+
+using namespace kt;
+
+KTorrentViewMenu::KTorrentViewMenu (KTorrentView *parent, const char *name )
+ : KPopupMenu ( parent, name ),view(parent)
+{
+ KIconLoader* iload = KGlobal::iconLoader();
+
+ stop_id = insertItem(
+ iload->loadIconSet("ktstop",KIcon::Small),i18n("to stop", "Stop"),
+ parent,SLOT(stopDownloads()));
+
+ start_id = insertItem(
+ iload->loadIconSet("ktstart",KIcon::Small),i18n("to start", "Start"),
+ parent,SLOT(startDownloads()));
+
+ remove_id = insertItem(
+ iload->loadIconSet("ktremove",KIcon::Small),i18n("Remove Torrent"),
+ parent,SLOT(removeDownloads()));
+
+ remove_all_id = insertItem(
+ iload->loadIconSet("ktremove",KIcon::Small),i18n("Remove Torrent and Data"),
+ parent,SLOT(removeDownloadsAndData()));
+
+ queue_id = insertItem(
+ iload->loadIconSet("player_playlist",KIcon::Small),i18n("Enqueue/Dequeue"),
+ parent,SLOT(queueSlot()));
+
+ insertSeparator();
+
+ add_peer_id = insertItem(
+ iload->loadIconSet("add", KIcon::Small), i18n("Add Peers"),
+ parent, SLOT(showAddPeersWidget()));
+
+ peer_sources_menu = new KPopupMenu(this);
+ peer_sources_id = insertItem(i18n("Additional Peer Sources"), peer_sources_menu);
+ peer_sources_menu->insertTitle(i18n("Torrent Peer Sources:"));
+ peer_sources_menu->setCheckable(true);
+ dht_id = peer_sources_menu->insertItem(i18n("DHT"), parent, SLOT(dhtSlot()));
+ ut_pex_id = peer_sources_menu->insertItem(i18n("Peer Exchange"), parent, SLOT(utPexSlot()));
+
+ insertSeparator();
+
+ announce_id = insertItem(
+ iload->loadIconSet("apply",KIcon::Small),i18n("Manual Announce"),
+ parent,SLOT(manualAnnounce()));
+
+ preview_id = insertItem(
+ iload->loadIconSet("frame_image",KIcon::Small),i18n("Preview"),
+ parent, SLOT(previewFiles()));
+
+ insertSeparator();
+ dirs_sub_menu = new KPopupMenu(this);
+ dirs_id = insertItem(i18n("Open Directory"), dirs_sub_menu);
+ outputdir_id = dirs_sub_menu->insertItem(iload->loadIconSet("folder",KIcon::Small), i18n("Data Directory"),
+ parent, SLOT(openOutputDirectory()));
+ torxdir_id = dirs_sub_menu->insertItem(iload->loadIconSet("folder",KIcon::Small), i18n("Temporary Directory"),
+ parent, SLOT(openTorXDirectory()));
+
+ downloaddir_id = insertItem(i18n("Set Download Location"), parent, SLOT(setDownloadLocationSlot()));
+
+ insertSeparator();
+ remove_from_group_id = insertItem(i18n("Remove From Group"),parent, SLOT(removeFromGroup()));
+ groups_sub_menu = new KPopupMenu(this);
+
+ add_to_group_id = insertItem(i18n("Add to Group"),groups_sub_menu);
+
+ insertSeparator();
+ scan_id = insertItem(i18n("Check Data Integrity"),parent, SLOT(checkDataIntegrity()));
+
+ connect(groups_sub_menu,SIGNAL(activated(int)),this,SLOT(gsmItemActived(int)));
+
+ traffic_lim_id = insertItem(i18n("Speed Limits"),parent,SLOT(speedLimits()));
+}
+
+
+KTorrentViewMenu::~KTorrentViewMenu()
+{}
+
+void KTorrentViewMenu::gsmItemActived(int id)
+{
+ groupItemActivated(groups_sub_menu->text(id).remove('&'));
+}
+
+void KTorrentViewMenu::show(const QPoint & p)
+{
+ bool en_start = false;
+ bool en_stop = false;
+ bool en_remove = false;
+ bool en_prev = false;
+ bool en_announce = false;
+ bool en_add_peer = false;
+ bool en_dirs = false;
+ bool en_peer_sources = false;
+ bool dummy = false;
+
+ QPtrList<QListViewItem> sel = view->selectedItems();
+ for (QPtrList<QListViewItem>::iterator itr = sel.begin(); itr != sel.end();itr++)
+ {
+ KTorrentViewItem* kvi = (KTorrentViewItem*)*itr;
+ TorrentInterface* tc = kvi->getTC();
+ if (tc)
+ {
+ const TorrentStats & s = tc->getStats();
+
+ if (tc->readyForPreview() && !s.multi_file_torrent)
+ en_prev = true;
+
+ if (!tc->isCheckingData(dummy))
+ en_remove = true;
+
+ if (!s.running)
+ {
+ if (!tc->isCheckingData(dummy))
+ {
+ en_start = true;
+ }
+ }
+ else
+ {
+ if (!tc->isCheckingData(dummy))
+ {
+ en_stop = true;
+ if (tc->announceAllowed())
+ en_announce = true;
+ }
+ }
+
+ if (!s.priv_torrent && !tc->isCheckingData(dummy))
+ {
+ en_add_peer = true;
+ en_peer_sources = true;
+ }
+ }
+ }
+
+ en_add_peer = en_add_peer && en_stop;
+
+ setItemEnabled(start_id,en_start);
+ setItemEnabled(stop_id,en_stop);
+ setItemEnabled(remove_id,en_remove);
+ setItemEnabled(remove_all_id,en_remove);
+ setItemEnabled(preview_id,en_prev);
+ setItemEnabled(add_peer_id, en_add_peer);
+ setItemEnabled(announce_id,en_announce);
+ setItemEnabled(queue_id, en_remove);
+
+ const kt::Group* current_group = view->getCurrentGroup();
+ setItemEnabled(remove_from_group_id,current_group && !current_group->isStandardGroup());
+ setItemEnabled(add_to_group_id,groups_sub_menu->count() > 0);
+
+ if (sel.count() == 1)
+ {
+ //enable directories
+ en_dirs = true;
+
+ KTorrentViewItem* kvi = (KTorrentViewItem*)sel.getFirst();
+ TorrentInterface* tc = kvi->getTC();
+ // no data check when we are preallocating diskspace
+ if (tc->getStats().status == kt::ALLOCATING_DISKSPACE || tc->isCheckingData(dummy))
+ setItemEnabled(scan_id, false);
+ else
+ setItemEnabled(scan_id, true);
+
+ //enable additional peer sources if torrent is not private
+ setItemEnabled(peer_sources_id, en_peer_sources);
+
+ if (en_peer_sources)
+ {
+ peer_sources_menu->setItemChecked(dht_id, tc->isFeatureEnabled(kt::DHT_FEATURE));
+ peer_sources_menu->setItemChecked(ut_pex_id, tc->isFeatureEnabled(kt::UT_PEX_FEATURE));
+ }
+ }
+ else
+ {
+ setItemEnabled(scan_id,false);
+
+ //disable peer source
+ setItemEnabled(peer_sources_id, false);
+ }
+
+ setItemEnabled(dirs_id, en_dirs);
+ setItemEnabled(traffic_lim_id,sel.count() == 1);
+ setItemEnabled(add_to_group_id,sel.count() > 0);
+ setItemEnabled(downloaddir_id,sel.count() > 0);
+
+ popup(p);
+}
+
+#include "ktorrentviewmenu.moc"
diff --git a/apps/ktorrent/ktorrentviewmenu.h b/apps/ktorrent/ktorrentviewmenu.h
new file mode 100644
index 0000000..b1827e2
--- /dev/null
+++ b/apps/ktorrent/ktorrentviewmenu.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTORRENTVIEWMENU_H
+#define KTORRENTVIEWMENU_H
+
+#include <kpopupmenu.h>
+
+class KTorrentView;
+
+/**
+ @author Joris Guisson <joris.guisson@gmail.com>
+*/
+class KTorrentViewMenu : public KPopupMenu
+{
+ Q_OBJECT
+public:
+ KTorrentViewMenu(KTorrentView *parent, const char *name = 0 );
+ virtual ~KTorrentViewMenu();
+
+ /// Show the menu at the given point
+ void show(const QPoint & p);
+
+ /// Get the group sub menu
+ KPopupMenu* getGroupsSubMenu() {return groups_sub_menu;}
+
+public slots:
+ void gsmItemActived(int id);
+
+signals:
+ /// A item in the groups sub menu has been activated
+ void groupItemActivated(const QString & group);
+
+private:
+ KTorrentView* view;
+ KPopupMenu* groups_sub_menu;
+ KPopupMenu* dirs_sub_menu;
+ KPopupMenu* peer_sources_menu;
+ int stop_id;
+ int start_id;
+ int remove_id;
+ int remove_all_id;
+ int preview_id;
+ int announce_id;
+ int queue_id;
+ int scan_id;
+ int remove_from_group_id;
+ int add_to_group_id;
+ int add_peer_id;
+ int dirs_id;
+ int outputdir_id;
+ int torxdir_id;
+ int downloaddir_id;
+ int peer_sources_id;
+ int dht_id;
+ int ut_pex_id;
+ int traffic_lim_id;
+};
+
+#endif
diff --git a/apps/ktorrent/leaktrace.cpp b/apps/ktorrent/leaktrace.cpp
new file mode 100644
index 0000000..76439ce
--- /dev/null
+++ b/apps/ktorrent/leaktrace.cpp
@@ -0,0 +1,295 @@
+#ifdef KT_LEAKTRACE
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <pthread.h>
+#include <util/constants.h>
+
+/*
+ * prime number for the address lookup hash table.
+ * if you have _really_ many memory allocations, use a
+ * higher value, like 343051 for instance.
+ */
+#define SOME_PRIME 35323
+#define ADDR_HASH(addr) ((unsigned long) addr % SOME_PRIME)
+
+using namespace bt;
+
+struct MemAlloc
+{
+ void* ptr;
+ size_t size;
+ void* alloc_addr; // addr of function which did the allocation
+ MemAlloc* left;
+ MemAlloc* right;
+};
+
+struct MemAllocTree
+{
+ Uint32 num_buckets;
+ Uint32 count;
+ Uint64 bytes;
+ pthread_mutex_t mutex;
+ MemAlloc* buckets[SOME_PRIME];
+};
+
+static MemAllocTree mtree = {0,0,0,PTHREAD_MUTEX_INITIALIZER};
+static bool print_status_done = false;
+
+static void InsertIntoTree(MemAlloc* cnode,MemAlloc* target)
+{
+ if (target->ptr < cnode->ptr)
+ {
+ if (!cnode->left)
+ cnode->left = target;
+ else
+ InsertIntoTree(cnode->left,target);
+ }
+ else
+ {
+ if (!cnode->right)
+ cnode->right = target;
+ else
+ InsertIntoTree(cnode->right,target);
+ }
+}
+
+static void PrintTree(MemAlloc* ma)
+{
+ if (!ma)
+ return;
+
+ printf("\t0x%p 0x%p %i bytes\n",ma->alloc_addr,ma->ptr,ma->size);
+ PrintTree(ma->left);
+ PrintTree(ma->right);
+}
+
+static void PrintTreeToFile(FILE* fptr,MemAlloc* ma)
+{
+ if (!ma)
+ return;
+
+ fprintf(fptr, "L %10p %9ld # %p\n",ma->alloc_addr,ma->size,ma->ptr);
+ PrintTreeToFile(fptr,ma->left);
+ PrintTreeToFile(fptr,ma->right);
+}
+
+static void WriteLeakReport()
+{
+ FILE* report = fopen("leak.out","wt");
+ if (!report)
+ {
+ printf("Cannot write report !!!!!!!!\n");
+ return;
+ }
+
+
+ for (Uint32 b = 0;b < SOME_PRIME;b++)
+ PrintTreeToFile(report,mtree.buckets[b]);
+ fclose(report);
+}
+
+static void PrintStatus()
+{
+ if (mtree.count == 0)
+ {
+ printf("No memory leaks detected !!!\n");
+ }
+ else
+ {
+ printf("LeakTrace results : \n");
+ for (Uint32 b = 0;b < SOME_PRIME;b++)
+ PrintTree(mtree.buckets[b]);
+ printf("====================\n");
+ printf("Total : %i leaks, %li bytes leaked\n",mtree.count,mtree.bytes);
+ }
+ WriteLeakReport();
+ print_status_done = true;
+}
+
+
+
+static void RegisterAlloc(void* ptr,Uint32 size)
+{
+ MemAlloc* ma = (MemAlloc*)malloc(sizeof(MemAlloc));
+ ma->left = ma->right = 0;
+ ma->size = size;
+ ma->alloc_addr = __builtin_return_address(1);
+ ma->ptr = ptr;
+ if (mtree.num_buckets == 0)
+ {
+ // init buckets
+ for (Uint32 b = 0;b < SOME_PRIME;b++)
+ mtree.buckets[b] = 0;
+ mtree.num_buckets = SOME_PRIME;
+ atexit(PrintStatus);
+ }
+
+ // hash the address
+ Uint32 b = ADDR_HASH(ptr);
+ if (!mtree.buckets[b])
+ {
+ mtree.count++;
+ mtree.bytes += size;
+ mtree.buckets[b] = ma;
+ }
+ else
+ {
+ // walk the tree and insert it
+ InsertIntoTree(mtree.buckets[b],ma);
+ mtree.count++;
+ mtree.bytes += size;
+ }
+}
+
+static void DeregisterAlloc(void* ptr)
+{
+ if (print_status_done)
+ printf("PrintStatus already happened !!!!!!!!!!\n");
+ Uint32 b = ADDR_HASH(ptr);
+
+ MemAlloc* p = mtree.buckets[b];
+ MemAlloc* prev = 0;
+ while (p && p->ptr != ptr)
+ {
+ prev = p;
+ if (ptr < p->ptr)
+ p = p->left;
+ else if (ptr > p->ptr)
+ p = p->right;
+ }
+
+ if (!p)
+ return;
+
+ if (!prev)
+ {
+ // it's the root
+ mtree.count--;
+ mtree.bytes -= p->size;
+ free(p);
+ mtree.buckets[b] = 0;
+ }
+ else
+ {
+ // first update some additional info
+ mtree.count--;
+ mtree.bytes -= p->size;
+
+ if (!p->left && !p->right)
+ {
+ // no children so just free p
+ if (prev->left == p)
+ {
+ free(prev->left);
+ prev->left = 0;
+ }
+ else
+ {
+ free(prev->right);
+ prev->right = 0;
+ }
+ }
+ else if (p->left && !p->right)
+ {
+ // one child of p is zero, so just attach
+ // the child of p to prev
+ if (prev->left == p)
+ prev->left = p->left;
+ else
+ prev->right = p->left;
+ free(p);
+ }
+ else if (!p->left && p->right)
+ {
+ // one child of p is zero, so just attach
+ // the child of p to prev
+ if (prev->left == p)
+ prev->left = p->right;
+ else
+ prev->right = p->right;
+ free(p);
+ }
+ else
+ {
+ // both children exist
+ if (prev->left == p)
+ {
+ // attach the left child of p
+ prev->left = p->left;
+ InsertIntoTree(prev,p->right);
+ }
+ else
+ {
+ // attach the right child of p
+ prev->right = p->right;
+ InsertIntoTree(prev,p->left);
+ }
+
+ free(p);
+ }
+ }
+
+}
+
+
+void* operator new(size_t size)
+{
+ void* ptr = malloc(size);
+ if (!ptr)
+ {
+ printf("PANIC : memory allocation failed !\n");
+ exit(-1);
+ }
+
+
+ pthread_mutex_lock(&mtree.mutex);
+ RegisterAlloc(ptr,size);
+ pthread_mutex_unlock(&mtree.mutex);
+ return ptr;
+}
+
+
+void* operator new[] (size_t size)
+{
+ void* ptr = malloc(size);
+ if (!ptr)
+ {
+ printf("PANIC : memory allocation failed !\n");
+ exit(-1);
+ }
+
+ pthread_mutex_lock(&mtree.mutex);
+ RegisterAlloc(ptr,size);
+ pthread_mutex_unlock(&mtree.mutex);
+ return ptr;
+}
+
+
+void operator delete (void *ptr)
+{
+ if (!ptr)
+ return;
+
+
+ pthread_mutex_lock(&mtree.mutex);
+ DeregisterAlloc(ptr);
+ pthread_mutex_unlock(&mtree.mutex);
+ free(ptr);
+}
+
+
+void operator delete[] (void *ptr)
+{
+ if (!ptr)
+ return;
+
+ pthread_mutex_lock(&mtree.mutex);
+ DeregisterAlloc(ptr);
+ pthread_mutex_unlock(&mtree.mutex);
+ free(ptr);
+}
+
+#endif // KT_LEAKTRACE
diff --git a/apps/ktorrent/main.cpp b/apps/ktorrent/main.cpp
new file mode 100644
index 0000000..77a99a5
--- /dev/null
+++ b/apps/ktorrent/main.cpp
@@ -0,0 +1,201 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <signal.h>
+#include <klocale.h>
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+
+#include <stdlib.h>
+
+#include "ktorrentapp.h"
+
+#include <qapplication.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/file.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <util/error.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <util/fileops.h>
+#include <ktversion.h>
+#include <functions.h>
+#include <qfile.h>
+#include <qdir.h>
+
+using namespace bt;
+
+
+
+void StupidWarningMessagesFromQt( QtMsgType type, const char *msg )
+{
+ switch ( type )
+ {
+ case QtDebugMsg:
+ // printf("Qt: Debug: %s\n",msg);
+ break;
+ case QtWarningMsg:
+ printf("Qt: Warning: %s\n",msg);
+ break;
+ case QtFatalMsg:
+ printf("Qt: Fatal : %s\n",msg);
+ abort(); // deliberately core dump
+ break;
+ }
+}
+
+
+
+static const char description[] =
+ I18N_NOOP("A BitTorrent program for KDE");
+
+
+bool GrabPIDLock()
+{
+ // create a lock file in /tmp/ with the user id of the current user included in the name
+ QString pid_file = QString("/tmp/.ktorrent_%1.lock").arg(getuid());
+
+ int fd = open(QFile::encodeName(pid_file),O_RDWR|O_CREAT,0640);
+ if (fd < 0)
+ {
+ fprintf(stderr,"Failed to open KT lock file %s : %s\n",pid_file.ascii(),strerror(errno));
+ return false;
+ }
+
+ if (lockf(fd,F_TLOCK,0)<0)
+ {
+ fprintf(stderr,"Failed to get lock on %s : %s\n",pid_file.ascii(),strerror(errno));
+ return false;
+ }
+
+ char str[20];
+ sprintf(str,"%d\n",getpid());
+ write(fd,str,strlen(str)); /* record pid to lockfile */
+
+ // leave file open, so nobody else can lock it until KT exists
+ return true;
+}
+
+
+static KCmdLineOptions options[] =
+{
+ { "debug", I18N_NOOP("Debug mode"), 0 },
+ { "silent", I18N_NOOP("Silently save torrent given on URL"), 0 },
+ { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+int main(int argc, char **argv)
+{
+ // ignore SIGPIPE's
+ signal(SIGPIPE,SIG_IGN);
+ signal(SIGXFSZ,SIG_IGN);
+ qInstallMsgHandler( StupidWarningMessagesFromQt );
+ KAboutData about("ktorrent", I18N_NOOP("KTorrent"), kt::VERSION_STRING, description,
+ KAboutData::License_GPL, "(C) 2005 -2008 Joris Guisson and Ivan Vasic", 0,
+ "http://www.ktorrent.org/");
+ about.addAuthor("Joris Guisson", 0, "joris.guisson@gmail.com" );
+ about.addAuthor("Ivan Vasic",0,"ivasic@gmail.com");
+ about.addAuthor("Alan Jones",I18N_NOOP("RSS Plugin"),"skyphyr@gmail.com");
+ about.addAuthor("Diego R. Brogna",I18N_NOOP("Webinterface Plugin"),"dierbro@gmail.com");
+ about.addAuthor("Krzysztof Kundzicz",I18N_NOOP("Statistics Plugin"),"athantor@gmail.com");
+
+ about.addCredit("Mladen Babic",
+ I18N_NOOP("Application icon and a couple of others"),"bmladen@EUnet.yu");
+ about.addCredit("The-Error",I18N_NOOP("The downloads icon"),"zotrix@eunet.yu");
+ about.addCredit("Adam Treat", 0, "treat@kde.org" );
+ about.addCredit("Danny Allen",
+ I18N_NOOP("1.0 application icon"),
+ "danny@dannyallen.co.uk");
+ about.addCredit("Vincent Wagelaar",0,"vincent@ricardis.tudelft.nl");
+ about.addCredit("Knut Morten Johansson",0,"knut@johansson.com");
+ about.addCredit("Felix Berger",
+ I18N_NOOP("ChunkBar's tooltip and IWFileTreeItem sorting"),
+ "bflat1@gmx.net");
+ about.addCredit("Andreas Kling",0,"kling@impul.se");
+ about.addCredit("Felipe Sateler",0,"fsateler@gmail.com");
+ about.addCredit("Maxmind", I18N_NOOP("Country locator for InfoWidget plugin (This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com/). "),0, "http://www.maxmind.com/");
+ about.addCredit("http://flags.blogpotato.de/",I18N_NOOP("Country flags"),0);
+ about.addCredit("Adam Forsyth",I18N_NOOP("File prioritization"),"agforsyth@gmail.com");
+ about.addCredit("Thomas Bernard",I18N_NOOP("Miniupnp was used as an example for our own UPnP implementation"),0,"http://miniupnp.free.fr/");
+ about.addCredit("Diego Rosario Brogna",I18N_NOOP("Global max share ratio patch"),0,"dierbro@gmail.com");
+ about.addCredit("Lesly Weyts",I18N_NOOP("Zeroconf enhancements"),0,0);
+ about.addCredit("Kevin Andre",I18N_NOOP("Zeroconf enhancements"),0,"http://users.edpnet.be/hyperquantum/");
+ about.addCredit("Dagur Valberg Johannsson",I18N_NOOP("Coldmilk webgui"),"dagurval@pvv.ntnu.no");
+ about.addCredit("Alexander Dymo",I18N_NOOP("IDEAl code from KDevelop"),"adymo@kdevelop.org");
+ about.addCredit("Scott Wolchok",I18N_NOOP("Conversion speed improvement in ipfilter plugin"),"swolchok@umich.edu");
+ about.addCredit("Bryan Burns of Juniper Networks",I18N_NOOP("Discovered 2 security vulnerabilities (both are fixed)"),0);
+ about.addCredit("Goten Xiao",I18N_NOOP("Patch to load silently with a save location"),0);
+ about.addCredit("Rapsys",I18N_NOOP("Fixes in PHP code of webinterface"),0);
+ about.addCredit("Athantor",I18N_NOOP("XFS specific disk preallocation"),0);
+ about.addCredit("twisted_fall",I18N_NOOP("Patch to not show very low speeds"),"twisted.fall@gmail.com");
+ about.addCredit("Lucke",I18N_NOOP("Patch to show potentially firewalled status"),0);
+ about.addCredit("Modestas Vainius",I18N_NOOP("Several patches"),"modestas@vainius.eu");
+ about.addCredit("Stefan Monov",I18N_NOOP("Patch to hide the menubar"),"logixoul@gmail.com");
+ about.addCredit("The_Kernel",I18N_NOOP("Patch to modify file priorities in the webgui"),"kernja@cs.earlham.edu");
+ about.addCredit("Rafał Miłecki",I18N_NOOP("Several webgui patches"),"zajec5@gmail.com");
+ about.addCredit("Lukasz Fibinger",I18N_NOOP("Filterbar patch"),"lucke@o2.pl");
+ about.addCredit("Jindrich Makovicka",I18N_NOOP("Non threaded fileview update patch"),"makovick@gmail.com");
+ about.addCredit("swolchok",I18N_NOOP("Optimization to SHA1 hash generation"),"evilsporkman@gmail.com");
+ about.addCredit("Markus Brueffer",I18N_NOOP("Patch to fix free diskspace calculation on FreeBSD"),"markus@brueffer.de");
+ about.addCredit("caruccio",I18N_NOOP("Patch to load torrents silently from the command line"),"mateus@caruccio.com");
+
+ KCmdLineArgs::init(argc, argv, &about);
+ KCmdLineArgs::addCmdLineOptions(options);
+
+ KTorrentApp::addCmdLineOptions();
+ if (!KTorrentApp::start())
+ {
+ fprintf(stderr, "ktorrent is already running!\n");
+ return 0;
+ }
+
+ // need to grab lock after the fork call in start, otherwise this will not work properly
+ if (!GrabPIDLock())
+ {
+ fprintf(stderr, "ktorrent is already running!\n");
+ return 0;
+ }
+
+ try
+ {
+ KTorrentApp app;
+ app.exec();
+ }
+ catch (bt::Error & e)
+ {
+ fprintf(stderr, "Aborted by error : %s\n",e.toString().ascii());
+ }
+ Globals::cleanup();
+
+// printf("\n\nObjects alive = %i\n\n",(unsigned int)Object::numAlive());
+ return 0;
+}
+
+
diff --git a/apps/ktorrent/newui/Makefile.am b/apps/ktorrent/newui/Makefile.am
new file mode 100644
index 0000000..bd136f3
--- /dev/null
+++ b/apps/ktorrent/newui/Makefile.am
@@ -0,0 +1,8 @@
+INCLUDES = -I$(srcdir)/../../libktorrent -I$(top_builddir)/ktorrent/libktorrent \
+ -I$(top_builddir)/libktorrent/ $(all_includes)
+METASOURCES = AUTO
+noinst_LTLIBRARIES = libnewui.la
+libnewui_la_LDFLAGS = $(all_libraries)
+libnewui_la_SOURCES = button.cpp button.h buttonbar.cpp buttonbar.h comdefs.h \
+ ddockwindow.cpp ddockwindow.h dmainwindow.cpp dmainwindow.h docksplitter.cpp \
+ docksplitter.h dtabwidget.cpp dtabwidget.h
diff --git a/apps/ktorrent/newui/button.cpp b/apps/ktorrent/newui/button.cpp
new file mode 100644
index 0000000..d133064
--- /dev/null
+++ b/apps/ktorrent/newui/button.cpp
@@ -0,0 +1,351 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "button.h"
+
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qstyle.h>
+#include <qapplication.h>
+#include <qregexp.h>
+
+#include <kdebug.h>
+#include <kiconloader.h>
+#include <kxmlguiclient.h>
+#include <kaction.h>
+#include <kpopupmenu.h>
+#include <kinputdialog.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kconfig.h>
+
+#include "buttonbar.h"
+
+namespace Ideal {
+
+Button::Button(ButtonBar *parent, const QString text, const QIconSet &icon,
+ const QString &description)
+ :QPushButton(icon, text, parent), m_buttonBar(parent), m_description(description),
+ m_place(parent->place()), m_realText(text), m_realIconSet(icon)
+{
+ hide();
+ setFlat(true);
+ setToggleButton(true);
+ setFocusPolicy(NoFocus);
+ setDescription(m_description);
+ setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+ resize(sizeHint());
+ fixDimensions(Ideal::Bottom);
+
+ QToolTip::add(this, m_realText);
+
+ m_assignAccelAction = new KAction(i18n("Assign Accelerator..."), 0,
+ this, SLOT(assignAccel()), this);
+ m_clearAccelAction = new KAction(i18n("Clear Accelerator"), 0,
+ this, SLOT(clearAccel()), this);
+
+ KConfig *config = kapp->config();
+ config->setGroup("UI");
+ QString accel = config->readEntry(QString("button_%1").arg(text), "");
+ if (!accel.isEmpty())
+ setRealText(QString("&%1 %2").arg(accel).arg(m_realText));
+}
+
+Button::~Button()
+{
+// m_buttonBar->removeButton(this);
+ KConfig *config = kapp->config();
+ config->setGroup("UI");
+
+ QRegExp r("^&([0-9])\\s.*");
+ QRegExp r2("^&[0-9]\\s");
+ if (r.search(m_realText) > -1)
+ {
+ QString text = m_realText;
+ if (text.contains(r2))
+ text.remove(r2);
+ config->writeEntry(QString("button_%1").arg(text), r.cap(1));
+ }
+ else
+ {
+ config->writeEntry(QString("button_%1").arg(m_realText), "");
+ }
+}
+
+void Button::setDescription(const QString &description)
+{
+ m_description = description;
+ QToolTip::remove(this);
+ QToolTip::add(this, m_description);
+}
+
+QString Button::description() const
+{
+ return m_description;
+}
+
+void Button::drawButton(QPainter *p)
+{
+ QRect r = rect();
+ QSize sh = r.size();
+ switch (m_place)
+ {
+ case Ideal::Left:
+ case Ideal::Right:
+ sh.setHeight(r.width());
+ sh.setWidth(r.height());
+ break;
+ }
+
+ QStyle::SFlags flags = QStyle::Style_Default;
+ if (isEnabled())
+ flags |= QStyle::Style_Enabled;
+ if (hasFocus())
+ flags |= QStyle::Style_HasFocus;
+ if (isDown())
+ flags |= QStyle::Style_Down;
+ if (isOn())
+ flags |= QStyle::Style_On;
+ if (! isFlat() && ! isDown())
+ flags |= QStyle::Style_Raised;
+ if (isDefault())
+ flags |= QStyle::Style_ButtonDefault;
+
+ QPixmap pm(sh.width(), sh.height());
+ pm.fill(eraseColor());
+ QPainter p2(&pm);
+
+ style().drawControl(QStyle::CE_PushButton,&p2,this, QRect(0,0,pm.width(),pm.height()), colorGroup(),flags);
+
+ style().drawControl(QStyle::CE_PushButtonLabel, &p2, this,
+ QRect(0,0,pm.width(),pm.height()),
+ colorGroup(), flags, QStyleOption());
+
+ switch (m_place)
+ {
+ case Ideal::Left:
+ p->rotate(-90);
+ p->drawPixmap(1-pm.width(), 0, pm);
+ break;
+ case Ideal::Right:
+ p->rotate(90);
+ p->drawPixmap(0, 1-pm.height(), pm);
+ break;
+ default:
+ p->drawPixmap(0, 0, pm);
+ break;
+ }
+}
+
+void Button::drawButtonLabel(QPainter */*p*/)
+{
+}
+
+ButtonMode Button::mode()
+{
+ return m_buttonBar->mode();
+}
+
+void Button::setPlace(Ideal::Place place)
+{
+ Place oldPlace = m_place;
+ m_place = place;
+ fixDimensions(oldPlace);
+}
+
+void Button::fixDimensions(Place oldPlace)
+{
+ switch (m_place)
+ {
+ case Ideal::Left:
+ case Ideal::Right:
+ if ((oldPlace == Ideal::Bottom) || (oldPlace == Ideal::Top))
+ {
+ setFixedWidth(height());
+ setMinimumHeight(sizeHint().width());
+ setMaximumHeight(32767);
+ }
+ break;
+ case Ideal::Top:
+ case Ideal::Bottom:
+ if ((oldPlace == Ideal::Left) || (oldPlace == Ideal::Right))
+ {
+ setFixedHeight(width());
+ setMinimumWidth(sizeHint().height());
+ setMaximumWidth(32767);
+ }
+ break;
+ }
+}
+
+QSize Button::sizeHint() const
+{
+ return sizeHint(text());
+}
+
+QSize Button::sizeHint(const QString &text) const
+{
+ constPolish();
+ int w = 0, h = 0;
+
+ if ( iconSet() && !iconSet()->isNull() && (m_buttonBar->mode() != Text) ) {
+ int iw = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width() + 4;
+ int ih = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
+ w += iw;
+ h = QMAX( h, ih );
+ }
+ if ( isMenuButton() )
+ w += style().pixelMetric(QStyle::PM_MenuButtonIndicator, this);
+ if ( pixmap() ) {
+ QPixmap *pm = (QPixmap *)pixmap();
+ w += pm->width();
+ h += pm->height();
+ } else if (m_buttonBar->mode() != Icons) {
+ QString s( text );
+ bool empty = s.isEmpty();
+ if ( empty )
+ s = QString::fromLatin1("XXXX");
+ QFontMetrics fm = fontMetrics();
+ QSize sz = fm.size( ShowPrefix, s );
+ if(!empty || !w)
+ w += sz.width();
+ if(!empty || !h)
+ h = QMAX(h, sz.height());
+ }
+
+ return (style().sizeFromContents(QStyle::CT_ToolButton, this, QSize(w, h)).
+ expandedTo(QApplication::globalStrut()));
+}
+
+void Button::updateSize()
+{
+ switch (m_place)
+ {
+ case Ideal::Left:
+ case Ideal::Right:
+ setMinimumHeight(sizeHint().width());
+ resize(sizeHint().height(), sizeHint().width());
+ break;
+ case Ideal::Top:
+ case Ideal::Bottom:
+ resize(sizeHint().width(), sizeHint().height());
+ break;
+ }
+}
+
+QString Button::realText() const
+{
+ return m_realText;
+}
+
+void Button::setMode(Ideal::ButtonMode mode)
+{
+ switch (mode)
+ {
+ case Text:
+ disableIconSet();
+ enableText();
+ break;
+ case IconsAndText:
+ enableIconSet();
+ enableText();
+ break;
+ case Icons:
+ disableText();
+ enableIconSet();
+ break;
+ }
+}
+
+void Button::enableIconSet()
+{
+ if (!iconSet())
+ {
+ if (m_realIconSet.isNull())
+ m_realIconSet = SmallIcon("file_new");
+ setIconSet(m_realIconSet);
+ }
+}
+
+void Button::disableIconSet()
+{
+ setIconSet(QIconSet());
+}
+
+void Button::disableText()
+{
+ if (text().length() > 0)
+ setText("");
+}
+
+void Button::enableText()
+{
+ setText(m_realText);
+}
+
+void Button::contextMenuEvent(QContextMenuEvent *e)
+{
+/* QPopupMenu menu;
+
+ m_assignAccelAction->plug(&menu);
+ if (m_realText.contains(QRegExp("^&[0-9]\\s")))
+ m_clearAccelAction->plug(&menu);
+
+ emit contextMenu( &menu );
+
+ menu.exec(e->globalPos());
+ */
+}
+
+void Button::assignAccel()
+{
+ bool ok;
+ int num = KInputDialog::getInteger(i18n("Change Button Number"), i18n("New accelerator number:"), 1, 0, 10, 1, &ok, this);
+ if (ok)
+ {
+ QString text = realTextWithoutAccel();
+ text = QString("&%1 %2").arg(num).arg(text);
+ setRealText(text);
+ }
+}
+
+void Button::setRealText(const QString &text)
+{
+ m_realText = text;
+ setText(text);
+ updateSize();
+}
+
+void Button::clearAccel()
+{
+ setRealText(realTextWithoutAccel());
+}
+
+QString Button::realTextWithoutAccel() const
+{
+ QString text = m_realText;
+ QRegExp r("^&[0-9]\\s");
+ if (text.contains(r))
+ text.remove(r);
+ return text;
+}
+
+}
+
+#include "button.moc"
diff --git a/apps/ktorrent/newui/button.h b/apps/ktorrent/newui/button.h
new file mode 100644
index 0000000..a7afbcf
--- /dev/null
+++ b/apps/ktorrent/newui/button.h
@@ -0,0 +1,108 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef IDEALBUTTON_H
+#define IDEALBUTTON_H
+
+#include <qpushbutton.h>
+#include <qiconset.h>
+
+#include "comdefs.h"
+
+class KAction;
+
+namespace Ideal {
+
+class ButtonBar;
+
+/**
+@short A button to place onto the ButtonBar
+
+A QPushButton derivative with a size of a QToolBar. Button can be rotated
+(placed onto different places in ideal mode).
+*/
+class Button : public QPushButton {
+ Q_OBJECT
+public:
+ Button(ButtonBar *parent, const QString text, const QIconSet &icon = QIconSet(),
+ const QString &description = QString::null);
+
+ /**Sets the description used as a tooltip.*/
+ void setDescription(const QString &description);
+ /**Returns the description.*/
+ QString description() const;
+
+ /**Sets the place of a button.*/
+ void setPlace(Ideal::Place place);
+ /**Sets the mode of a button.*/
+ void setMode(Ideal::ButtonMode mode);
+
+ QSize sizeHint() const;
+ QSize sizeHint(const QString &text) const;
+
+ /**Updates size of a widget. Used after squeezing button's text.*/
+ void updateSize();
+
+ /**Returns the real (i.e. not squeezed) text of a button.*/
+ QString realText() const;
+ QString realTextWithoutAccel() const;
+ void setRealText(const QString &text);
+
+protected:
+ ButtonMode mode();
+
+ virtual void drawButton(QPainter *p);
+ virtual void drawButtonLabel(QPainter *p);
+
+ virtual void contextMenuEvent(QContextMenuEvent *e);
+
+protected slots:
+ void assignAccel();
+ void clearAccel();
+
+signals:
+ void contextMenu(QPopupMenu*);
+
+private:
+ virtual ~Button();
+
+ void fixDimensions(Place oldPlace);
+
+ void enableIconSet();
+ void disableIconSet();
+ void enableText();
+ void disableText();
+
+ ButtonBar *m_buttonBar;
+
+ QString m_description;
+ Place m_place;
+
+ QString m_realText;
+ QIconSet m_realIconSet;
+
+ KAction *m_assignAccelAction;
+ KAction *m_clearAccelAction;
+
+friend class ButtonBar;
+};
+
+}
+
+#endif
diff --git a/apps/ktorrent/newui/buttonbar.cpp b/apps/ktorrent/newui/buttonbar.cpp
new file mode 100644
index 0000000..8f60dab
--- /dev/null
+++ b/apps/ktorrent/newui/buttonbar.cpp
@@ -0,0 +1,346 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "buttonbar.h"
+
+#include <qlayout.h>
+
+#include <kdebug.h>
+#include <kconfig.h>
+#include <kstringhandler.h>
+#include <klocale.h>
+
+#include "button.h"
+
+namespace Ideal {
+
+//ButtonLayout class
+
+ButtonLayout::ButtonLayout(ButtonBar *parent, Direction d, int margin, int spacing, const char *name)
+ :QBoxLayout(parent, d, margin, spacing, name), m_buttonBar(parent)
+{
+}
+
+QSize ButtonLayout::minimumSize() const
+{
+ QSize size = QBoxLayout::minimumSize();
+
+ if (!m_buttonBar->autoResize())
+ return size;
+
+ switch (m_buttonBar->place())
+ {
+ case Ideal::Left:
+ case Ideal::Right:
+ return QSize(size.width(),0);
+ break;
+ case Ideal::Top:
+ case Ideal::Bottom:
+ return QSize(0,size.height());
+ }
+ return QBoxLayout::minimumSize();
+}
+
+
+
+//ButtonBar class
+
+
+ButtonBar::ButtonBar(Place place, ButtonMode mode, QWidget *parent, const char *name)
+ :QWidget(parent, name), m_place(place), l(0), m_shrinked(false), m_autoResize(true)
+{
+ switch (m_place)
+ {
+ case Ideal::Left:
+ case Ideal::Right:
+ l = new ButtonLayout(this, QBoxLayout::TopToBottom, 0, 0);
+ break;
+ case Ideal::Top:
+ case Ideal::Bottom:
+ l = new ButtonLayout(this, QBoxLayout::LeftToRight, 0, 0);
+ break;
+ }
+
+ l->setResizeMode(QLayout::Minimum);
+ setMode(mode);
+
+ l->insertStretch(-1);
+}
+
+ButtonBar::~ButtonBar()
+{
+}
+
+void ButtonBar::addButton(Button *button)
+{
+ int buttonCount = m_buttons.count();
+
+ button->setMode(m_mode);
+ m_buttons.append(button);
+ l->insertWidget(buttonCount, button);
+ button->show();
+ fixDimensions();
+}
+
+void ButtonBar::removeButton(Button *button)
+{
+ m_buttons.remove(button);
+ l->remove(button);
+ delete button;
+}
+
+void ButtonBar::setMode(ButtonMode mode)
+{
+ m_mode = mode;
+ for (ButtonList::iterator it = m_buttons.begin(); it != m_buttons.end(); ++it)
+ (*it)->setMode(mode);
+}
+
+ButtonMode ButtonBar::mode() const
+{
+ return m_mode;
+}
+
+Place ButtonBar::place() const
+{
+ return m_place;
+}
+
+void ButtonBar::fixDimensions()
+{
+ switch (m_place)
+ {
+ case Ideal::Left:
+ case Ideal::Right:
+ setFixedWidth(sizeHint().width());
+ setMinimumHeight(sizeHint().height());
+ setMaximumHeight(32767);
+ break;
+ case Ideal::Top:
+ case Ideal::Bottom:
+ setFixedHeight(sizeHint().height());
+ setMinimumWidth(sizeHint().width());
+ setMaximumWidth(32767);
+ break;
+ }
+}
+
+void ButtonBar::setButtonsPlace(Ideal::Place place)
+{
+ for (ButtonList::iterator it = m_buttons.begin(); it != m_buttons.end(); ++it)
+ (*it)->setPlace(place);
+}
+
+void ButtonBar::resizeEvent(QResizeEvent *ev)
+{
+ int preferredDimension = 0;
+ int actualDimension = 0;
+ int oldDimension = 0;
+ switch (m_place)
+ {
+ case Ideal::Left:
+ case Ideal::Right:
+ preferredDimension = l->QBoxLayout::minimumSize().height();
+ actualDimension = size().height();
+ oldDimension = ev->oldSize().height();
+ break;
+ case Ideal::Top:
+ case Ideal::Bottom:
+ preferredDimension = l->QBoxLayout::minimumSize().width();
+ actualDimension = size().width();
+ oldDimension = ev->oldSize().width();
+ break;
+ }
+
+ if (preferredDimension > actualDimension)
+ shrink(preferredDimension, actualDimension);
+ else if (m_shrinked && (originalDimension() < actualDimension))
+ unshrink();
+ else if (m_shrinked && actualDimension > oldDimension)
+ deshrink(preferredDimension, actualDimension);
+
+ QWidget::resizeEvent(ev);
+}
+
+void ButtonBar::shrink(int preferredDimension, int actualDimension)
+{
+ if (!preferredDimension)
+ return;
+
+ m_shrinked = true;
+
+ uint textLength = 0;
+ QValueList<uint> texts;
+ uint maxLength = 0;
+ for (ButtonList::const_iterator it = m_buttons.constBegin(); it != m_buttons.constEnd(); ++it)
+ {
+ uint length = (*it)->text().length();
+ maxLength = length > maxLength ? length : maxLength ;
+ texts.append(length);
+ textLength += length;
+ }
+
+ uint newPreferredLength = actualDimension * textLength / preferredDimension;
+
+ uint newMaxLength = maxLength;
+ uint newTextLength;
+ do {
+ newMaxLength -= 1;
+ newTextLength = 0;
+ for (QValueList<uint>::iterator it = texts.begin(); it != texts.end(); ++it)
+ {
+ if (*it > newMaxLength)
+ *it = newMaxLength;
+ newTextLength += *it;
+ }
+ } while (newTextLength > newPreferredLength);
+
+ int i = 0;
+ for (ButtonList::iterator it = m_buttons.begin(); it != m_buttons.end(); ++it)
+ {
+ (*it)->setText(KStringHandler::rsqueeze((*it)->realText(), texts[i++]));
+ (*it)->updateSize();
+ }
+}
+
+void ButtonBar::deshrink(int preferredDimension, int actualDimension)
+{
+ if (!preferredDimension)
+ return;
+
+ m_shrinked = true;
+
+ uint textLength = 0;
+ QValueList<uint> texts;
+ uint maxLength = 0;
+ for (ButtonList::const_iterator it = m_buttons.constBegin(); it != m_buttons.constEnd(); ++it)
+ {
+ uint length = (*it)->text().length();
+ maxLength = length > maxLength ? length : maxLength ;
+ texts.append(length);
+ textLength += length;
+ }
+
+ uint newPreferredLength = actualDimension * textLength / preferredDimension;
+
+ if (newPreferredLength <= textLength)
+ return;
+
+ uint newTextLength;
+ uint prevTextLength = 0;
+ do {
+ newTextLength = 0;
+ int i = 0;
+ for (QValueList<uint>::iterator it = texts.begin(); it != texts.end(); ++it, i++)
+ {
+ if (m_buttons[i]->text().contains("..."))
+ (*it)++;
+ newTextLength += *it;
+ }
+ if (newTextLength == prevTextLength)
+ break;
+ prevTextLength = newTextLength;
+ } while (newTextLength < newPreferredLength);
+
+ int i = 0;
+ for (ButtonList::iterator it = m_buttons.begin(); it != m_buttons.end(); ++it)
+ {
+ if (texts[i] >= (*it)->realText().length())
+ (*it)->setText((*it)->realText());
+ else
+ (*it)->setText(KStringHandler::rsqueeze((*it)->realText(), texts[i]));
+ (*it)->updateSize();
+ ++i;
+ }
+}
+
+void ButtonBar::unshrink()
+{
+ for (ButtonList::iterator it = m_buttons.begin(); it != m_buttons.end(); ++it)
+ {
+ (*it)->setText((*it)->realText());
+ (*it)->updateSize();
+ }
+ m_shrinked = false;
+}
+
+int ButtonBar::originalDimension()
+{
+ int size = 0;
+ for (ButtonList::const_iterator it = m_buttons.constBegin(); it != m_buttons.constEnd(); ++it)
+ {
+ size += (*it)->sizeHint((*it)->realText()).width();
+ }
+ return size;
+}
+
+bool ButtonBar::autoResize() const
+{
+ return m_autoResize;
+}
+
+void ButtonBar::setAutoResize(bool b)
+{
+ m_autoResize = b;
+}
+
+Button *ButtonBar::firstButton()
+{
+ if (!m_buttons.isEmpty())
+ return m_buttons.first();
+ return 0;
+}
+
+Button *ButtonBar::nextTo(Button *button)
+{
+ ButtonList::iterator it = m_buttons.find(button);
+ Button *next = 0;
+ if ((*it) == m_buttons.last())
+ next = m_buttons.first();
+ else
+ {
+ it++;
+ next = *it;
+ }
+ if (next->isVisible())
+ return next;
+ else
+ return nextTo(next);
+}
+
+Button *ButtonBar::prevTo(Button *button)
+{
+ ButtonList::iterator it = m_buttons.find(button);
+ Button *prev = 0;
+ if (it == m_buttons.begin())
+ prev = m_buttons.last();
+ else
+ {
+ it--;
+ prev = *it;
+ }
+ if (prev->isVisible())
+ return prev;
+ else
+ return prevTo(prev);
+}
+
+}
+
+#include "buttonbar.moc"
diff --git a/apps/ktorrent/newui/buttonbar.h b/apps/ktorrent/newui/buttonbar.h
new file mode 100644
index 0000000..5f5a7e3
--- /dev/null
+++ b/apps/ktorrent/newui/buttonbar.h
@@ -0,0 +1,112 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef IDEALBUTTONBAR_H
+#define IDEALBUTTONBAR_H
+
+#include <qwidget.h>
+#include <qvaluelist.h>
+
+#include "comdefs.h"
+
+#include <qlayout.h>
+
+namespace Ideal {
+
+class Button;
+class ButtonBar;
+
+/**@short A layout for a ButtonBar class.
+
+Overrides minimumSize method to allow shrinking button bar buttons.*/
+class ButtonLayout: public QBoxLayout{
+public:
+ ButtonLayout(ButtonBar *parent, Direction d, int margin = 0, int spacing = -1, const char * name = 0);
+
+ virtual QSize minimumSize() const;
+
+private:
+ ButtonBar *m_buttonBar;
+};
+
+/**
+@short A bar with tool buttons.
+
+Looks like a toolbar but has another behaviour. It is suitable for
+placing on the left(right, bottom, top) corners of a window as a bar with slider.
+*/
+class ButtonBar : public QWidget {
+ Q_OBJECT
+public:
+ ButtonBar(Place place, ButtonMode mode = IconsAndText,
+ QWidget *parent = 0, const char *name = 0);
+ virtual ~ButtonBar();
+
+ /**Adds a button to the bar.*/
+ virtual void addButton(Button *button);
+ /**Removes a button from the bar and deletes the button.*/
+ virtual void removeButton(Button *button);
+
+ /**Sets the mode.*/
+ void setMode(ButtonMode mode);
+ /**@returns the mode.*/
+ ButtonMode mode() const;
+
+ /**@returns the place.*/
+ Place place() const;
+
+ bool autoResize() const;
+ void setAutoResize(bool b);
+
+ /**Shrinks the button bar so all buttons are visible. Shrinking is done by
+ reducing the amount of text shown on buttons. Button icon size is a minimum size
+ of a button. If a button does not have an icon, it displays "...".*/
+ virtual void shrink(int preferredDimension, int actualDimension);
+ virtual void deshrink(int preferredDimension, int actualDimension);
+ /**Restores the size of button bar buttons.*/
+ virtual void unshrink();
+
+ Button *firstButton();
+ Button *nextTo(Button *button);
+ Button *prevTo(Button *button);
+
+protected:
+ virtual void resizeEvent ( QResizeEvent *ev );
+
+ int originalDimension();
+
+private:
+ void fixDimensions();
+ void setButtonsPlace(Ideal::Place place);
+
+ typedef QValueList<Button*> ButtonList;
+ ButtonList m_buttons;
+
+ ButtonMode m_mode;
+ Place m_place;
+
+ ButtonLayout *l;
+
+ bool m_shrinked;
+ bool m_autoResize;
+};
+
+}
+
+#endif
diff --git a/apps/ktorrent/newui/comdefs.h b/apps/ktorrent/newui/comdefs.h
new file mode 100644
index 0000000..8233f12
--- /dev/null
+++ b/apps/ktorrent/newui/comdefs.h
@@ -0,0 +1,30 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef COMDEFS_H
+#define COMDEFS_H
+
+namespace Ideal {
+
+ enum Place { Left=1, Right=2, Top=4, Bottom=8 };
+ enum ButtonMode { Text, IconsAndText, Icons };
+
+}
+
+#endif
diff --git a/apps/ktorrent/newui/ddockwindow.cpp b/apps/ktorrent/newui/ddockwindow.cpp
new file mode 100644
index 0000000..9edfc7c
--- /dev/null
+++ b/apps/ktorrent/newui/ddockwindow.cpp
@@ -0,0 +1,418 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "ddockwindow.h"
+
+#include <qtoolbutton.h>
+#include <qlayout.h>
+#include <qstyle.h>
+#include <qwidgetstack.h>
+#include <qimage.h>
+#include <qapplication.h>
+#include <qpopupmenu.h>
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kconfig.h>
+#include <kcombobox.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kapplication.h>
+
+#include "buttonbar.h"
+#include "button.h"
+#include "dmainwindow.h"
+
+DDockWindow::DDockWindow(DMainWindow *parent, Position position)
+ :QDockWindow(QDockWindow::InDock, parent), m_position(position), m_visible(false),
+ m_mainWindow(parent), m_doNotCloseActiveWidget(false), m_toggledButton(0), m_lastContextMenuButton(0)
+{
+ setMovingEnabled(false);
+ setResizeEnabled(true);
+
+ Ideal::Place place = Ideal::Left;
+ switch (position) {
+ case DDockWindow::Bottom:
+ m_name = "BottomToolWindow";
+ place = Ideal::Bottom;
+ m_internalLayout = new QVBoxLayout(boxLayout(), 0);
+ m_internalLayout->setDirection(QBoxLayout::BottomToTop);
+ break;
+ case DDockWindow::Left:
+ m_name = "LeftToolWindow";
+ place = Ideal::Left;
+ m_internalLayout = new QHBoxLayout(boxLayout(), 0);
+ m_internalLayout->setDirection(QBoxLayout::LeftToRight);
+ break;
+ case DDockWindow::Right:
+ m_name = "RightToolWindow";
+ place = Ideal::Right;
+ m_internalLayout = new QHBoxLayout(boxLayout(), 0);
+ m_internalLayout->setDirection(QBoxLayout::RightToLeft);
+ break;
+ }
+
+ KConfig *config = kapp->config();
+ config->setGroup("UI");
+ int mode = config->readNumEntry("MDIStyle", 3);
+ Ideal::ButtonMode buttonMode = Ideal::Text;
+ if (mode == 0)
+ buttonMode = Ideal::Icons;
+ else if (mode == 1)
+ buttonMode = Ideal::Text;
+ else if (mode == 3)
+ buttonMode = Ideal::IconsAndText;
+
+ m_bar = new Ideal::ButtonBar(place, buttonMode, this);
+ m_internalLayout->addWidget(m_bar);
+
+ m_widgetStack = new QWidgetStack(this);
+ m_internalLayout->addWidget(m_widgetStack);
+
+ m_moveToDockLeft = new KAction( i18n("Move to left dock"), 0, this, SLOT(moveToDockLeft()), this );
+ m_moveToDockRight = new KAction( i18n("Move to right dock"), 0, this, SLOT(moveToDockRight()), this );
+ m_moveToDockBottom = new KAction( i18n("Move to bottom dock"), 0, this, SLOT(moveToDockBottom()), this );
+
+ setVisible(m_visible);
+
+ loadSettings();
+}
+
+DDockWindow::~DDockWindow()
+{
+//done in DMainWindow now
+// saveSettings();
+}
+
+void DDockWindow::setVisible(bool v)
+{
+ //write dock width to the config file
+ KConfig *config = kapp->config();
+ QString group = QString("%1").arg(m_name);
+ config->setGroup(group);
+
+ if (m_visible)
+ config->writeEntry("ViewWidth", m_position == DDockWindow::Bottom ? height() : width() );
+ setResizeEnabled(v);
+ setVerticallyStretchable(true);
+ setHorizontallyStretchable(true);
+ v ? m_widgetStack->show() : m_widgetStack->hide();
+ m_visible = v;
+
+ m_internalLayout->invalidate();
+ if (!m_visible)
+ {
+ if (m_position == DDockWindow::Bottom)
+ setFixedExtentHeight(m_internalLayout->sizeHint().height());
+ else
+ setFixedExtentWidth(m_internalLayout->sizeHint().width());
+ emit hidden();
+ }
+ else
+ {
+ //restore widget size from the config
+ int size = 0;
+ if (m_position == DDockWindow::Bottom)
+ {
+ size = config->readNumEntry("ViewWidth", m_internalLayout->minimumSize().height());
+ setFixedExtentHeight(size);
+ }
+ else
+ {
+ size = config->readNumEntry("ViewWidth", m_internalLayout->minimumSize().width());
+ setFixedExtentWidth(size);
+ }
+ }
+}
+
+void DDockWindow::loadSettings()
+{
+}
+
+void DDockWindow::saveSettings()
+{
+ KConfig *config = kapp->config();
+ QString group = QString("%1").arg(m_name);
+ int invisibleWidth = 0;
+ config->setGroup(group);
+ if (config->hasKey("ViewWidth"))
+ invisibleWidth = config->readNumEntry("ViewWidth");
+ config->deleteEntry("ViewWidth");
+ config->deleteEntry("ViewLastWidget");
+ if (m_toggledButton && m_visible)
+ {
+ config->writeEntry("ViewWidth", m_position == DDockWindow::Bottom ? height() : width());
+ config->writeEntry("ViewLastWidget", m_toggledButton->realTextWithoutAccel());
+ }
+ else if (invisibleWidth != 0)
+ config->writeEntry("ViewWidth", invisibleWidth);
+}
+
+QWidget *DDockWindow::currentWidget() const
+{
+ return m_widgetStack->visibleWidget();
+}
+
+void DDockWindow::addWidget(const QString &title, QWidget *widget, bool skipActivation)
+{
+ kdDebug(9000) << k_funcinfo << endl;
+ QPixmap *pm = const_cast<QPixmap*>(widget->icon());
+ Ideal::Button *button;
+ if (pm != 0)
+ {
+ //force 16pt for now
+ if (pm->height() > 16)
+ {
+ QImage img = pm->convertToImage();
+ img = img.smoothScale(16, 16);
+ pm->convertFromImage(img);
+ }
+ button = new Ideal::Button(m_bar, title, *pm);
+ }
+ else
+ button = new Ideal::Button(m_bar, title);
+ m_widgets[button] = widget;
+ m_buttons[widget] = button;
+ m_bar->addButton(button);
+
+ m_widgetStack->addWidget(widget);
+ connect(button, SIGNAL(clicked()), this, SLOT(selectWidget()));
+ connect(button, SIGNAL(contextMenu(QPopupMenu*)), this, SLOT(contextMenu(QPopupMenu*)) );
+
+ if (!skipActivation)
+ {
+ //if the widget was selected last time the dock is deleted
+ //we need to show it
+ KConfig *config = kapp->config();
+ QString group = QString("%1").arg(m_name);
+ config->setGroup(group);
+ if (config->readEntry("ViewLastWidget") == title)
+ {
+ kdDebug(9000) << k_funcinfo << " : activating last widget " << title << endl;
+ button->setOn(true);
+ selectWidget(button);
+ }
+ }
+}
+
+void DDockWindow::raiseWidget(QWidget *widget)
+{
+ kdDebug(9000) << k_funcinfo << endl;
+
+ if ( !widget ) return;
+
+ Ideal::Button *button = m_buttons[widget];
+ if ((button != 0) && (!button->isOn()))
+ {
+ button->setOn(true);
+ selectWidget(button);
+ }
+}
+
+void DDockWindow::lowerWidget(QWidget * widget)
+{
+ kdDebug(9000) << k_funcinfo << endl;
+
+ if ( !widget ) return;
+
+ Ideal::Button *button = m_buttons[widget];
+ if ((button != 0) && (button->isOn()))
+ {
+ button->setOn(false);
+ selectWidget(button);
+ }
+}
+
+void DDockWindow::removeWidget(QWidget *widget)
+{
+ kdDebug(9000) << k_funcinfo << endl;
+ if (m_widgetStack->id(widget) == -1)
+ return; //not in dock
+
+ bool changeVisibility = false;
+ if (m_widgetStack->visibleWidget() == widget)
+ changeVisibility = true;
+
+ Ideal::Button *button = m_buttons[widget];
+ if (button)
+ m_bar->removeButton(button);
+ m_widgets.remove(button);
+ m_buttons.remove(widget);
+ m_widgetStack->removeWidget(widget);
+
+ if (changeVisibility)
+ {
+ m_toggledButton = 0;
+ setVisible(false);
+ }
+}
+
+void DDockWindow::selectWidget(Ideal::Button *button)
+{
+ bool special = m_doNotCloseActiveWidget;
+ m_doNotCloseActiveWidget = false;
+ kdDebug(9000) << k_funcinfo << endl;
+ if (m_toggledButton == button)
+ {
+ if (special && m_visible && (!isActive()))
+ {
+ //special processing for keyboard navigation events
+ m_toggledButton->setOn(true);
+ m_widgets[button]->setFocus();
+ }
+ else
+ {
+ m_widgets[button]->setFocus();
+ setVisible(!m_visible);
+ }
+ return;
+ }
+
+ if (m_toggledButton)
+ m_toggledButton->setOn(false);
+ m_toggledButton = button;
+ setVisible(true);
+ m_widgetStack->raiseWidget(m_widgets[button]);
+ m_widgets[button]->setFocus();
+}
+
+void DDockWindow::selectWidget()
+{
+ selectWidget((Ideal::Button*)sender());
+}
+
+void DDockWindow::hideWidget(QWidget *widget)
+{
+ Ideal::Button *button = m_buttons[widget];
+ if (button != 0)
+ {
+ button->setOn(false);
+ button->hide();
+ }
+ widget->hide();
+ if (button == m_toggledButton)
+ setVisible(false);
+}
+
+void DDockWindow::showWidget(QWidget *widget)
+{
+ Ideal::Button *button = m_buttons[widget];
+ if (button != 0)
+ button->show();
+// widget->show();
+}
+
+void DDockWindow::setMovingEnabled(bool)
+{
+ //some operations on KMainWindow cause moving to be enabled
+ //but we always don't want DDockWindow instances to be movable
+ QDockWindow::setMovingEnabled(false);
+}
+
+void DDockWindow::selectLastWidget()
+{
+ m_doNotCloseActiveWidget = true;
+ if (m_toggledButton)
+ m_toggledButton->animateClick();
+ else if (Ideal::Button *button = m_bar->firstButton())
+ button->animateClick();
+}
+
+bool DDockWindow::isActive()
+{
+ if (m_toggledButton)
+ {
+ QWidget *w = qApp->focusWidget();
+ if (!w)
+ return false;
+ QWidget *toolWidget = m_widgets[m_toggledButton];
+ if (toolWidget == w)
+ return true;
+ else
+ {
+ do {
+ w = (QWidget*)w->parent();
+ if (w && (w == toolWidget)) return true;
+ } while (w);
+ }
+ }
+ return false;
+}
+
+void DDockWindow::selectNextWidget()
+{
+ if (!m_toggledButton)
+ return;
+ Ideal::Button *b = m_bar->nextTo(m_toggledButton);
+ if (b)
+ b->animateClick();
+}
+
+void DDockWindow::selectPrevWidget()
+{
+ if (!m_toggledButton)
+ return;
+ Ideal::Button *b = m_bar->prevTo(m_toggledButton);
+ if (b)
+ b->animateClick();
+}
+
+void DDockWindow::contextMenu(QPopupMenu * menu)
+{
+ m_lastContextMenuButton = static_cast<Ideal::Button*>( const_cast<QObject*>( sender() ) );
+
+ menu->insertSeparator();
+
+ if ( position() != DDockWindow::Left )
+ m_moveToDockLeft->plug( menu );
+ if ( position()!= DDockWindow::Right )
+ m_moveToDockRight->plug( menu );
+ if ( position() != DDockWindow::Bottom )
+ m_moveToDockBottom->plug( menu );
+}
+
+void DDockWindow::moveToDockLeft()
+{
+ moveToDock( DDockWindow::Left );
+}
+
+void DDockWindow::moveToDockRight()
+{
+ moveToDock( DDockWindow::Right );
+}
+
+void DDockWindow::moveToDockBottom()
+{
+ moveToDock( DDockWindow::Bottom );
+}
+
+void DDockWindow::moveToDock(DDockWindow::Position position )
+{
+ if ( m_widgets.contains( m_lastContextMenuButton ) )
+ {
+ mainWindow()->moveWidget( position, m_widgets[ m_lastContextMenuButton ], m_lastContextMenuButton->realTextWithoutAccel() );
+ }
+}
+
+bool DDockWindow::hasWidgets() const
+{
+ return m_widgets.count() > 0;
+}
+
+#include "ddockwindow.moc"
diff --git a/apps/ktorrent/newui/ddockwindow.h b/apps/ktorrent/newui/ddockwindow.h
new file mode 100644
index 0000000..d0cc655
--- /dev/null
+++ b/apps/ktorrent/newui/ddockwindow.h
@@ -0,0 +1,116 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef DDOCKWINDOW_H
+#define DDOCKWINDOW_H
+
+#include <qdockwindow.h>
+#include <qvaluelist.h>
+
+class QBoxLayout;
+class QToolButton;
+class QWidgetStack;
+class QPopupMenu;
+
+class KComboBox;
+class KAction;
+
+class DMainWindow;
+
+namespace Ideal {
+ class Button;
+ class ButtonBar;
+}
+
+class DDockWindow : public QDockWindow {
+ Q_OBJECT
+public:
+ enum Position { Bottom, Left, Right };
+
+ DDockWindow(DMainWindow *parent, Position position);
+ virtual ~DDockWindow();
+
+ virtual void setVisible(bool v);
+ bool visible() const { return m_visible; }
+ Position position() const { return m_position; }
+
+ virtual void addWidget(const QString &title, QWidget *widget, bool skipActivation = false);
+ virtual void raiseWidget(QWidget *widget);
+ virtual void lowerWidget(QWidget *widget);
+ /**Removes the widget from dock. Does not delete it.*/
+ virtual void removeWidget(QWidget *widget);
+
+ virtual void hideWidget(QWidget *widget);
+ virtual void showWidget(QWidget *widget);
+
+ virtual QWidget *currentWidget() const;
+
+ virtual void setMovingEnabled(bool b);
+
+ virtual void saveSettings();
+
+ DMainWindow *mainWindow() const { return m_mainWindow; }
+
+ virtual void selectLastWidget();
+ virtual void selectNextWidget();
+ virtual void selectPrevWidget();
+
+ bool isActive();
+ /// Check if this dock has any widgets
+ bool hasWidgets() const;
+
+signals:
+ void hidden();
+
+private slots:
+ void selectWidget();
+ void selectWidget(Ideal::Button *button);
+ void contextMenu(QPopupMenu*);
+ void moveToDockLeft();
+ void moveToDockRight();
+ void moveToDockBottom();
+ void moveToDock(DDockWindow::Position);
+
+protected:
+ virtual void loadSettings();
+
+ Ideal::ButtonBar *m_bar;
+ QWidgetStack *m_widgetStack;
+
+ QMap<Ideal::Button*, QWidget*> m_widgets;
+ QMap<QWidget*, Ideal::Button*> m_buttons;
+
+private:
+ Position m_position;
+ bool m_visible;
+ QString m_name;
+ DMainWindow *m_mainWindow;
+ bool m_doNotCloseActiveWidget;
+
+ Ideal::Button *m_toggledButton;
+ Ideal::Button *m_lastContextMenuButton;
+ QBoxLayout *m_internalLayout;
+
+
+ KAction * m_moveToDockLeft;
+ KAction * m_moveToDockRight;
+ KAction * m_moveToDockBottom;
+};
+
+#endif
diff --git a/apps/ktorrent/newui/dmainwindow.cpp b/apps/ktorrent/newui/dmainwindow.cpp
new file mode 100644
index 0000000..ff24980
--- /dev/null
+++ b/apps/ktorrent/newui/dmainwindow.cpp
@@ -0,0 +1,320 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "dmainwindow.h"
+
+#include <kdebug.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kiconloader.h>
+
+#include <qtoolbutton.h>
+
+#include "dtabwidget.h"
+#include "docksplitter.h"
+
+DMainWindow::DMainWindow(QWidget *parent, const char *name)
+ :KParts::MainWindow(parent, name), m_firstRemoved(false), m_currentWidget(0)
+{
+ loadSettings();
+ createToolWindows();
+ m_central = new Ideal::DockSplitter(Qt::Horizontal, this);
+ m_activeTabWidget = createTab();
+ m_central->addDock(0, 0, m_activeTabWidget);
+ setCentralWidget(m_central);
+}
+
+void DMainWindow::loadSettings()
+{
+ KConfig *config = kapp->config();
+ config->setGroup("UI");
+ m_openTabAfterCurrent = config->readBoolEntry("OpenNewTabAfterCurrent", true);
+ m_showIconsOnTabs = config->readBoolEntry("ShowTabIcons", false);
+}
+
+void DMainWindow::saveSettings()
+{
+ m_leftDock->saveSettings();
+ m_rightDock->saveSettings();
+ m_bottomDock->saveSettings();
+}
+
+DMainWindow::~DMainWindow()
+{
+/* for (QValueList<QWidget*>::iterator it = m_widgets.begin(); it != m_widgets.end(); ++it)
+ removeWidget(*it);*/
+}
+
+DDockWindow *DMainWindow::toolWindow(DDockWindow::Position position) const
+{
+ switch (position) {
+ case DDockWindow::Bottom: return m_bottomDock;
+ case DDockWindow::Left: return m_leftDock;
+ case DDockWindow::Right: return m_rightDock;
+ }
+ return 0;
+}
+
+void DMainWindow::createToolWindows()
+{
+ m_bottomDock = new DDockWindow(this, DDockWindow::Bottom);
+ moveDockWindow(m_bottomDock, Qt::DockBottom);
+ m_leftDock = new DDockWindow(this, DDockWindow::Left);
+ moveDockWindow(m_leftDock, Qt::DockLeft);
+ m_rightDock = new DDockWindow(this, DDockWindow::Right);
+ moveDockWindow(m_rightDock, Qt::DockRight);
+
+ // hide all docks until we add stuff to it
+ m_bottomDock->hide();
+ m_leftDock->hide();
+ m_rightDock->hide();
+}
+
+void DMainWindow::addWidget(QWidget *widget, const QString &title)
+{
+// invalidateActiveTabWidget();
+ if (m_firstRemoved && m_activeTabWidget == m_tabs.first())
+ {
+ m_central->addDock(0, 0, m_activeTabWidget);
+ m_firstRemoved = false;
+ }
+
+ addWidget(m_activeTabWidget, widget, title);
+}
+
+void DMainWindow::addWidget(DTabWidget *tab, QWidget *widget, const QString &title)
+{
+ static QPixmap emptyPixmap;
+
+ int idx = -1;
+ if (m_openTabAfterCurrent && (tab->count() > 0))
+ idx = tab->currentPageIndex() + 1;
+ if (m_showIconsOnTabs)
+ {
+ const QPixmap *pixmap = widget->icon();
+ const QIconSet &icons = (pixmap && (pixmap->size().height() <= 16)) ? *(pixmap) : SmallIcon("kdevelop");
+ tab->insertTab(widget, icons, title, idx);
+ }
+ else
+ tab->insertTab(widget, emptyPixmap, title, idx);
+ m_widgets.append(widget);
+ m_widgetTabs[widget] = tab;
+ widget->installEventFilter(this);
+ tab->showPage(widget);
+}
+
+void DMainWindow::removeWidget(QWidget *widget)
+{
+ if (!m_widgets.contains(widget))
+ return; //not a widget in main window
+
+ if (m_widgetTabs.contains(widget))
+ {
+ DTabWidget *tab = m_widgetTabs[widget];
+ if (tab->indexOf(widget) >= 0)
+ {
+ tab->removePage(widget);
+ widget->reparent(0,QPoint(0,0),false);
+ if (tab->count() == 0)
+ {
+ if (tab->closeButton())
+ tab->closeButton()->hide();
+ //remove and delete tabwidget if it is not the first one
+ if (tab != m_tabs.first())
+ {
+ QPair<uint, uint> idx = m_central->indexOf(tab);
+ m_tabs.remove(tab);
+ m_activeTabWidget = m_tabs.first();
+ m_central->removeDock(idx.first, idx.second, true);
+ }
+ //only temporarily remove the first tabwidget
+ else
+ {
+ m_central->removeDock(0, 0, false);
+ m_firstRemoved = true;
+ }
+ //focus smth in m_activeTabWidget
+ if (m_activeTabWidget)
+ {
+ if (m_activeTabWidget->currentPage())
+ {
+ m_activeTabWidget->currentPage()->setFocus();
+ }
+ }
+ }
+ }
+ }
+
+ m_widgets.remove(widget);
+ m_widgetTabs.remove(widget);
+ if (m_activeTabWidget && m_activeTabWidget->currentPage())
+ {
+ //a hack to please multibuffer and actually switch the active part
+ QFocusEvent ev(QEvent::FocusIn);
+ QApplication::sendEvent(m_activeTabWidget->currentPage(), &ev);
+ }
+}
+
+DTabWidget *DMainWindow::splitHorizontal()
+{
+ m_activeTabWidget = createTab();
+ m_central->addDock(m_central->numRows(), 0, m_activeTabWidget);
+ return m_activeTabWidget;
+}
+
+DTabWidget *DMainWindow::splitVertical()
+{
+// invalidateActiveTabWidget();
+ int row = m_central->indexOf(m_activeTabWidget).first;
+ m_activeTabWidget = createTab();
+ m_central->addDock(row, m_central->numCols(row), m_activeTabWidget);
+ return m_activeTabWidget;
+}
+
+void DMainWindow::invalidateActiveTabWidget()
+{
+/* QWidget *focused = m_central->focusWidget();
+ kdDebug(9000) << "invalidate: " << focused << endl;
+ if (focused == 0)
+ return;
+ if (!m_widgets.contains(focused))
+ {
+ kdDebug(9000) << " focused is not in m_widgets" << endl;
+ return;
+ }
+ if (m_widgetTabs.contains(focused))
+ {
+ kdDebug(9000) << " focused is in m_widgets and m_widgetTabs" << endl;
+ DTabWidget *tab = m_widgetTabs[focused];
+ if (tab->indexOf(focused) >= 0)
+ m_activeTabWidget = tab;
+ kdDebug(9000) << " tab: " << tab << endl;
+ }*/
+}
+
+DTabWidget *DMainWindow::createTab()
+{
+ DTabWidget *tab = new DTabWidget(m_central);
+ m_tabs.append(tab);
+ if (tab->closeButton())
+ connect(tab->closeButton(), SIGNAL(clicked()), this, SLOT(closeTab()));
+ connect(tab, SIGNAL(closeRequest(QWidget*)), this, SLOT(closeTab(QWidget*)));
+ connect(tab, SIGNAL(contextMenu(QWidget*,const QPoint &)),
+ this, SLOT(tabContext(QWidget*,const QPoint &)));
+ return tab;
+}
+
+bool DMainWindow::eventFilter(QObject *obj, QEvent *ev)
+{
+ QWidget *w = (QWidget*)obj;
+ if (!m_widgets.contains(w))
+ return KParts::MainWindow::eventFilter(obj, ev);
+
+ if ((m_currentWidget != w) && (ev->type() == QEvent::FocusIn))
+ {
+ m_currentWidget = w;
+ emit widgetChanged(w);
+ }
+ else if (ev->type() == QEvent::IconChange)
+ {
+ if (m_widgetTabs.contains(w))
+ {
+ DTabWidget *tab = m_widgetTabs[w];
+ tab->setTabIconSet(w, w->icon() ? (*(w->icon())) : QPixmap());
+ }
+ }
+ else if (ev->type() == QEvent::CaptionChange)
+ {
+ kdDebug(9000) << "caption change" << endl;
+ DTabWidget *tab = m_widgetTabs[w];
+ tab->changeTab(w, w->caption());
+ }
+
+ return KParts::MainWindow::eventFilter(obj, ev);
+}
+
+void DMainWindow::closeTab()
+{
+ //nothing to do here, should be reimplemented
+}
+
+void DMainWindow::tabContext(QWidget *, const QPoint &)
+{
+ //nothing to do here, should be reimplemented
+}
+
+void DMainWindow::closeTab(QWidget *)
+{
+ //nothing to do here, should be reimplemented
+}
+
+void DMainWindow::moveWidget(DDockWindow::Position position, QWidget * view, const QString & title)
+{
+ if (m_docks.contains(view))
+ {
+ toolWindow(m_docks[view])->removeWidget(view);
+
+ toolWindow(position)->addWidget( title, view, true );
+ m_docks[view] = position;
+ }
+}
+
+void DMainWindow::addDockWidget(DDockWindow::Position position, QWidget *view, const QString &title)
+{
+ DDockWindow* dock = toolWindow(position);
+ dock->addWidget(title, view);
+ m_docks[view] = position;
+ connect(view, SIGNAL(destroyed()), this, SLOT(widgetDestroyed()));
+ if (dock->isHidden())
+ dock->show();
+}
+
+void DMainWindow::removeDockWidget(QWidget *view)
+{
+ DDockWindow* dock = toolWindow(m_docks[view]);
+ dock->removeWidget(view);
+ m_docks.remove(view);
+ if (!dock->hasWidgets())
+ dock->hide();
+}
+
+bool DMainWindow::hasDockWidget(QWidget *view)
+{
+ return m_docks.contains(view);
+}
+
+DDockWindow::Position DMainWindow::dockWidgetPosition(QWidget *view)
+{
+ return m_docks[view];
+}
+
+void DMainWindow::widgetDestroyed()
+{
+ QWidget *w = static_cast<QWidget*>(const_cast<QObject*>(sender()));
+
+ if (m_docks.contains(w))
+ {
+ kdError() << "Widget destroyed before being removed from UI!" << endl;
+ m_docks.remove(w);
+ }
+}
+
+#include "dmainwindow.moc"
+
+// kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on
diff --git a/apps/ktorrent/newui/dmainwindow.h b/apps/ktorrent/newui/dmainwindow.h
new file mode 100644
index 0000000..326d0c0
--- /dev/null
+++ b/apps/ktorrent/newui/dmainwindow.h
@@ -0,0 +1,113 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef DMAINWINDOW_H
+#define DMAINWINDOW_H
+
+#include <kxmlguiclient.h>
+#include <kparts/mainwindow.h>
+
+#include "ddockwindow.h"
+
+class DTabWidget;
+namespace Ideal {
+ class DockSplitter;
+}
+
+/**Main window which provides simplified IDEA mode.*/
+class DMainWindow: public KParts::MainWindow {
+ Q_OBJECT
+public:
+ DMainWindow(QWidget *parent = 0, const char *name = 0);
+ virtual ~DMainWindow();
+
+ /**@return The tool window in given @p position.*/
+ DDockWindow *toolWindow(DDockWindow::Position position) const;
+
+ /**Adds a tabbed widget into the active (focused) tab widget.
+ If @p widget is null then only tab is created.*/
+ virtual void addWidget(QWidget *widget, const QString &title);
+ virtual void addWidget(DTabWidget *tab, QWidget *widget, const QString &title);
+ /**Removes widget. Does not delete it.*/
+ virtual void removeWidget(QWidget *widget);
+ /**Moves a widget from an existing dockposition to a new position**/
+ virtual void moveWidget(DDockWindow::Position newPosition, QWidget *widget, const QString & title);
+
+ /**Adds a dock widget into given position.*/
+ virtual void addDockWidget(DDockWindow::Position position, QWidget *view, const QString &title);
+ /**Removes a dock widget.*/
+ virtual void removeDockWidget(QWidget *view);
+
+ virtual void saveSettings();
+
+ bool hasDockWidget(QWidget *view);
+ DDockWindow::Position dockWidgetPosition(QWidget *view);
+
+public slots:
+ DTabWidget *splitHorizontal();
+ DTabWidget *splitVertical();
+
+protected slots:
+ /**This does nothing. Reimplement in subclass to close the tab
+ when corner close button is pressed.*/
+ virtual void closeTab();
+ /**This does nothing. Reimplement in subclass to close the tab
+ when hover close button is pressed.*/
+ virtual void closeTab(QWidget*);
+ /**This does nothing. Reimplement in subclass to show tab context menu.*/
+ virtual void tabContext(QWidget*,const QPoint &);
+
+ void widgetDestroyed();
+
+signals:
+ void widgetChanged(QWidget *);
+
+protected:
+ bool eventFilter(QObject *obj, QEvent *ev);
+
+ virtual void loadSettings();
+
+ virtual void createToolWindows();
+ virtual DTabWidget *createTab();
+
+ DDockWindow *m_leftDock;
+ DDockWindow *m_rightDock;
+ DDockWindow *m_bottomDock;
+
+ QMap<QWidget*, DDockWindow::Position> m_docks;
+
+ Ideal::DockSplitter *m_central;
+ DTabWidget *m_activeTabWidget;
+
+ QValueList<DTabWidget*> m_tabs;
+
+ bool m_openTabAfterCurrent;
+ bool m_showIconsOnTabs;
+ bool m_firstRemoved;
+
+ QValueList<QWidget*> m_widgets;
+ QMap<QWidget*, DTabWidget*> m_widgetTabs;
+ QWidget *m_currentWidget;
+
+private slots:
+ void invalidateActiveTabWidget();
+
+};
+
+#endif
diff --git a/apps/ktorrent/newui/docksplitter.cpp b/apps/ktorrent/newui/docksplitter.cpp
new file mode 100644
index 0000000..46212f6
--- /dev/null
+++ b/apps/ktorrent/newui/docksplitter.cpp
@@ -0,0 +1,175 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "docksplitter.h"
+
+#include <kdebug.h>
+
+namespace Ideal {
+
+DockSplitter::DockSplitter(Orientation orientation, QWidget *parent, const char *name)
+ :QSplitter(parent, name), m_orientation(orientation)
+{
+ switch (m_orientation)
+ {
+ case Horizontal:
+ setOrientation(Vertical);
+ break;
+ case Vertical:
+ setOrientation(Horizontal);
+ break;
+ }
+ setOpaqueResize(true);
+ appendSplitter();
+}
+
+DockSplitter::~DockSplitter()
+{
+}
+
+void DockSplitter::addDock(uint row, uint col, QWidget *dock)
+{
+ if (m_docks.count() <= row)
+ for (uint i = m_docks.count(); i <= row ; ++i)
+ m_docks.append(QValueList<QWidget*>());
+
+ if (m_docks[row].count() <= col)
+ {
+ for (uint i = m_docks[row].count(); i <= col ; ++i)
+ m_docks[row].append(0);
+ m_docks[row][col] = dock;
+ }
+ else if (m_docks[row][col] == 0)
+ m_docks[row][col] = dock;
+ else
+ m_docks[row].insert(m_docks[row].at(col), dock);
+
+ if (m_splitters.count() <= row)
+ createSplitters(row);
+ QSplitter *splitter = m_splitters[row];
+
+ dock->reparent(splitter, QPoint(0,0), true);
+ if (col < m_docks[row].count()-1)
+ shiftWidgets(splitter, row, col+1);
+}
+
+void DockSplitter::appendSplitter()
+{
+ switch (m_orientation)
+ {
+ case Horizontal:
+ m_splitters.append(new QSplitter(Horizontal, this));
+ break;
+ case Vertical:
+ m_splitters.append(new QSplitter(Vertical, this));
+ break;
+ }
+ m_splitters[m_splitters.size()-1]->setOpaqueResize(true);
+ m_splitters[m_splitters.size()-1]->show();
+}
+
+void DockSplitter::createSplitters(uint index)
+{
+ kdDebug(9000) << "DockSplitter::createSplitters index = " << index << " count = " << m_splitters.count() << endl;
+ for (uint i = m_splitters.count(); i <= index; ++i)
+ {
+ kdDebug(9000) << " appendSplitter..." << endl;
+ appendSplitter();
+ }
+}
+
+void DockSplitter::removeDock(uint row, uint col, bool alsoDelete)
+{
+ if ((row >= m_docks.count()) || (col >= m_docks[row].count()))
+ return;
+
+ QWidget *w = m_docks[row][col];
+ m_docks[row].remove(m_docks[row].at(col));
+
+ if (alsoDelete)
+ {
+ delete w;
+ w = 0;
+ }
+ else
+ {
+ w->reparent(0, QPoint(0,0), false);
+ w->hide();
+ }
+
+ m_splitters[row]->setMinimumSize(m_splitters[row]->minimumSizeHint());
+
+ if (isRowEmpty(row))
+ {
+ m_docks.remove(m_docks.at(row));
+ delete m_splitters[row];
+ m_splitters[row] = 0;
+ m_splitters.remove(m_splitters.at(row));
+ }
+}
+
+bool DockSplitter::isRowEmpty(int row)
+{
+ if (m_docks[row].count() == 0)
+ return true;
+ for (uint i = 0; i < m_docks[row].count(); ++i)
+ if (m_docks[row][i] != 0)
+ return false;
+ return true;
+}
+
+void DockSplitter::shiftWidgets(QSplitter *splitter, uint row, uint fromCol)
+{
+ kdDebug(9000) << "shiftWidgets: row=" << row << " from col=" << fromCol << endl;
+ kdDebug(9000) << "row size is: " << m_docks[row].count() << endl;
+
+ for (uint i = fromCol; i < m_docks[row].count(); ++i)
+ {
+ kdDebug(9000) << "move from " << i << " to last" << endl;
+ if (m_docks[row][i])
+ splitter->moveToLast(m_docks[row][i]);
+ else
+ kdDebug(9000) << "m_docks[" << row << "][" << i << "] is 0" << endl;
+ }
+}
+
+int DockSplitter::numRows() const
+{
+ return m_docks.count();
+}
+
+int DockSplitter::numCols(int row) const
+{
+ if (row < numRows())
+ return m_docks[row].count();
+ return 0;
+}
+
+QPair<uint, uint> DockSplitter::indexOf(QWidget *dock)
+{
+ for (uint i = 0; i < m_docks.count(); ++i)
+ for (uint j = 0; j < m_docks[i].count(); ++j)
+ if (dock == m_docks[i][j])
+ return qMakePair(i, j);
+ return qMakePair(0u, 0u);
+}
+
+}
+
+#include "docksplitter.moc"
diff --git a/apps/ktorrent/newui/docksplitter.h b/apps/ktorrent/newui/docksplitter.h
new file mode 100644
index 0000000..214ad52
--- /dev/null
+++ b/apps/ktorrent/newui/docksplitter.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2004 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef IDEALDOCKSPLITTER_H
+#define IDEALDOCKSPLITTER_H
+
+#include <qsplitter.h>
+#include <qvaluelist.h>
+
+namespace Ideal {
+
+class DockWidget;
+
+/**
+@short Splitter for docks
+*/
+class DockSplitter: public QSplitter {
+ Q_OBJECT
+public:
+ DockSplitter(Orientation orientation, QWidget *parent = 0, const char *name = 0);
+ ~DockSplitter();
+
+ void addDock(uint row, uint col, QWidget *dock);
+ void removeDock(uint row, uint col, bool alsoDelete = false);
+
+ QPair<uint, uint> indexOf(QWidget *dock);
+
+ int numRows() const;
+ int numCols(int row) const;
+
+protected:
+ void appendSplitter();
+ void createSplitters(uint index);
+ void shiftWidgets(QSplitter *splitter, uint row, uint fromCol);
+
+ bool isRowEmpty(int row);
+
+private:
+ Orientation m_orientation;
+ QValueList<QSplitter*> m_splitters;
+ QValueList<QValueList<QWidget*> > m_docks;
+};
+
+}
+
+#endif
diff --git a/apps/ktorrent/newui/dtabwidget.cpp b/apps/ktorrent/newui/dtabwidget.cpp
new file mode 100644
index 0000000..2bfd188
--- /dev/null
+++ b/apps/ktorrent/newui/dtabwidget.cpp
@@ -0,0 +1,111 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#include "dtabwidget.h"
+
+#include <qtoolbutton.h>
+#include <qtabbar.h>
+
+#include <kconfig.h>
+#include <kiconloader.h>
+#include <kapplication.h>
+
+DTabWidget::DTabWidget(QWidget *parent, const char *name)
+ :KTabWidget(parent, name), m_closeButton(0)
+{
+ setFocusPolicy(NoFocus);
+ setMargin(0);
+
+ loadSettings();
+
+ if (!m_tabBarShown)
+ tabBar()->hide();
+ else {
+ m_closeButton = new QToolButton(this);
+ m_closeButton->setIconSet(SmallIconSet("tab_remove"));
+ m_closeButton->adjustSize();
+ m_closeButton->hide();
+ setCornerWidget(m_closeButton, TopRight);
+
+ if (m_closeOnHover)
+ setHoverCloseButton(true);
+
+ setTabReorderingEnabled(true);
+ }
+
+ connect(this, SIGNAL(currentChanged(QWidget*)), this, SLOT(setFocus(QWidget*)));
+// connect(this, SIGNAL(currentChanged(QWidget*)), this, SLOT(updateHistory(QWidget*)));
+}
+
+void DTabWidget::loadSettings()
+{
+ /*
+ KConfig *config = kapp->config();
+ config->setGroup("UI");
+// m_tabBarShown = config->readBoolEntry("TabBarShown", true);
+ m_tabBarShown = ! config->readNumEntry("TabWidgetVisibility", 0);
+ m_closeOnHover = config->readBoolEntry("CloseOnHover", false);
+ m_closeButtonShown = config->readBoolEntry("ShowCloseTabsButton", true);
+ //we do not delay hover close buttons - that looks and feels ugly
+ setHoverCloseButtonDelayed(false);
+ */
+ m_tabBarShown = true;
+ m_closeOnHover = false;
+ m_closeButtonShown = true;
+}
+
+void DTabWidget::saveSettings()
+{
+}
+
+QToolButton *DTabWidget::closeButton() const
+{
+ return m_closeButton;
+}
+
+void DTabWidget::setFocus(QWidget *w)
+{
+ if (w)
+ w->setFocus();
+}
+
+void DTabWidget::insertTab(QWidget *child, const QString &label, int index)
+{
+ if (m_closeButton && m_closeButtonShown)
+ m_closeButton->show();
+ KTabWidget::insertTab(child, label, index);
+ if (index != -1) tabBar()->repaint();
+}
+
+void DTabWidget::insertTab(QWidget *child, const QIconSet &iconset,
+ const QString &label, int index)
+{
+ if (m_closeButton && m_closeButtonShown)
+ m_closeButton->show();
+ KTabWidget::insertTab(child, iconset, label, index);
+ if (index != -1) tabBar()->repaint();
+}
+
+/*void DTabWidget::updateHistory(QWidget *w)
+{
+ if (m_history.top() != w)
+ m_history.push(w);
+}*/
+
+#include "dtabwidget.moc"
diff --git a/apps/ktorrent/newui/dtabwidget.h b/apps/ktorrent/newui/dtabwidget.h
new file mode 100644
index 0000000..4f51e47
--- /dev/null
+++ b/apps/ktorrent/newui/dtabwidget.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Alexander Dymo *
+ * adymo@kdevelop.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU Library 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 Library 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. *
+ ***************************************************************************/
+#ifndef DTABWIDGET_H
+#define DTABWIDGET_H
+
+#include <ktabwidget.h>
+
+class QToolButton;
+
+class DTabWidget: public KTabWidget {
+ Q_OBJECT
+public:
+ DTabWidget(QWidget *parent=0, const char *name=0);
+
+ /**@return The close button at the top right corner.
+ May be 0 if the configuration do not allow close buttons or the tabbar.*/
+ QToolButton *closeButton() const;
+
+ virtual void insertTab(QWidget *child, const QString &label, int index = -1 );
+ virtual void insertTab(QWidget *child, const QIconSet &iconset,
+ const QString &label, int index = -1);
+
+protected:
+ virtual void loadSettings();
+ virtual void saveSettings();
+
+private slots:
+ void setFocus(QWidget *w);
+// void updateHistory(QWidget *w);
+
+private:
+ bool m_tabBarShown;
+ bool m_closeOnHover;
+ bool m_closeButtonShown;
+
+ QToolButton *m_closeButton;
+// QValueStack<QWidget*> *m_history;
+
+};
+
+#endif
diff --git a/apps/ktorrent/pastedialog.cpp b/apps/ktorrent/pastedialog.cpp
new file mode 100644
index 0000000..aa0095a
--- /dev/null
+++ b/apps/ktorrent/pastedialog.cpp
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 "pastedialog.h"
+#include "ktorrentcore.h"
+#include <kpushbutton.h>
+#include <kstdguiitem.h>
+#include <qclipboard.h>
+#include <qapplication.h>
+#include <kurl.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+
+PasteDialog::PasteDialog(KTorrentCore* core, QWidget *parent, const char *name)
+ :PasteDlgBase(parent, name)
+{
+ m_core = core;
+ QClipboard *cb = QApplication::clipboard();
+ QString text = cb->text(QClipboard::Clipboard);
+ KURL url = KURL::fromPathOrURL(text);
+ if ( url.isValid() )
+ m_url->setText(url.url());
+
+ btnOK->setGuiItem(KStdGuiItem::ok());
+ btnCancel->setGuiItem(KStdGuiItem::cancel());
+}
+
+void PasteDialog::btnOK_clicked()
+{
+ KURL url = KURL::fromPathOrURL(m_url->text());
+ if ( url.isValid() )
+ {
+ m_core->load(url);
+ QDialog::accept();
+ }
+ else
+ {
+ KMessageBox::error(this,i18n("Malformed URL."));
+ }
+}
+
+
+
+#include "pastedialog.moc"
diff --git a/apps/ktorrent/pastedialog.h b/apps/ktorrent/pastedialog.h
new file mode 100644
index 0000000..83b783d
--- /dev/null
+++ b/apps/ktorrent/pastedialog.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 PASTEDIALOG_H
+#define PASTEDIALOG_H
+
+#include "pastedlgbase.h"
+class KTorrentCore;
+
+/**
+ * @author Ivan Vasic
+ * @brief Torrent URL paste dialog
+ **/
+class PasteDialog: public PasteDlgBase
+{
+ Q_OBJECT
+public slots:
+ virtual void btnOK_clicked();
+
+ public:
+ PasteDialog(KTorrentCore* core, QWidget *parent = 0, const char *name = 0);
+
+ private:
+ KTorrentCore* m_core;
+};
+
+#endif
diff --git a/apps/ktorrent/pastedlgbase.ui b/apps/ktorrent/pastedlgbase.ui
new file mode 100644
index 0000000..0d3b813
--- /dev/null
+++ b/apps/ktorrent/pastedlgbase.ui
@@ -0,0 +1,142 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PasteDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>PasteDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>467</width>
+ <height>84</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Paste URL</string>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>URL:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_url</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>400</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>297</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnOK</cstring>
+ </property>
+ <property name="text">
+ <string>O&amp;K</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnCancel</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;ancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>btnOK</sender>
+ <signal>clicked()</signal>
+ <receiver>PasteDlgBase</receiver>
+ <slot>btnOK_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>PasteDlgBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>btnOK_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/pref.cpp b/apps/ktorrent/pref.cpp
new file mode 100644
index 0000000..c1937f6
--- /dev/null
+++ b/apps/ktorrent/pref.cpp
@@ -0,0 +1,508 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kstandarddirs.h>
+#include <kactivelabel.h>
+#include <kglobal.h>
+#include <kcombobox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <knuminput.h>
+#include <kurlrequester.h>
+#include <kurl.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <klineedit.h>
+#include <qlistview.h>
+#include <torrent/globals.h>
+#include <util/functions.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <qdir.h>
+#include <qslider.h>
+#include <kresolver.h>
+
+#include "downloadpref.h"
+#include "generalpref.h"
+#include "pref.h"
+#include "downloadpref.h"
+#include "advancedpref.h"
+#include "settings.h"
+#include "ktorrent.h"
+
+
+using namespace bt;
+
+using namespace KNetwork;
+
+
+KTorrentPreferences::KTorrentPreferences(KTorrent & ktor)
+ : KDialogBase(IconList, i18n("Preferences"), Ok | Apply | Cancel, Ok), ktor(ktor)
+{
+ validation_err = false;
+ enableButtonSeparator(true);
+
+ page_one = new DownloadPrefPage();
+ page_two = new GeneralPrefPage();
+ page_three = new AdvancedPrefPage();
+ addPrefPage(page_one);
+ addPrefPage(page_two);
+ addPrefPage(page_three);
+}
+
+KTorrentPreferences::~KTorrentPreferences()
+{
+ delete page_one;
+ delete page_two;
+ delete page_three;
+}
+
+void KTorrentPreferences::slotOk()
+{
+ slotApply();
+
+ if (!validation_err)
+ accept();
+}
+
+void KTorrentPreferences::slotApply()
+{
+ validation_err = false;
+ QMap<kt::PrefPageInterface*, QFrame*>::iterator i = pages.begin();
+
+ while (i != pages.end())
+ {
+ kt::PrefPageInterface* p = i.key();
+
+ if (!p->apply())
+ {
+ validation_err = true;
+ return;
+ }
+
+ i++;
+ }
+
+ Settings::writeConfig();
+
+ ktor.applySettings(true);
+}
+
+void KTorrentPreferences::updateData()
+{
+ QMap<kt::PrefPageInterface*, QFrame*>::iterator i = pages.begin();
+
+ while (i != pages.end())
+ {
+ kt::PrefPageInterface* p = i.key();
+ p->updateData();
+ i++;
+ }
+}
+
+void KTorrentPreferences::addPrefPage(kt::PrefPageInterface* prefInterface)
+{
+ QFrame* frame = addPage(prefInterface->getItemName(), prefInterface->getHeader(), prefInterface->getPixmap());
+ QVBoxLayout* vbox = new QVBoxLayout(frame);
+ vbox->setAutoAdd(true);
+ prefInterface->createWidget(frame);
+
+ pages.insert(prefInterface, frame);
+}
+
+void KTorrentPreferences::removePrefPage(kt::PrefPageInterface* pp)
+{
+ if (!pages.contains(pp))
+ return;
+
+ QFrame* fr = pages[pp];
+
+ pages.remove(pp);
+
+ pp->deleteWidget();
+
+ delete fr;
+}
+
+///////////////////////////////////////////////////////
+
+DownloadPrefPage::DownloadPrefPage() : kt::PrefPageInterface(i18n("Downloads"), i18n("Download Options"), KGlobal::iconLoader()->loadIcon("down", KIcon::NoGroup)), dp(0)
+{}
+
+DownloadPrefPage::~ DownloadPrefPage()
+{
+ delete dp;
+}
+
+void DownloadPrefPage::createWidget(QWidget* parent)
+{
+ dp = new DownloadPref(parent);
+ updateData();
+}
+
+bool DownloadPrefPage::apply()
+{
+ Settings::setMaxDownloads(dp->max_downloads->value());
+ Settings::setMaxSeeds(dp->max_seeds->value());
+ Settings::setStartDownloadsOnLowDiskSpace(dp->cmbDiskSpace->currentItem());
+ Settings::setMaxConnections(dp->max_conns->value());
+ Settings::setMaxTotalConnections(dp->max_total_conns->value());
+ Settings::setMaxUploadRate(dp->max_upload_rate->value());
+ Settings::setMaxDownloadRate(dp->max_download_rate->value());
+ Settings::setMaxRatio(dp->num_max_ratio->value());
+ Settings::setKeepSeeding(dp->keep_seeding->isChecked());
+ Settings::setPort(dp->port->value());
+ Settings::setNumUploadSlots(dp->num_upload_slots->value());
+ Settings::setMinDiskSpace(dp->intMinDiskSpace->value());
+ Settings::setMaxSeedTime(dp->max_seed_time->value());
+
+ if (Settings::dhtSupport() && dp->udp_tracker_port->value() == Settings::dhtPort())
+ {
+ QString msg = i18n("The DHT port needs to be different from the UDP tracker port!");
+ KMessageBox::error(0, msg, i18n("Error"));
+ return false;
+ }
+
+ Settings::setUdpTrackerPort(dp->udp_tracker_port->value());
+
+ return true;
+}
+
+void DownloadPrefPage::updateData()
+{
+ //setMinimumSize(400,400);
+ dp->max_downloads->setValue(Settings::maxDownloads());
+ dp->max_seeds->setValue(Settings::maxSeeds());
+ dp->cmbDiskSpace->setCurrentItem(Settings::startDownloadsOnLowDiskSpace());
+ dp->max_conns->setValue(Settings::maxConnections());
+ dp->max_total_conns->setValue(Settings::maxTotalConnections());
+ dp->max_upload_rate->setValue(Settings::maxUploadRate());
+ dp->max_download_rate->setValue(Settings::maxDownloadRate());
+ dp->num_max_ratio->setValue(Settings::maxRatio());
+ dp->keep_seeding->setChecked(Settings::keepSeeding());
+ dp->udp_tracker_port->setValue(Settings::udpTrackerPort());
+ dp->port->setValue(Settings::port());
+ dp->num_upload_slots->setValue(Settings::numUploadSlots());
+ dp->intMinDiskSpace->setValue(Settings::minDiskSpace());
+ dp->max_seed_time->setValue(Settings::maxSeedTime());
+}
+
+void DownloadPrefPage::deleteWidget()
+{
+ delete dp;
+ dp = 0;
+}
+
+//////////////////////////////////////
+GeneralPrefPage::GeneralPrefPage() :
+ kt::PrefPageInterface(i18n("General"), i18n("General Options"),
+ KGlobal::iconLoader()->loadIcon("package_settings", KIcon::NoGroup)), gp(0)
+{}
+
+GeneralPrefPage::~GeneralPrefPage()
+{
+ delete gp;
+}
+
+void GeneralPrefPage::createWidget(QWidget* parent)
+{
+ gp = new GeneralPref(parent);
+ updateData();
+ connect(gp->custom_ip_check, SIGNAL(toggled(bool)),
+ this, SLOT(customIPChecked(bool)));
+ connect(gp->use_dht, SIGNAL(toggled(bool)),
+ this, SLOT(dhtChecked(bool)));
+ connect(gp->use_encryption, SIGNAL(toggled(bool)),
+ this, SLOT(useEncryptionChecked(bool)));
+}
+
+bool GeneralPrefPage::apply()
+{
+ Settings::setShowSystemTrayIcon(gp->show_systray_icon->isChecked());
+ Settings::setShowSpeedBarInTrayIcon(gp->show_speedbar->isChecked());
+ Settings::setDownloadBandwidth(gp->downloadBandwidth->value());
+ Settings::setUploadBandwidth(gp->uploadBandwidth->value());
+ Settings::setShowPopups(gp->show_popups->isChecked());
+ QString ourl = Settings::tempDir();
+
+ KURLRequester* u = gp->temp_dir;
+
+ if (ourl != u->url())
+ {
+ Settings::setTempDir(u->url());
+ }
+
+ Settings::setSaveDir(gp->autosave_location->url());
+
+ bool useSaveDir = gp->autosave_downloads_check->isChecked();
+ Settings::setUseSaveDir(useSaveDir);
+
+ //check completed dir
+ Settings::setCompletedDir(gp->urlCompletedDir->url());
+
+ bool useCompletedDir = gp->checkCompletedDir->isChecked();
+ Settings::setUseCompletedDir(useCompletedDir);
+
+ //.torrent copy dir
+ bool useTorrentCopyDir = gp->checkTorrentDir->isChecked();
+ Settings::setUseTorrentCopyDir(useTorrentCopyDir);
+ Settings::setTorrentCopyDir(gp->urlTorrentDir->url());
+
+ bool useExternalIP = gp->custom_ip_check->isChecked();
+
+ Settings::setUseExternalIP(useExternalIP);
+ QString externalIP = gp->custom_ip->text();
+ Settings::setExternalIP(externalIP);
+
+ if (useExternalIP)
+ {
+
+ KResolverResults res = KResolver::resolve(externalIP, QString::null);
+
+ if (res.error())
+ {
+ QString err = KResolver::errorString(res.error());
+ QString msg = i18n("Cannot lookup %1: %2\n"
+ "Please provide a valid IP address or hostname.").arg(externalIP).arg(err);
+ KMessageBox::error(0, msg, i18n("Error"));
+ return false;
+ }
+ }
+
+
+
+ if (gp->use_dht->isChecked() && gp->dht_port->value() == Settings::udpTrackerPort())
+ {
+ QString msg = i18n("The DHT port needs to be different from the UDP tracker port!");
+ KMessageBox::error(0, msg, i18n("Error"));
+ return false;
+ }
+
+ Settings::setDhtSupport(gp->use_dht->isChecked());
+
+ Settings::setDhtPort(gp->dht_port->value());
+ Settings::setUseEncryption(gp->use_encryption->isChecked());
+ Settings::setAllowUnencryptedConnections(gp->allow_unencrypted->isChecked());
+ return true;
+}
+
+void GeneralPrefPage::useEncryptionChecked(bool on)
+{
+ gp->allow_unencrypted->setEnabled(on);
+}
+
+void GeneralPrefPage::autosaveChecked(bool on)
+{
+ gp->autosave_location->setEnabled(on);
+}
+
+void GeneralPrefPage::customIPChecked(bool on)
+{
+ gp->custom_ip->setEnabled(on);
+ gp->custom_ip_label->setEnabled(on);
+}
+
+void GeneralPrefPage::dhtChecked(bool on)
+{
+ gp->dht_port->setEnabled(on);
+ gp->dht_port_label->setEnabled(on);
+}
+
+void GeneralPrefPage::updateData()
+{
+ gp->show_systray_icon->setChecked(Settings::showSystemTrayIcon());
+ gp->show_speedbar->setChecked(Settings::showSpeedBarInTrayIcon());
+ gp->downloadBandwidth->setValue(Settings::downloadBandwidth());
+ gp->uploadBandwidth->setValue(Settings::uploadBandwidth());
+ gp->show_popups->setChecked(Settings::showPopups());
+ KURLRequester* u = gp->temp_dir;
+ u->fileDialog()->setMode(KFile::Directory);
+
+ if (Settings::tempDir() == QString::null)
+ {
+ QString data_dir = KGlobal::dirs()->saveLocation("data", "ktorrent");
+
+ if (!data_dir.endsWith(bt::DirSeparator()))
+ data_dir += bt::DirSeparator();
+
+ u->setURL(data_dir);
+ }
+ else
+ {
+ u->setURL(Settings::tempDir());
+ }
+
+ u = gp->autosave_location;
+
+ u->fileDialog()->setMode(KFile::Directory);
+
+ bool useSaveDir = Settings::useSaveDir();
+ QString saveDir = Settings::saveDir();
+
+ gp->autosave_downloads_check->setChecked(useSaveDir);
+ u->setEnabled(useSaveDir);
+
+ u->setURL(!saveDir.isEmpty() ? saveDir : QDir::homeDirPath());
+
+
+ //completed dir
+ u = gp->urlCompletedDir;
+ u->fileDialog()->setMode(KFile::Directory);
+ bool useCompletedDir = Settings::useCompletedDir();
+ QString completedDir = Settings::completedDir();
+ gp->checkCompletedDir->setChecked(useCompletedDir);
+ u->setEnabled(useCompletedDir);
+ u->setURL(!completedDir.isEmpty() ? completedDir : QDir::homeDirPath());
+
+ //copy .torrent dir
+ u = gp->urlTorrentDir;
+ u->fileDialog()->setMode(KFile::Directory);
+ bool useTorrentDir = Settings::useTorrentCopyDir();
+ QString torrentDir = Settings::torrentCopyDir();
+ gp->checkTorrentDir->setChecked(useTorrentDir);
+ u->setEnabled(useTorrentDir);
+ u->setURL(!torrentDir.isEmpty() ? torrentDir : QDir::homeDirPath());
+
+
+ gp->custom_ip->setText(Settings::externalIP());
+
+ bool useExternalIP = Settings::useExternalIP();
+ gp->custom_ip_check->setChecked(useExternalIP);
+ gp->custom_ip->setEnabled(useExternalIP);
+ gp->custom_ip_label->setEnabled(useExternalIP);
+
+ gp->use_dht->setChecked(Settings::dhtSupport());
+ gp->dht_port->setValue(Settings::dhtPort());
+ gp->dht_port->setEnabled(Settings::dhtSupport());
+ gp->dht_port_label->setEnabled(Settings::dhtSupport());
+
+ gp->use_encryption->setChecked(Settings::useEncryption());
+ gp->allow_unencrypted->setChecked(Settings::allowUnencryptedConnections());
+ gp->allow_unencrypted->setEnabled(Settings::useEncryption());
+}
+
+void GeneralPrefPage::deleteWidget()
+{
+ delete gp;
+ gp = 0;
+}
+
+/////////////////////////////////
+
+AdvancedPrefPage::AdvancedPrefPage() :
+ kt::PrefPageInterface(i18n("Advanced"), i18n("Advanced Options"),
+ KGlobal::iconLoader()->loadIcon("package_settings", KIcon::NoGroup)), ap(0)
+{}
+
+AdvancedPrefPage::~AdvancedPrefPage()
+{
+ delete ap;
+}
+
+bool AdvancedPrefPage::apply()
+{
+ Settings::setMemoryUsage(ap->mem_usage->currentItem());
+ Settings::setGuiUpdateInterval(ap->gui_interval->currentItem());
+ Settings::setDSCP(ap->dscp->value());
+ Settings::setAllwaysDoUploadDataCheck(!ap->no_recheck->isChecked());
+ Settings::setMaxSizeForUploadDataCheck(ap->recheck_size->value());
+ Settings::setAutoRecheck(ap->auto_recheck->isChecked());
+ Settings::setMaxCorruptedBeforeRecheck(ap->num_corrupted->value());
+ Settings::setDoNotUseKDEProxy(ap->do_not_use_kde_proxy->isChecked());
+ Settings::setHttpTrackerProxy(ap->http_proxy->text());
+ Settings::setEta(ap->eta->currentItem());
+ Settings::setFullDiskPrealloc(ap->full_prealloc->isChecked());
+ Settings::setFullDiskPreallocMethod(ap->full_prealloc_method->currentItem());
+ Settings::setCpuUsage(ap->cpu_usage->value());
+ Settings::setDiskPrealloc(!ap->prealloc_disabled->isChecked());
+ Settings::setMaxConnectingSockets(ap->max_con_setups->value());
+ return true;
+}
+
+void AdvancedPrefPage::updateData()
+{
+ ap->mem_usage->setCurrentItem(Settings::memoryUsage());
+ ap->gui_interval->setCurrentItem(Settings::guiUpdateInterval());
+ ap->dscp->setValue(Settings::dSCP());
+ ap->no_recheck->setChecked(!Settings::allwaysDoUploadDataCheck());
+ ap->recheck_size->setEnabled(!Settings::allwaysDoUploadDataCheck());
+ ap->recheck_size->setValue(Settings::maxSizeForUploadDataCheck());
+ ap->auto_recheck->setChecked(Settings::autoRecheck());
+ ap->num_corrupted->setValue(Settings::maxCorruptedBeforeRecheck());
+ ap->num_corrupted->setEnabled(Settings::autoRecheck());
+ ap->do_not_use_kde_proxy->setChecked(Settings::doNotUseKDEProxy());
+ ap->http_proxy->setText(Settings::httpTrackerProxy());
+ ap->http_proxy->setEnabled(Settings::doNotUseKDEProxy());
+ ap->eta->setCurrentItem(Settings::eta());
+ ap->full_prealloc->setChecked(Settings::fullDiskPrealloc());
+ ap->full_prealloc_method->setCurrentItem(Settings::fullDiskPreallocMethod());
+ ap->cpu_usage->setValue(Settings::cpuUsage());
+ ap->prealloc_disabled->setChecked(!Settings::diskPrealloc());
+ ap->max_con_setups->setValue(Settings::maxConnectingSockets());
+}
+
+void AdvancedPrefPage::createWidget(QWidget* parent)
+{
+ ap = new AdvancedPref(parent);
+ updateData();
+ connect(ap->no_recheck, SIGNAL(toggled(bool)),
+ this, SLOT(noDataCheckChecked(bool)));
+ connect(ap->auto_recheck, SIGNAL(toggled(bool)),
+ this, SLOT(autoRecheckChecked(bool)));
+ connect(ap->do_not_use_kde_proxy, SIGNAL(toggled(bool)),
+ this, SLOT(doNotUseKDEProxyChecked(bool)));
+ connect(ap->prealloc_disabled,SIGNAL(toggled(bool)),
+ this,SLOT(preallocDisabledChecked(bool)));
+
+ preallocDisabledChecked(ap->prealloc_disabled->isChecked());
+}
+
+void AdvancedPrefPage::deleteWidget()
+{
+ delete ap;
+ ap = 0;
+}
+
+void AdvancedPrefPage::noDataCheckChecked(bool on)
+{
+ ap->recheck_size->setEnabled(on);
+}
+
+void AdvancedPrefPage::autoRecheckChecked(bool on)
+{
+ ap->num_corrupted->setEnabled(on);
+}
+
+void AdvancedPrefPage::doNotUseKDEProxyChecked(bool on)
+{
+ ap->http_proxy->setEnabled(on);
+}
+
+void AdvancedPrefPage::preallocDisabledChecked(bool on)
+{
+ ap->full_prealloc->setEnabled(!on);
+ if (!on && ap->full_prealloc->isChecked())
+ ap->full_prealloc_method->setEnabled(true);
+ else
+ ap->full_prealloc_method->setEnabled(false);
+}
+
+#include "pref.moc"
diff --git a/apps/ktorrent/pref.h b/apps/ktorrent/pref.h
new file mode 100644
index 0000000..f8852cd
--- /dev/null
+++ b/apps/ktorrent/pref.h
@@ -0,0 +1,121 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 _KTORRENTPREF_H_
+#define _KTORRENTPREF_H_
+
+#include <kdialogbase.h>
+#include <qframe.h>
+#include <qmap.h>
+#include <interfaces/prefpageinterface.h>
+
+
+class DownloadPref;
+class GeneralPref;
+class AdvancedPref;
+class KTorrent;
+class QListViewItem;
+
+
+class DownloadPrefPage : public kt::PrefPageInterface
+{
+ DownloadPref* dp;
+public:
+ DownloadPrefPage();
+ virtual ~DownloadPrefPage();
+
+ virtual bool apply();
+ virtual void updateData();
+ virtual void createWidget(QWidget* parent);
+ virtual void deleteWidget();
+};
+
+class GeneralPrefPage : public QObject,public kt::PrefPageInterface
+{
+ Q_OBJECT
+ GeneralPref* gp;
+public:
+ GeneralPrefPage();
+ virtual ~GeneralPrefPage();
+
+ virtual bool apply();
+ virtual void updateData();
+ virtual void createWidget(QWidget* parent);
+ virtual void deleteWidget();
+
+private slots:
+ void autosaveChecked(bool on);
+ void customIPChecked(bool on);
+ void dhtChecked(bool on);
+ void useEncryptionChecked(bool on);
+};
+
+class AdvancedPrefPage : public QObject,public kt::PrefPageInterface
+{
+ Q_OBJECT
+
+ AdvancedPref* ap;
+public:
+ AdvancedPrefPage();
+ virtual ~AdvancedPrefPage();
+
+ virtual bool apply();
+ virtual void updateData();
+ virtual void createWidget(QWidget* parent);
+ virtual void deleteWidget();
+
+private slots:
+ void noDataCheckChecked(bool on);
+ void autoRecheckChecked(bool on);
+ void doNotUseKDEProxyChecked(bool on);
+ void preallocDisabledChecked(bool on);
+};
+
+
+class KTorrentPreferences : public KDialogBase
+{
+ Q_OBJECT
+public:
+ KTorrentPreferences(KTorrent & ktor);
+ virtual ~KTorrentPreferences();
+
+ void updateData();
+ void addPrefPage(kt::PrefPageInterface* prefInterface);
+ void removePrefPage(kt::PrefPageInterface* prefInterface);
+private:
+ virtual void slotOk();
+ virtual void slotApply();
+
+
+private:
+ KTorrent & ktor;
+ DownloadPrefPage* page_one;
+ GeneralPrefPage* page_two;
+ AdvancedPrefPage* page_three;
+ QMap<kt::PrefPageInterface*,QFrame*> pages;
+ bool validation_err;
+};
+
+
+
+
+
+#endif // _KTORRENTPREF_H_
diff --git a/apps/ktorrent/queuedialog.cpp b/apps/ktorrent/queuedialog.cpp
new file mode 100644
index 0000000..11a7b95
--- /dev/null
+++ b/apps/ktorrent/queuedialog.cpp
@@ -0,0 +1,391 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "queuedialog.h"
+#include <interfaces/torrentinterface.h>
+#include <interfaces/functions.h>
+#include <torrent/queuemanager.h>
+
+#include <qlistview.h>
+#include <qstring.h>
+#include <qmessagebox.h>
+#include <qptrlist.h>
+#include <qlabel.h>
+#include <qtabwidget.h>
+#include <qgroupbox.h>
+#include <qpushbutton.h>
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kurl.h>
+#include <kiconloader.h>
+#include <ksqueezedtextlabel.h>
+#include <ktabwidget.h>
+#include <kpushbutton.h>
+#include <kiconloader.h>
+
+using namespace bt;
+using namespace kt;
+
+QueueItem::QueueItem(kt::TorrentInterface* t, QListView* parent)
+ :QListViewItem(parent), tc(t)
+{
+ setPriority(tc->getPriority());
+ setText(0, QString(tc->getStats().torrent_name));
+}
+
+int QueueItem::compare(QListViewItem *i, int , bool ) const
+{
+ QueueItem* it = (QueueItem*) i;
+ if(it->getPriority() == torrentPriority)
+ {
+ const TorrentInterface* ti = it->getTC();
+ QString name1 = tc->getStats().torrent_name;
+ QString name2 = ti->getStats().torrent_name;
+ return name1.compare(name2);
+ }
+
+ return it->getPriority() < torrentPriority ? -1 : 1;
+}
+
+void QueueItem::setPriority(int p)
+{
+ torrentPriority = p;
+
+ if(p==0)
+ setText(1, i18n("User"));
+ else
+ setText(1, i18n("Queue Manager"));
+}
+
+void QueueItem::setTorrentPriority(int p)
+{
+ tc->setPriority(p);
+}
+
+void QueueItem::paintCell(QPainter* p,const QColorGroup & cg,int column,int width,int align)
+{
+ QColorGroup colorGrp( cg );
+ QColor txt = colorGrp.text();
+
+ //if (column == 1)
+ if(torrentPriority == 0)
+ colorGrp.setColor(QColorGroup::Text, Qt::gray);
+ else
+ colorGrp.setColor(QColorGroup::Text, txt);
+
+
+ QListViewItem::paintCell(p,colorGrp,column,width,align);
+}
+
+QueueDialog::QueueDialog(bt::QueueManager* qm, QWidget *parent, const char *name)
+ :QueueDlg(parent, name)
+{
+ KIconLoader* iload = KGlobal::iconLoader();
+
+ m_tabs->setTabIconSet(m_tabs->page(0), iload->loadIconSet("down", KIcon::Small));
+ m_tabs->setTabIconSet(m_tabs->page(1), iload->loadIconSet("up", KIcon::Small));
+
+ logo->setPixmap(iload->loadIcon("ktqueuemanager", KIcon::Desktop));
+
+ connect(downloadList, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(downloadList_currentChanged( QListViewItem* )));
+ connect(seedList, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(seedList_currentChanged( QListViewItem* )));
+
+ if(downloadList->firstChild())
+ downloadList->setCurrentItem(downloadList->firstChild());
+
+ if(seedList->firstChild())
+ seedList->setCurrentItem(seedList->firstChild());
+
+ btnMoveUp->setPixmap(iload->loadIcon("up", KIcon::Small));
+ btnMoveDown->setPixmap(iload->loadIcon("down", KIcon::Small));
+
+ this->qman = qm;
+
+ QPtrList<kt::TorrentInterface>::iterator it = qman->begin();
+ for( ; it != qman->end(); ++it)
+ {
+ TorrentInterface* tc = *it;
+ TorrentStatus ts = tc->getStats().status;
+
+ if(ts == kt::SEEDING || ts == kt::DOWNLOAD_COMPLETE ||
+ ts == kt::SEEDING_COMPLETE || tc->getStats().completed)
+ {
+ QueueItem* item = new QueueItem(tc, seedList);
+ seedList->insertItem(item);
+ }
+ else
+ {
+ QueueItem* item = new QueueItem(tc, downloadList);
+ downloadList->insertItem(item);
+ }
+ }
+}
+
+void QueueDialog::btnMoveUp_clicked()
+{
+ QueueItem* current = (QueueItem*) getCurrentList()->selectedItem();
+ if(current == 0)
+ return;
+
+ if(current->getPriority() == 0)
+ return;
+
+ QueueItem* previous = (QueueItem*) current->itemAbove();
+ if(previous == 0)
+ return;
+ else
+ {
+ int tmp = previous->getPriority();
+ previous->setPriority(current->getPriority());
+ current->setPriority(tmp);
+ getCurrentList()->sort();
+ }
+}
+
+void QueueDialog::btnMoveDown_clicked()
+{
+ QueueItem* current = (QueueItem*) getCurrentList()->selectedItem();
+ if(current == 0)
+ return;
+
+ if(current->getPriority() == 0)
+ return;
+
+ QueueItem* previous = (QueueItem*) current->itemBelow();
+ if(previous == 0)
+ return;
+ else
+ {
+ int tmp = previous->getPriority();
+ if(tmp == 0)
+ return;
+ previous->setPriority(current->getPriority());
+ current->setPriority(tmp);
+ getCurrentList()->sort();
+ }
+}
+
+void QueueDialog::btnClose_clicked()
+{
+ this->close();
+}
+
+void QueueDialog::btnEnqueue_clicked()
+{
+ enqueue();
+}
+
+void QueueDialog::btnDequeue_clicked()
+{
+ QueueItem* current = (QueueItem*) getCurrentList()->selectedItem();
+ if(current == 0)
+ return;
+ if(current->getPriority() == 0)
+ return;
+
+ current->setPriority(0);
+ getCurrentList()->sort();
+}
+
+void QueueDialog::enqueue(QueueItem* curr)
+{
+ QueueItem* current = curr == 0 ? (QueueItem*) getCurrentList()->selectedItem() : curr;
+ if(current == 0)
+ return;
+ if(current->getPriority() != 0)
+ return;
+
+ QueueItem* item = (QueueItem*) getCurrentList()->firstChild();
+ if(item == 0)
+ return;
+
+ while(item != 0)
+ {
+ if(item->getPriority() != 0)
+ item->setPriority(item->getPriority() + 1);
+ item = (QueueItem*) item->itemBelow();
+ }
+
+ current->setPriority(1);
+ getCurrentList()->sort();
+}
+
+void QueueDialog::writeQueue()
+{
+ downloadList->sort();
+ seedList->sort();
+
+ int p = 0;
+
+ QueueItem* item = (QueueItem*) downloadList->lastItem();
+ if(item != 0)
+ {
+ while(item != 0)
+ {
+ if(item->getPriority() != 0)
+ item->setTorrentPriority(++p);
+ else
+ item->setTorrentPriority(0);
+ item = (QueueItem*) item->itemAbove();
+ }
+ }
+
+ item = (QueueItem*) seedList->lastItem();
+ if(item == 0)
+ {
+ qman->orderQueue();
+ return;
+ }
+
+ p = 0;
+
+ while(item != 0)
+ {
+ if(item->getPriority() != 0)
+ item->setTorrentPriority(++p);
+ else
+ item->setTorrentPriority(0);
+ item = (QueueItem*) item->itemAbove();
+ }
+ qman->orderQueue();
+}
+
+void QueueDialog::btnApply_clicked()
+{
+ writeQueue();
+}
+
+void QueueDialog::btnOk_clicked()
+{
+ writeQueue();
+ this->close();
+}
+
+QListView* QueueDialog::getCurrentList()
+{
+ return m_tabs->currentPageIndex() == 0 ? downloadList : seedList;
+}
+
+void QueueDialog::downloadList_currentChanged(QListViewItem* item)
+{
+ if(!item)
+ {
+ dlStatus->clear();
+ dlTracker->clear();
+ dlRatio->clear();
+ dlDHT->clear();
+ return;
+ }
+
+ const TorrentInterface* tc = ((QueueItem*)item)->getTC();
+ TorrentStats s = tc->getStats();
+
+ dlStatus->setText(tc->statusToString());
+ dlTracker->setText(tc->getTrackersList()->getTrackerURL().prettyURL());
+ dlRatio->setText(QString("%1").arg((float)s.bytes_uploaded / s.bytes_downloaded,0,'f',2));
+ dlBytes->setText(BytesToString(s.bytes_left_to_download));
+ dlDHT->setText(s.priv_torrent ? i18n("No (private torrent)") : i18n("Yes"));
+}
+
+void QueueDialog::seedList_currentChanged(QListViewItem* item)
+{
+ if(!item)
+ {
+ ulStatus->clear();
+ ulTracker->clear();
+ ulRatio->clear();
+ ulDHT->clear();
+ return;
+ }
+
+ const TorrentInterface* tc = ((QueueItem*)item)->getTC();
+ TorrentStats s = tc->getStats();
+
+ ulStatus->setText(tc->statusToString());
+ ulTracker->setText(tc->getTrackersList()->getTrackerURL().prettyURL());
+ ulRatio->setText(QString("%1").arg((float)s.bytes_uploaded / s.bytes_downloaded,0,'f',2));
+ ulBytes->setText(BytesToString(s.bytes_uploaded));
+ ulDHT->setText(s.priv_torrent ? i18n("No (private torrent)") : i18n("Yes"));
+}
+
+void QueueDialog::btnMoveTop_clicked()
+{
+ QueueItem* current = (QueueItem*) getCurrentList()->selectedItem();
+ if(current == 0)
+ return;
+
+ if(current->getPriority() == 0)
+ return;
+
+ QueueItem* previous = (QueueItem*) current->itemAbove();
+
+ if(previous == 0)
+ return;
+
+ int p = previous->getPriority();
+
+ while(previous != 0)
+ {
+ p = previous->getPriority();
+ previous->setPriority(p - 1);
+
+ previous = (QueueItem*) previous->itemAbove();
+ }
+
+ current->setPriority(p);
+ getCurrentList()->sort();
+}
+
+void QueueDialog::btnMoveBottom_clicked()
+{
+ QueueItem* current = (QueueItem*) getCurrentList()->selectedItem();
+ if(current == 0)
+ return;
+
+ if(current->getPriority() == 0)
+ return;
+
+ QueueItem* previous = (QueueItem*) current->itemBelow();
+
+ if(previous == 0)
+ return;
+
+ if(previous->getPriority() == 0)
+ return;
+
+ int p = previous->getPriority();
+
+ while(previous != 0 && previous->getPriority() != 0)
+ {
+ p = previous->getPriority();
+ previous->setPriority(p + 1);
+
+ previous = (QueueItem*) previous->itemBelow();
+ }
+
+ current->setPriority(p);
+ getCurrentList()->sort();
+}
+
+
+
+#include "queuedialog.moc"
+
diff --git a/apps/ktorrent/queuedialog.h b/apps/ktorrent/queuedialog.h
new file mode 100644
index 0000000..e282867
--- /dev/null
+++ b/apps/ktorrent/queuedialog.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 QUEUEDIALOG_H
+#define QUEUEDIALOG_H
+
+#include "queuedlg.h"
+#include <interfaces/torrentinterface.h>
+#include <torrent/queuemanager.h>
+
+#include <qlistview.h>
+#include <qstring.h>
+
+class QueueItem: public QListViewItem
+{
+ public:
+ QueueItem(kt::TorrentInterface* t, QListView* parent);
+
+ int getPriority() { return torrentPriority; }
+ void setPriority(int p);
+ int compare(QListViewItem *i, int col, bool ascending ) const;
+
+ void setTorrentPriority(int p);
+
+ const kt::TorrentInterface* getTC() { return tc; }
+
+ private:
+ //void updatePriorities(QueueItem* to, bool from_end, int val);
+ void paintCell(QPainter* p,const QColorGroup & cg,int column,int width,int align);
+
+ kt::TorrentInterface* tc;
+ int torrentPriority;
+};
+
+class QueueDialog: public QueueDlg
+{
+ Q_OBJECT
+ public:
+ QueueDialog(bt::QueueManager* qm, QWidget *parent = 0, const char *name = 0);
+ public slots:
+ virtual void btnMoveUp_clicked();
+ virtual void btnClose_clicked();
+ virtual void btnMoveDown_clicked();
+ virtual void btnDequeue_clicked();
+ virtual void btnEnqueue_clicked();
+ virtual void btnApply_clicked();
+ virtual void btnOk_clicked();
+ virtual void seedList_currentChanged(QListViewItem*);
+ virtual void downloadList_currentChanged(QListViewItem*);
+ virtual void btnMoveBottom_clicked();
+ virtual void btnMoveTop_clicked();
+
+
+ private:
+ ///Enqueue item curr
+ void enqueue(QueueItem* curr = 0);
+
+ ///Writes the queue order into QueueManager
+ void writeQueue();
+
+ ///Gets the pointer to currently visible torrentList (download or seed)
+ QListView* getCurrentList();
+
+ bt::QueueManager* qman;
+};
+
+#endif
diff --git a/apps/ktorrent/queuedlg.ui b/apps/ktorrent/queuedlg.ui
new file mode 100644
index 0000000..3ffbe23
--- /dev/null
+++ b/apps/ktorrent/queuedlg.ui
@@ -0,0 +1,726 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>QueueDlg</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>QueueDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>631</width>
+ <height>482</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>KT Queue Dialog</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>m_tabs</cstring>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Downloads</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>InfoDownload</cstring>
+ </property>
+ <property name="title">
+ <string>Info</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout25</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Status:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Tracker:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>DHT:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Share ratio:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Bytes left:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout26</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>dlStatus</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KSqueezedTextLabel">
+ <property name="name">
+ <cstring>dlTracker</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>dlDHT</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>dlRatio</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>dlBytes</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Torrent</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Controlled by</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>downloadList</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>tab</cstring>
+ </property>
+ <attribute name="title">
+ <string>Upload&amp;s</string>
+ </attribute>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView" row="0" column="0">
+ <column>
+ <property name="text">
+ <string>Torrent</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Controlled by</string>
+ </property>
+ <property name="clickable">
+ <bool>false</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>seedList</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>InfoSeed</cstring>
+ </property>
+ <property name="title">
+ <string>Info</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Status:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Tracker:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4_2</cstring>
+ </property>
+ <property name="text">
+ <string>DHT:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Share ratio:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Uploaded:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout27</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ulStatus</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KSqueezedTextLabel">
+ <property name="name">
+ <cstring>ulTracker</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ulDHT</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ulRatio</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>ulBytes</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout49</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer28</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>logo</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer29</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnMoveUp</cstring>
+ </property>
+ <property name="text">
+ <string>M&amp;ove up</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnMoveDown</cstring>
+ </property>
+ <property name="text">
+ <string>Move dow&amp;n</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnMoveTop</cstring>
+ </property>
+ <property name="text">
+ <string>Move to top</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnMoveBottom</cstring>
+ </property>
+ <property name="text">
+ <string>Move to &amp;bottom</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnEnqueue</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;QM Controlled</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnDequeue</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;User Controlled</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnOk</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnApply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>9</number>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnClose</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>2</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4833">789c8597596f23470e80dfe75718c3b7c182e9eabb11ec834fc9873cbeaf601fc86ec9966df994cfc5fef794483633934d10c836fcb9582cde55fee5dbd2d9de68e9db2f5f9ee7349fb64bed153d2d7deb5e66b38fdffef3efff7ef99aa64b8baf2c5b4abffeebcb57dc5c6a9720499290640b8613e110ff22eb941b07657e7256f90be742e4a7c6a9ed076791c7a1732efbd784d3f817615a71167db0e55c0a17ce95c88f8ced3c7e74d6f306cea29fd159f583b3e8a75367d18f5bce8df0b63389be67e3ccfcd97716fd78e22cfaf1d459edefedcbedbc63e75af4cf85b33edeb8616cfef1b5b39eb7e72cf6c28b7166fb53678df7b5b3fadf388b3d503a8b3d40c6b9eaa35767d9cf37c6a5e53f73d6f3769d55bedf5f2789ac6bfcf2de1fda33ce4cdfbb716eeb6fce1acf1de3c2f2bbe7acf573605cdafe2b67f5efd359f20bb97165febe38b3c453fd2bfa7cd0a67165fea97c9db416ff1de3b1e9d77a6d12567bf8c159ed9d1ab7969fc2b8d378e2ba304579c93769bd719457fd524f2184cae221f51bd250a8fd3c35ae4cfec1b8b6fa06e3c6eaffc859d651f215b2d0c7efdab8327b969d459e9e8d7bfd57c68df587c43be4c1e20b685c1b9f0b17c1e283cfce927f96f911ca40d63fcbce7afebd31eb3a91b3fa37376ead9e64dea5759606a94f546eb23499883d9bc69932bef4acf22cf594725c1f8bfca9b3c8d3aa711e82c82bb73de3817111a4fe2171d67e1a1b97ba8e87ce5a8f12bfb48b2cfae8ceb85206894f9666135bff2e5c45d6fae894a3393a3f5be13aaeb7729eca4ff2d6ce3f5b701ef2b1c95f0aa7715dfb4de657519675d0fc8d8c9ba0f527f12faab234fd8fc695f1ab716dfa3f84ebb2089dec5f779678d381711d74beae398b7f540b3751bfd6e39ab1c9033b6bbd07e326687dcb3c2da8ecf47cfa301e9bbe37e389c94b3c0a2edba0f5f361dc194b3c8b36eed77acf9c453fab7f6d95587e6e8d83c957c25dc9668fdc5fc538b2c6e3a6e754e7adcc836252b6a9d69bccffb2ad535d67e98fb2ab538befaab3e8439947e5b84e82f6ffa17165f1bd7096fcc1ccb8b67a981b375a0f20f92d2775b078493dd54c75aaef0de9dfba75167fea2eb2f683dc5771388d753fbe396b7fca7c6b52ea2c5e57ce621fcbfdd26464f1812767ed8f63e3ced665de34c464fe9e1bb3d5b3f45bc3dca67a7fc9fba7697b46a9bf66cc13cb8fcc8b66c2960f3832b6f3988dad1e2828b799c53371d6f9766b9c5b7f4afe286983f5c3aeb3be177ace6c1ecc9cb51f6a678def8a7169f351fca710f5a93d9db3d64febacf9981aa76a2f5e3b6b7d5d1af7f6df3aebfb67e4acf93f72d6f972675cd83c7d77d67cac3bebfdfce9acf7eb87b3c66b665cdabc5feed9f44bfd51caade59395dbc4fc3f33cecc9f9b9e35bf786fdccfffc459e7ffc059eb7fe2acefcfd459df13dbceda5f4367bddffed8affdf0665c243a6f769c351f6367f51f7ad6fcefcf9dd57e72567fd959e3dd3a6bbc3b677daf34ce6affadb3dadbdb57263a5f46ce7adf8e9dd5dededfbe5e2f9cb5de5b678df7bb71a5fa59f767dccf77cd57d6f7136c185b7e79d359f3159cf53df7e8acf19e19f7f57ee5acef9b0d67f5b733b6fa844b63f38f07ceea9fcc3fca5b9bef58199b3dbce5acefa53567bd6fee8c73d54f95b3fa3b34b6fcc3b3b3f6dba1b3f6afe6a788fb6bad9f1f3f08f19b90b18ddff0f3dafefc2fe4bb284948f1b7f1e2e73fca4ff012af708ad77883b77f2f8f33bc8b9aeff1011ff1099f718e2ff88a6ff88e1ff8196da33fc92fe30aaee21aaee3060e70889bb885dbb88323dc8d7a407df941be8dd2dfa3ec5e94dac7033cc4233cc6133cc5333cc78bffb327c18029669863812556d1ef1a9ba8168080a1850ec608daaf30814bb882296ec035dc486426700b33b8837b78c0213cc2133ce367af3f7a93c01c5e700b5ee10d6fe11d093ee01396610556f104d6601d36a2d77abf0da2f41036610bb6b1841d18c12e7c873dd887033884233886133885b318297d3fc558e114cee1021208d1e01432c8a180122aa8e3c5190f2322c63bb507995aea62bc37698c9f34a14bba822d9ad235ddd02dcde80e87744f0f7fc823d1233de1363d634d737aa1577aa3ebf8047ba70ffaa4655aa1555aa375b37f0c298e6923ca0fb0a1212cd3266dd136edd08876e93bedd13e1dd0211d997e88f6031dd3099d624e67744e17f15f8b40296594cb273ef61632aa5ff34515d5d43032707c19449fd6e993db283b8217ee62fc0630fa31bf1cdf037c493bb1724ef98a162d30e56bcae185467cc3b731dfa0f935f919dff13daef1033ff2133fc77d039e73d41da55ff90d268b8afba17ea27d30a18edff9833f7999577895d7a88421aff31b6fc0e04ff5c6314acc031ef2266cc4c7ce036ff12ca66a10ff75d95eacfd2ccf3b0bfd38e651ac93f7d83b77f84e47d1e6f1222e0bf9c5ef3ff7a3f690766f4ffd0490aa85affffbf5cbef985d44a8</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>btnMoveUp</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnMoveUp_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnMoveDown</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnMoveDown_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnEnqueue</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnEnqueue_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnDequeue</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnDequeue_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>downloadList</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>downloadList_currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>seedList</sender>
+ <signal>currentChanged(QListViewItem*)</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>seedList_currentChanged(QListViewItem*)</slot>
+ </connection>
+ <connection>
+ <sender>btnOk</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnOk_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnApply</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnApply_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnClose</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>btnMoveTop</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnMoveTop_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnMoveBottom</sender>
+ <signal>clicked()</signal>
+ <receiver>QueueDlg</receiver>
+ <slot>btnMoveBottom_clicked()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>btnOk</tabstop>
+ <tabstop>btnApply</tabstop>
+ <tabstop>btnClose</tabstop>
+ <tabstop>m_tabs</tabstop>
+ <tabstop>downloadList</tabstop>
+ <tabstop>btnMoveUp</tabstop>
+ <tabstop>btnMoveDown</tabstop>
+ <tabstop>btnEnqueue</tabstop>
+ <tabstop>btnDequeue</tabstop>
+ <tabstop>seedList</tabstop>
+</tabstops>
+<slots>
+ <slot>btnMoveUp_clicked()</slot>
+ <slot>btnMoveDown_clicked()</slot>
+ <slot>btnEnqueue_clicked()</slot>
+ <slot>btnDequeue_clicked()</slot>
+ <slot>downloadList_currentChanged(QListViewItem*)</slot>
+ <slot>seedList_currentChanged(QListViewItem*)</slot>
+ <slot>btnOk_clicked()</slot>
+ <slot>btnApply_clicked()</slot>
+ <slot>btnClose_clicked()</slot>
+ <slot>btnMoveTop_clicked()</slot>
+ <slot>btnMoveBottom_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>ksqueezedtextlabel.h</includehint>
+ <includehint>ksqueezedtextlabel.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/scandialog.cpp b/apps/ktorrent/scandialog.cpp
new file mode 100644
index 0000000..cf04a47
--- /dev/null
+++ b/apps/ktorrent/scandialog.cpp
@@ -0,0 +1,202 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qlabel.h>
+#include <klocale.h>
+#include <kprogress.h>
+#include <kpushbutton.h>
+#include <kstdguiitem.h>
+#include <kmessagebox.h>
+#include <util/error.h>
+#include <torrent/queuemanager.h>
+#include <torrent/torrentcontrol.h>
+
+#include "scandialog.h"
+#include "ktorrentcore.h"
+
+using namespace bt;
+using namespace kt;
+
+
+
+ScanDialog::ScanDialog(KTorrentCore* core,bool auto_import,
+ QWidget* parent, const char* name, bool modal, WFlags fl)
+ : ScanDlgBase(parent,name, modal,fl),DataCheckerListener(auto_import),mutex(true),core(core)
+{
+ m_cancel->setGuiItem(KStdGuiItem::cancel());
+ connect(m_cancel,SIGNAL(clicked()),this,SLOT(onCancelPressed()));
+ connect(&timer,SIGNAL(timeout()),this,SLOT(update()));
+ tc = 0;
+ silently = false;
+ restart = false;
+ qm_controlled = false;
+ scanning = false;
+ num_chunks = 0;
+ total_chunks = 0;
+ num_downloaded = 0;
+ num_failed = 0;
+}
+
+ScanDialog::~ScanDialog()
+{
+}
+
+void ScanDialog::scan()
+{
+ try
+ {
+ tc->startDataCheck(this,auto_import);
+ timer.start(500);
+ scanning = true;
+ }
+ catch (bt::Error & err)
+ {
+ KMessageBox::error(0,i18n("Error scanning data: %1").arg(err.toString()));
+ }
+
+}
+
+void ScanDialog::execute(kt::TorrentInterface* tc,bool silently)
+{
+ m_torrent_label->setText(i18n("Scanning data of <b>%1</b> :").arg(tc->getStats().torrent_name));
+ adjustSize();
+ m_cancel->setEnabled(true);
+ this->silently = silently;
+ this->tc = tc;
+ num_chunks = 0;
+ total_chunks = 0;
+ num_downloaded = 0;
+ num_failed = 0;
+ if (auto_import || tc->getStats().running)
+ restart = true;
+
+ qm_controlled = !tc->getStats().user_controlled;
+ qm_priority = tc->getPriority();
+
+ if (tc->getStats().running)
+ {
+ if (qm_controlled)
+ core->getQueueManager()->stop(tc,true);
+ else
+ tc->stop(true);
+ }
+
+
+ scan();
+}
+
+void ScanDialog::finished()
+{
+ QMutexLocker lock(&mutex);
+ scanning = false;
+ timer.stop();
+ progress(100,100);
+ update();
+ if (!isStopped())
+ {
+ if (restart)
+ {
+ if (!qm_controlled)
+ tc->start();
+ else
+ {
+ tc->setPriority(qm_priority);
+ core->getQueueManager()->orderQueue();
+ }
+ }
+
+ if (silently)
+ accept();
+ else
+ {
+ // cancel now becomes a close button
+ m_cancel->setGuiItem(KStdGuiItem::close());
+ disconnect(m_cancel,SIGNAL(clicked()),this,SLOT(onCancelPressed()));
+ connect(m_cancel,SIGNAL(clicked()),this,SLOT(accept()));
+ }
+ }
+ else
+ {
+ if (restart)
+ {
+ if (!qm_controlled)
+ tc->start();
+ else
+ {
+ tc->setPriority(qm_priority);
+ core->getQueueManager()->orderQueue();
+ }
+ }
+
+ QDialog::reject();
+ }
+}
+
+void ScanDialog::progress(bt::Uint32 num,bt::Uint32 total)
+{
+ QMutexLocker lock(&mutex);
+ num_chunks = num;
+ total_chunks = total;
+
+}
+
+void ScanDialog::update()
+{
+ QMutexLocker lock(&mutex);
+ m_progress->setTotalSteps(total_chunks);
+ m_progress->setProgress(num_chunks);
+ m_chunks_found->setText(QString::number(num_downloaded));
+ m_chunks_failed->setText(QString::number(num_failed));
+}
+
+void ScanDialog::status(bt::Uint32 failed,bt::Uint32 downloaded)
+{
+ QMutexLocker lock(&mutex);
+ num_failed = failed;
+ num_downloaded = downloaded;
+}
+
+void ScanDialog::reject()
+{
+ if (scanning)
+ stop();
+ else
+ QDialog::reject();
+}
+
+void ScanDialog::onCancelPressed()
+{
+ stop();
+}
+
+void ScanDialog::accept()
+{
+ QDialog::accept();
+}
+
+void ScanDialog::closeEvent(QCloseEvent* e)
+{
+ if (scanning)
+ reject();
+ else
+ accept();
+}
+
+#include "scandialog.moc"
+
diff --git a/apps/ktorrent/scandialog.h b/apps/ktorrent/scandialog.h
new file mode 100644
index 0000000..26271b8
--- /dev/null
+++ b/apps/ktorrent/scandialog.h
@@ -0,0 +1,87 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 SCANDIALOG_H
+#define SCANDIALOG_H
+
+#include <qmutex.h>
+#include <qtimer.h>
+#include <datachecker/datacheckerlistener.h>
+#include "scandlgbase.h"
+
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+class KTorrentCore;
+
+class ScanDialog : public ScanDlgBase, public bt::DataCheckerListener
+{
+ Q_OBJECT
+public:
+ ScanDialog(KTorrentCore* core,bool auto_import,QWidget* parent = 0, const char* name = 0, bool modal = false, WFlags fl = WDestructiveClose );
+ virtual ~ScanDialog();
+
+ /// Starts the scan thread
+ void execute(kt::TorrentInterface* tc,bool silently);
+
+protected:
+ /// Update progress info, runs in scan thread
+ virtual void progress(bt::Uint32 num,bt::Uint32 total);
+
+ /// Update status info, runs in scan thread
+ virtual void status(bt::Uint32 num_failed,bt::Uint32 num_downloaded);
+
+ /// Scan finished, runs in app thread
+ virtual void finished();
+
+ /// Handle the close event
+ virtual void closeEvent(QCloseEvent* e);
+
+
+protected slots:
+ virtual void reject();
+ virtual void accept();
+ void onCancelPressed();
+ /// Updates the GUI in app thread
+ void update();
+ void scan();
+
+private:
+ kt::TorrentInterface* tc;
+ QMutex mutex;
+ QTimer timer;
+ bt::Uint32 num_chunks;
+ bt::Uint32 total_chunks;
+ bt::Uint32 num_downloaded;
+ bt::Uint32 num_failed;
+ bool silently;
+ bool restart;
+ bool qm_controlled;
+ int qm_priority;
+ bool scanning;
+ KTorrentCore* core;
+};
+
+
+#endif
+
diff --git a/apps/ktorrent/scandlgbase.ui b/apps/ktorrent/scandlgbase.ui
new file mode 100644
index 0000000..6a1b374
--- /dev/null
+++ b/apps/ktorrent/scandlgbase.ui
@@ -0,0 +1,193 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ScanDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ScanDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>441</width>
+ <height>182</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Scanning data</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>Minimum</enum>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_torrent_label</cstring>
+ </property>
+ <property name="text">
+ <string>Scanning data of torrent :</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Number of chunks found :</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Number of chunks failed / not downloaded :</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_chunks_found</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_chunks_failed</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="KProgress">
+ <property name="name">
+ <cstring>m_progress</cstring>
+ </property>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>181</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_cancel</cstring>
+ </property>
+ <property name="text">
+ <string>C&amp;ancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kprogress.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/speedlimitsdlg.cpp b/apps/ktorrent/speedlimitsdlg.cpp
new file mode 100644
index 0000000..d208b06
--- /dev/null
+++ b/apps/ktorrent/speedlimitsdlg.cpp
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qlabel.h>
+#include <klocale.h>
+#include <knuminput.h>
+#include <kpushbutton.h>
+#include <kstdguiitem.h>
+#include <util/constants.h>
+#include <interfaces/torrentinterface.h>
+
+#include "speedlimitsdlg.h"
+
+using namespace bt;
+using namespace kt;
+
+SpeedLimitsDlg::SpeedLimitsDlg(kt::TorrentInterface* ti,QWidget* parent, const char* name)
+ : SpeedLimitsDlgBase(parent,name,true,0),tor(ti)
+{
+ m_main_caption->setText(i18n("Speed limits for <b>%1</b>:").arg(tor->getStats().torrent_name));
+ Uint32 up,down;
+ tor->getTrafficLimits(up,down);
+ m_upload_rate->setValue(up / 1024);
+ m_upload_rate->setMinValue(0);
+ m_download_rate->setValue(down / 1024);
+ m_download_rate->setMinValue(0);
+ m_ok->setGuiItem(KStdGuiItem::ok());
+ m_cancel->setGuiItem(KStdGuiItem::cancel());
+ adjustSize();
+}
+
+SpeedLimitsDlg::~SpeedLimitsDlg()
+{}
+
+
+void SpeedLimitsDlg::accept()
+{
+ Uint32 up = m_upload_rate->value() * 1024;
+ Uint32 down = m_download_rate->value() * 1024;
+ tor->setTrafficLimits(up,down);
+ QDialog::accept();
+}
+
+
+
+#include "speedlimitsdlg.moc"
+
diff --git a/apps/ktorrent/speedlimitsdlg.h b/apps/ktorrent/speedlimitsdlg.h
new file mode 100644
index 0000000..3e31a4a
--- /dev/null
+++ b/apps/ktorrent/speedlimitsdlg.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 SPEEDLIMITSDLG_H
+#define SPEEDLIMITSDLG_H
+
+#include "speedlimitsdlgbase.h"
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+class SpeedLimitsDlg : public SpeedLimitsDlgBase
+{
+ Q_OBJECT
+
+ kt::TorrentInterface* tor;
+public:
+ SpeedLimitsDlg(kt::TorrentInterface* ti,QWidget* parent = 0, const char* name = 0);
+ virtual ~SpeedLimitsDlg();
+
+
+protected slots:
+ virtual void accept();
+
+};
+
+#endif
+
diff --git a/apps/ktorrent/speedlimitsdlgbase.ui b/apps/ktorrent/speedlimitsdlgbase.ui
new file mode 100644
index 0000000..cd1bbf4
--- /dev/null
+++ b/apps/ktorrent/speedlimitsdlgbase.ui
@@ -0,0 +1,196 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SpeedLimitsDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SpeedLimitsDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>362</width>
+ <height>150</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Speed Limits</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_main_caption</cstring>
+ </property>
+ <property name="text">
+ <string>Set the speed limits for torrent</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Max upload rate:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Max download rate:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_upload_rate</cstring>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_download_rate</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>KB/s (0 is no limit)</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4_2</cstring>
+ </property>
+ <property name="text">
+ <string>KB/s (0 is no limit)</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>121</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_ok</cstring>
+ </property>
+ <property name="text">
+ <string>OK</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_cancel</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>m_cancel</sender>
+ <signal>clicked()</signal>
+ <receiver>SpeedLimitsDlgBase</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>m_ok</sender>
+ <signal>clicked()</signal>
+ <receiver>SpeedLimitsDlgBase</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/torrentcreatordlg.cpp b/apps/ktorrent/torrentcreatordlg.cpp
new file mode 100644
index 0000000..d47086f
--- /dev/null
+++ b/apps/ktorrent/torrentcreatordlg.cpp
@@ -0,0 +1,152 @@
+//
+// C++ Implementation: $MODULE$
+//
+// Description:
+//
+//
+// Author: Joris Guisson <joris.guisson@gmail.com>, (C) 2005
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#include <qcheckbox.h>
+#include <qstringlist.h>
+#include <qmap.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kcombobox.h>
+#include <klineedit.h>
+#include <kurlrequester.h>
+#include <keditlistbox.h>
+#include <kpushbutton.h>
+#include <kfiledialog.h>
+#include <kprogress.h>
+#include <klistview.h>
+#include <knuminput.h>
+#include "torrentcreatordlg.h"
+#include "ktorrentcore.h"
+#include <torrent/globals.h>
+#include <kademlia/dhtbase.h>
+
+TorrentCreatorDlg::TorrentCreatorDlg(KTorrentCore* core,QWidget *parent, const char *name)
+ :TorrentCreatorDlgBase(parent, name),core(core)
+{
+ KURLRequester* r = m_file_or_dir;
+ r->fileDialog()->setMode(
+ KFile::ExistingOnly|KFile::Directory|KFile::File|KFile::LocalOnly);
+
+ KComboBox* cb = m_chunk_size;
+ cb->setCurrentItem(3);
+
+ connect(m_create_btn,SIGNAL(clicked()),this,SLOT(onCreate()));
+ connect(m_cancel_btn,SIGNAL(clicked()),this,SLOT(reject()));
+
+ m_nodes->setHidden(true);
+
+ QMap<QString, int> n = bt::Globals::instance().getDHT().getClosestGoodNodes(10);
+
+ for(QMap<QString, int>::iterator it = n.begin(); it!=n.end(); ++it)
+ new QListViewItem(m_nodeList, it.key(), QString("%1").arg(it.data()));
+}
+
+TorrentCreatorDlg::~TorrentCreatorDlg()
+{
+}
+
+void TorrentCreatorDlg::onCreate()
+{
+ KURLRequester* r = m_file_or_dir;
+ KComboBox* cb = m_chunk_size;
+ KEditListBox* eb = m_trackers;
+
+ if (r->url().length() == 0)
+ {
+ errorMsg(i18n("You must select a file or a folder."));
+ return;
+ }
+
+ if (eb->items().count() == 0 && !m_decentralized->isChecked())
+ {
+ //errorMsg(i18n("You must add at least one tracker."));
+ QString msg = i18n("You have not added a tracker, "
+ "are you sure you want to create this torrent ?");
+ if (KMessageBox::warningYesNo(this,msg) == KMessageBox::No)
+ return;
+ }
+
+ if (m_nodeList->childCount() == 0 && m_decentralized->isChecked())
+ {
+ errorMsg(i18n("You must add at least one node."));
+ return;
+ }
+
+ QString url = r->url();
+ int chunk_size = cb->currentText().toInt();
+ QString name = KURL::fromPathOrURL(r->url()).fileName();
+
+ QStringList trackers;
+
+ if(m_decentralized->isChecked())
+ {
+ for(int i=0; i<m_nodeList->childCount(); ++i)
+ trackers.append(m_nodeList->itemAtIndex(i)->text(0) + "," + m_nodeList->itemAtIndex(i)->text(1));
+ }
+ else
+ trackers = eb->items();
+
+ QString s = KFileDialog::getSaveFileName(
+ QString::null,"*.torrent|" + i18n("Torrent Files (*.torrent)"),
+ 0,i18n("Choose File to Save Torrent"));
+
+ if (s.isNull())
+ return;
+
+ if (!s.endsWith(".torrent"))
+ s += ".torrent";
+
+ KProgressDialog* dlg = new KProgressDialog(this,0);
+ dlg->setLabel(i18n("Creating %1...").arg(s));
+ dlg->setModal(true);
+ dlg->setAllowCancel(false);
+ dlg->show();
+ core->makeTorrent(
+ url,trackers,chunk_size,
+ name,m_comments->text(),
+ m_start_seeding->isChecked(),s,
+ m_private->isChecked(),
+ dlg->progressBar(),
+ m_decentralized->isChecked());
+ delete dlg;
+ accept();
+}
+
+void TorrentCreatorDlg::errorMsg(const QString & text)
+{
+ KMessageBox::error(this,text,i18n("Error"));
+}
+
+void TorrentCreatorDlg::btnRemoveNode_clicked()
+{
+ QListViewItem* item = m_nodeList->currentItem();
+ if(!item)
+ return;
+
+ m_nodeList->removeItem(item);
+}
+
+void TorrentCreatorDlg::btnAddNode_clicked()
+{
+ new QListViewItem(m_nodeList, m_node->text(), QString("%1").arg(m_port->value()));
+}
+
+void TorrentCreatorDlg::m_nodeList_selectionChanged(QListViewItem*)
+{
+ btnRemoveNode->setEnabled(m_nodeList->selectedItem()!=0);
+}
+
+void TorrentCreatorDlg::m_node_textChanged(const QString& txt)
+{
+ btnAddNode->setEnabled(!txt.isEmpty());
+}
+
+#include "torrentcreatordlg.moc"
diff --git a/apps/ktorrent/torrentcreatordlg.h b/apps/ktorrent/torrentcreatordlg.h
new file mode 100644
index 0000000..3dec45d
--- /dev/null
+++ b/apps/ktorrent/torrentcreatordlg.h
@@ -0,0 +1,39 @@
+//
+// C++ Interface: $MODULE$
+//
+// Description:
+//
+//
+// Author: Joris Guisson <joris.guisson@gmail.com>, (C) 2005
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+#ifndef TORENTCREATORDLG_H
+#define TORENTCREATORDLG_H
+
+#include "torrentcreatordlgbase.h"
+
+class KTorrentCore;
+
+class TorrentCreatorDlg: public TorrentCreatorDlgBase
+{
+ Q_OBJECT
+public:
+ TorrentCreatorDlg(KTorrentCore* core,QWidget *parent = 0, const char *name = 0);
+ virtual ~TorrentCreatorDlg();
+
+public slots:
+ void onCreate();
+ virtual void btnAddNode_clicked();
+ virtual void btnRemoveNode_clicked();
+ virtual void m_nodeList_selectionChanged(QListViewItem*);
+ virtual void m_node_textChanged(const QString&);
+private:
+ void errorMsg(const QString & text);
+
+private:
+ KTorrentCore* core;
+};
+
+#endif
diff --git a/apps/ktorrent/torrentcreatordlgbase.ui b/apps/ktorrent/torrentcreatordlgbase.ui
new file mode 100644
index 0000000..fb253f4
--- /dev/null
+++ b/apps/ktorrent/torrentcreatordlgbase.ui
@@ -0,0 +1,533 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>TorrentCreatorDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>TorrentCreatorDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>503</width>
+ <height>669</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Create Torrent</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>The file or folder of which you want to create a torrent:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_file_or_dir</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>m_label1</cstring>
+ </property>
+ <property name="text">
+ <string>You must add at least one tracker or node.</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>File Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Size of each chunk:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <item>
+ <property name="text">
+ <string>32</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>64</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>128</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>256</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>512</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>1024</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>2048</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>4096</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>8192</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_chunk_size</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>KB</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_start_seeding</cstring>
+ </property>
+ <property name="text">
+ <string>Start seedin&amp;g the torrent</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>m_decentralized</cstring>
+ </property>
+ <property name="text">
+ <string>Decentrali&amp;zed (DHT only)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>m_private</cstring>
+ </property>
+ <property name="text">
+ <string>Private torrent (DHT not allowed)</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="5" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Comments:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_comments</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="6" column="0">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_create_btn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Create</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_cancel_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Ca&amp;ncel</string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="KEditListBox" row="3" column="0">
+ <property name="name">
+ <cstring>m_trackers</cstring>
+ </property>
+ <property name="title">
+ <string>Trackers</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="4" column="0">
+ <property name="name">
+ <cstring>m_nodes</cstring>
+ </property>
+ <property name="title">
+ <string>DHT nodes</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton" row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>btnRemoveNode</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>28</number>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="1" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>btnAddNode</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Add</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="stdItem" stdset="0">
+ <number>27</number>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Node:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_node</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="KIntNumInput">
+ <property name="name">
+ <cstring>m_port</cstring>
+ </property>
+ <property name="value">
+ <number>6882</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="0" column="1">
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Maximum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KListView" row="1" column="0" rowspan="3" colspan="1">
+ <column>
+ <property name="text">
+ <string>IP or hostname</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Port</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_nodeList</cstring>
+ </property>
+ <property name="allColumnsShowFocus">
+ <bool>true</bool>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ <spacer row="3" column="2">
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel" row="4" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>NOTE: Some known good DHT nodes are already inserted. You should probably insert your own IP address and port too if you plan to seed this torrent.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>m_private</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_decentralized</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_decentralized</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_private</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_decentralized</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_trackers</receiver>
+ <slot>setHidden(bool)</slot>
+ </connection>
+ <connection>
+ <sender>m_decentralized</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>m_nodes</receiver>
+ <slot>setShown(bool)</slot>
+ </connection>
+ <connection>
+ <sender>btnRemoveNode</sender>
+ <signal>clicked()</signal>
+ <receiver>TorrentCreatorDlgBase</receiver>
+ <slot>btnRemoveNode_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnAddNode</sender>
+ <signal>clicked()</signal>
+ <receiver>TorrentCreatorDlgBase</receiver>
+ <slot>btnAddNode_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>m_node</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>TorrentCreatorDlgBase</receiver>
+ <slot>m_node_textChanged(const QString&amp;)</slot>
+ </connection>
+ <connection>
+ <sender>m_nodeList</sender>
+ <signal>selectionChanged(QListViewItem*)</signal>
+ <receiver>TorrentCreatorDlgBase</receiver>
+ <slot>m_nodeList_selectionChanged(QListViewItem*)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>m_file_or_dir</tabstop>
+ <tabstop>m_chunk_size</tabstop>
+ <tabstop>m_start_seeding</tabstop>
+ <tabstop>m_private</tabstop>
+ <tabstop>m_decentralized</tabstop>
+ <tabstop>m_node</tabstop>
+ <tabstop>m_port</tabstop>
+ <tabstop>btnAddNode</tabstop>
+ <tabstop>btnRemoveNode</tabstop>
+ <tabstop>m_comments</tabstop>
+ <tabstop>m_create_btn</tabstop>
+ <tabstop>m_cancel_btn</tabstop>
+</tabstops>
+<slots>
+ <slot>btnRemoveNode_clicked()</slot>
+ <slot>btnAddNode_clicked()</slot>
+ <slot>m_node_textChanged(const QString&amp;)</slot>
+ <slot>m_nodeList_selectionChanged(QListViewItem*)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kcombobox.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>keditlistbox.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktorrent/trayhoverpopup.cpp b/apps/ktorrent/trayhoverpopup.cpp
new file mode 100644
index 0000000..196eb63
--- /dev/null
+++ b/apps/ktorrent/trayhoverpopup.cpp
@@ -0,0 +1,136 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qvbox.h>
+#include <qhbox.h>
+#include <qlabel.h>
+#include <qtooltip.h>
+#include <qpixmap.h>
+#include <kdialog.h>
+#include <util/log.h>
+#include "trayhoverpopup.h"
+
+using namespace bt;
+
+TrayHoverPopup::TrayHoverPopup(const QPixmap & pix,QWidget *parent, const char *name )
+ : KPassivePopup(KPassivePopup::Boxed,parent,name),pix(pix)
+{
+ setTimeout(0);
+ setAutoDelete(false);
+ connect(&hover_timer,SIGNAL(timeout()),this,SLOT(onHoverTimeout()));
+ connect(&show_timer,SIGNAL(timeout()),this,SLOT(onShowTimeout()));
+ create();
+ setPalette(QToolTip::palette());
+ setLineWidth(1);
+ context_menu_shown = false;
+ cursor_over_icon = false;
+}
+
+
+TrayHoverPopup::~TrayHoverPopup()
+{}
+
+void TrayHoverPopup::contextMenuAboutToShow()
+{
+ context_menu_shown = true;
+ if (isShown())
+ {
+ hide();
+ hover_timer.stop();
+ }
+}
+
+void TrayHoverPopup::contextMenuAboutToHide()
+{
+ context_menu_shown = false;
+}
+
+
+void TrayHoverPopup::enterEvent()
+{
+ cursor_over_icon = true;
+ if (isHidden() && !context_menu_shown)
+ {
+ // start the show timer
+ show_timer.start(1000,true);
+ }
+ else
+ hover_timer.stop(); // stop timeout
+}
+
+void TrayHoverPopup::leaveEvent()
+{
+ cursor_over_icon = false;
+ // to avoid problems with a quick succession of enter and leave events, because the cursor
+ // is on the edge, use a timer to expire the popup
+ // in enterEvent we will stop the timer
+ if (isShown())
+ hover_timer.start(200,true);
+}
+
+void TrayHoverPopup::onHoverTimeout()
+{
+ hide();
+ show_timer.stop();
+}
+
+void TrayHoverPopup::onShowTimeout()
+{
+ if (!context_menu_shown && cursor_over_icon)
+ show();
+}
+
+void TrayHoverPopup::updateText(const QString & msg)
+{
+ text->setText(msg);
+}
+
+void TrayHoverPopup::create()
+{
+ QVBox *vb = new QVBox(this);
+ vb->setSpacing(KDialog::spacingHint());
+
+ QHBox *hb=0;
+ if (!pix.isNull())
+ {
+ hb = new QHBox(vb);
+ hb->setMargin(0);
+ hb->setSpacing(KDialog::spacingHint());
+ QLabel* pix_lbl = new QLabel(hb,"title_icon");
+ pix_lbl->setPixmap(pix);
+ pix_lbl->setAlignment(AlignLeft);
+ }
+
+
+ QLabel* title = new QLabel("KTorrent", hb ? hb : vb, "title_label" );
+ QFont fnt = title->font();
+ fnt.setBold( true );
+ title->setFont( fnt );
+ title->setAlignment( Qt::AlignHCenter );
+ if ( hb )
+ hb->setStretchFactor(title, 10 ); // enforce centering
+
+ // text will be filled later
+ text = new QLabel( "Dummy", vb, "msg_label" );
+ text->setAlignment( AlignLeft );
+ setView(vb);
+}
+
+
+#include "trayhoverpopup.moc"
diff --git a/apps/ktorrent/trayhoverpopup.h b/apps/ktorrent/trayhoverpopup.h
new file mode 100644
index 0000000..3da5985
--- /dev/null
+++ b/apps/ktorrent/trayhoverpopup.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 TRAYHOVERPOPUP_H
+#define TRAYHOVERPOPUP_H
+
+#include <qtimer.h>
+#include <kpassivepopup.h>
+
+class QLabel;
+class QPixmap;
+
+/**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ This is the passive popup which is shown when the mouse cursor is hovered over the tray icon
+*/
+class TrayHoverPopup : public KPassivePopup
+{
+ Q_OBJECT
+public:
+ TrayHoverPopup(const QPixmap & pix,QWidget *parent = 0, const char *name = 0 );
+ virtual ~TrayHoverPopup();
+
+ /// Cursor entered system tray icon
+ void enterEvent();
+
+ /// Cursor left system tray icon
+ void leaveEvent();
+
+ /// Update the text which is shown
+ void updateText(const QString & msg);
+
+public slots:
+ void contextMenuAboutToShow();
+ void contextMenuAboutToHide();
+
+private:
+ void create();
+
+private slots:
+ void onHoverTimeout();
+ void onShowTimeout();
+
+
+private:
+ const QPixmap & pix;
+ QTimer hover_timer;
+ QTimer show_timer;
+ QLabel* text;
+ bool context_menu_shown;
+ bool cursor_over_icon;
+};
+
+#endif
diff --git a/apps/ktorrent/trayicon.cpp b/apps/ktorrent/trayicon.cpp
new file mode 100644
index 0000000..e7cf9c5
--- /dev/null
+++ b/apps/ktorrent/trayicon.cpp
@@ -0,0 +1,380 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <kpopupmenu.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include "ktorrent.h"
+#include "trayicon.h"
+#include <qtooltip.h>
+#include <kpassivepopup.h>
+#include <interfaces/torrentinterface.h>
+#include "ktorrentcore.h"
+#include <interfaces/functions.h>
+#include <net/socketmonitor.h>
+#include <util/log.h>
+#include "trayhoverpopup.h"
+
+
+using namespace bt;
+using namespace kt;
+
+TrayIcon::TrayIcon( KTorrentCore* tc, QWidget *parent, const char *name)
+ : KSystemTray(parent, name)
+{
+ m_core = tc;
+ m_kt_pix = loadIcon("ktorrent");
+ setPixmap(m_kt_pix);
+ paint=new QPainter( this );
+ drawContents ( paint );
+ previousDownloadHeight=0;
+ previousUploadHeight=0;
+
+ m_hover_popup = new TrayHoverPopup(m_kt_pix,this);
+
+ connect(this,SIGNAL(quitSelected()),kapp,SLOT(quit()));
+ connect(m_core, SIGNAL(finished(kt::TorrentInterface* )),
+ this, SLOT(finished(kt::TorrentInterface* )));
+ connect(m_core,SIGNAL(torrentStoppedByError(kt::TorrentInterface*, QString )),
+ this,SLOT(torrentStoppedByError(kt::TorrentInterface*, QString )));
+ connect(m_core,SIGNAL(maxShareRatioReached( kt::TorrentInterface* )),
+ this,SLOT(maxShareRatioReached( kt::TorrentInterface* )));
+ connect(m_core,SIGNAL(maxSeedTimeReached(kt::TorrentInterface*)),
+ this, SLOT(maxSeedTimeReached(kt::TorrentInterface*)));
+ connect(m_core,SIGNAL(corruptedData( kt::TorrentInterface* )),
+ this,SLOT(corruptedData( kt::TorrentInterface* )));
+ connect(m_core, SIGNAL(queuingNotPossible( kt::TorrentInterface* )),
+ this, SLOT(queuingNotPossible( kt::TorrentInterface* )));
+ connect(m_core,SIGNAL(canNotStart(kt::TorrentInterface*, kt::TorrentStartResponse)),
+ this,SLOT(canNotStart(kt::TorrentInterface*, kt::TorrentStartResponse)));
+ connect(m_core, SIGNAL(lowDiskSpace(kt::TorrentInterface*, bool)),
+ this, SLOT(lowDiskSpace(kt::TorrentInterface*, bool)));
+
+ connect(this->contextMenu(),SIGNAL(aboutToShow()),m_hover_popup,SLOT(contextMenuAboutToShow()));
+ connect(this->contextMenu(),SIGNAL(aboutToHide()),m_hover_popup,SLOT(contextMenuAboutToHide()));
+}
+
+TrayIcon::~TrayIcon()
+{}
+
+void TrayIcon::enterEvent(QEvent* ev)
+{
+ KSystemTray::enterEvent(ev);
+ m_hover_popup->enterEvent();
+}
+
+void TrayIcon::leaveEvent(QEvent* )
+{
+ m_hover_popup->leaveEvent();
+}
+
+void TrayIcon::updateStats(const CurrentStats stats, bool showBars,int downloadBandwidth, int uploadBandwidth )
+{
+ QString tip = i18n("<table cellpadding='2' cellspacing='2' align='center'><tr><td><b>Speed:</b></td><td></td></tr><tr><td>Download: <font color='#1c9a1c'>%1</font></td><td>Upload: <font color='#990000'>%2</font></td></tr><tr><td><b>Transfer:</b></td><td></td></tr><tr><td>Download: <font color='#1c9a1c'>%3</font></td><td>Upload: <font color='#990000'>%4</font></td></tr></table>")
+ .arg(KBytesPerSecToString((double)stats.download_speed/1024.0))
+ .arg(KBytesPerSecToString((double)stats.upload_speed/1024.0))
+ .arg(BytesToString(stats.bytes_downloaded))
+ .arg(BytesToString(stats.bytes_uploaded));
+ m_hover_popup->updateText(tip);
+
+ if(showBars)
+ drawSpeedBar(stats.download_speed/1024,stats.upload_speed/1024, downloadBandwidth, uploadBandwidth);
+ else if (previousDownloadHeight > 0 || previousUploadHeight > 0)
+ {
+ repaint(); // clear the bars if they are disabled
+ previousDownloadHeight = previousUploadHeight = 0;
+ }
+}
+
+void TrayIcon::drawSpeedBar(int downloadSpeed, int uploadSpeed, int downloadBandwidth, int uploadBandwidth )
+{
+ //check if need repaint
+ if (uploadBandwidth == 0)
+ uploadBandwidth = 1;
+ if (downloadBandwidth == 0)
+ downloadBandwidth = 1;
+
+ int DownloadHeight=((downloadSpeed*pixmap()->height())/downloadBandwidth);
+ int UploadHeight=((uploadSpeed*pixmap()->height())/uploadBandwidth);
+ if(previousDownloadHeight==DownloadHeight && previousUploadHeight==UploadHeight)
+ return;
+
+ repaint ();
+
+ QBrush brushD(green);
+ QBrush brushU(red);
+ paint->fillRect(0,pixmap()->height(),2,-DownloadHeight,brushD);
+ paint->fillRect(pixmap()->width()-2,pixmap()->height(),2,-UploadHeight,brushU);
+
+ previousDownloadHeight=DownloadHeight;
+ previousUploadHeight=UploadHeight;
+}
+
+void TrayIcon::showPassivePopup(const QString & msg,const QString & title)
+{
+ KPassivePopup* p = KPassivePopup::message(KPassivePopup::Boxed,title,msg,m_kt_pix, this);
+ p->setPalette(QToolTip::palette());
+ p->setLineWidth(1);
+}
+
+
+void TrayIcon::finished(TorrentInterface* tc)
+{
+ if (!Settings::showPopups())
+ return;
+
+ const TorrentStats & s = tc->getStats();
+ double speed_up = (double)s.bytes_uploaded / 1024.0;
+ double speed_down = (double)(s.bytes_downloaded - s.imported_bytes)/ 1024.0;
+
+ QString msg = i18n("<b>%1</b> has completed downloading."
+ "<br>Average speed: %2 DL / %3 UL.")
+ .arg(s.torrent_name)
+ .arg(KBytesPerSecToString(speed_down / tc->getRunningTimeDL()))
+ .arg(KBytesPerSecToString(speed_up / tc->getRunningTimeUL()));
+
+ showPassivePopup(msg,i18n("Download completed"));
+}
+
+void TrayIcon::maxShareRatioReached(kt::TorrentInterface* tc)
+{
+ if (!Settings::showPopups())
+ return;
+
+ const TorrentStats & s = tc->getStats();
+ KLocale* loc = KGlobal::locale();
+ double speed_up = (double)s.bytes_uploaded / 1024.0;
+
+ QString msg = i18n("<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+ "<br>Uploaded %3 at an average speed of %4.")
+ .arg(s.torrent_name)
+ .arg(loc->formatNumber(s.max_share_ratio,2))
+ .arg(BytesToString(s.bytes_uploaded))
+ .arg(KBytesPerSecToString(speed_up / tc->getRunningTimeUL()));
+
+ showPassivePopup(msg,i18n("Seeding completed"));
+}
+
+void TrayIcon::maxSeedTimeReached(kt::TorrentInterface* tc)
+{
+ if (!Settings::showPopups())
+ return;
+
+ const TorrentStats & s = tc->getStats();
+ KLocale* loc = KGlobal::locale();
+ double speed_up = (double)s.bytes_uploaded / 1024.0;
+
+ QString msg = i18n("<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+ "<br>Uploaded %3 at an average speed of %4.")
+ .arg(s.torrent_name)
+ .arg(loc->formatNumber(s.max_seed_time,2))
+ .arg(BytesToString(s.bytes_uploaded))
+ .arg(KBytesPerSecToString(speed_up / tc->getRunningTimeUL()));
+
+ showPassivePopup(msg,i18n("Seeding completed"));
+}
+
+void TrayIcon::torrentStoppedByError(kt::TorrentInterface* tc, QString msg)
+{
+ if (!Settings::showPopups())
+ return;
+
+ const TorrentStats & s = tc->getStats();
+ QString err_msg = i18n("<b>%1</b> has been stopped with the following error: <br>%2")
+ .arg(s.torrent_name).arg(msg);
+
+ showPassivePopup(err_msg,i18n("Error"));
+}
+
+void TrayIcon::corruptedData(kt::TorrentInterface* tc)
+{
+ if (!Settings::showPopups())
+ return;
+
+ const TorrentStats & s = tc->getStats();
+ QString err_msg = i18n("Corrupted data has been found in the torrent <b>%1</b>"
+ "<br>It would be a good idea to do a data integrity check on the torrent.")
+ .arg(s.torrent_name);
+ showPassivePopup(err_msg,i18n("Error"));
+}
+
+void TrayIcon::queuingNotPossible(kt::TorrentInterface* tc)
+{
+ if (!Settings::showPopups())
+ return;
+
+ const TorrentStats & s = tc->getStats();
+
+ QString msg;
+ KLocale* loc = KGlobal::locale();
+
+ if (tc->overMaxRatio())
+ msg = i18n("<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. Remove the limit manually if you want to continue seeding.")
+ .arg(s.torrent_name).arg(loc->formatNumber(s.max_share_ratio,2));
+ else
+ msg = i18n("<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. Remove the limit manually if you want to continue seeding.")
+ .arg(s.torrent_name).arg(loc->formatNumber(s.max_seed_time,2));
+
+ showPassivePopup(msg,i18n("Torrent cannot be enqueued."));
+}
+
+void TrayIcon::canNotStart(kt::TorrentInterface* tc,kt::TorrentStartResponse reason)
+{
+ if (!Settings::showPopups())
+ return;
+
+ QString msg = i18n("Cannot start <b>%1</b> : <br>").arg(tc->getStats().torrent_name);
+ switch (reason)
+ {
+ case kt::QM_LIMITS_REACHED:
+ if (tc->getStats().bytes_left_to_download == 0)
+ {
+ // is a seeder
+ msg += i18n("Cannot seed more than 1 torrent. <br>",
+ "Cannot seed more than %n torrents. <br>",Settings::maxSeeds());
+ }
+ else
+ {
+ msg += i18n("Cannot download more than 1 torrent. <br>",
+ "Cannot download more than %n torrents. <br>",Settings::maxDownloads());
+ }
+ msg += i18n("Go to Settings -> Configure KTorrent, if you want to change the limits.");
+ showPassivePopup(msg,i18n("Torrent cannot be started"));
+ break;
+ case kt::NOT_ENOUGH_DISKSPACE:
+ msg += i18n("There is not enough diskspace available.");
+ showPassivePopup(msg,i18n("Torrent cannot be started"));
+ break;
+ default:
+ break;
+ }
+}
+
+void TrayIcon::lowDiskSpace(kt::TorrentInterface * tc, bool stopped)
+{
+ if (!Settings::showPopups())
+ return;
+
+ const TorrentStats & s = tc->getStats();
+
+ QString msg = i18n("Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'.").arg(s.torrent_name).arg(tc->getDataDir());
+
+ if(stopped)
+ msg.prepend(i18n("Torrent has been stopped.<br />"));
+
+ showPassivePopup(msg,i18n("Device running out of space"));
+}
+
+SetMaxRate::SetMaxRate( KTorrentCore* tc, int t, QWidget *parent, const char *name):KPopupMenu(parent, name)
+{
+ m_core = tc;
+ type=t;
+ makeMenu();
+ connect(this,SIGNAL(activated (int)),this,SLOT(rateSelected(int )));
+}
+void SetMaxRate::makeMenu()
+{
+
+ int rate=(type==0) ? m_core->getMaxUploadSpeed() : m_core->getMaxDownloadSpeed();
+ int maxBandwidth=(rate > 0) ? rate : (type==0) ? 0 : 20 ;
+ int delta = 0;
+ int maxBandwidthRounded;
+
+ setCheckable(true);
+ insertTitle(i18n("Speed limit in KB/s"));
+
+ if(rate == 0)
+ setItemChecked(insertItem(i18n("Unlimited")), true);
+ else
+ insertItem(i18n("Unlimited"));
+
+ if((maxBandwidth%5)>=3)
+ maxBandwidthRounded=maxBandwidth + 5 - (maxBandwidth%5);
+ else
+ maxBandwidthRounded=maxBandwidth - (maxBandwidth%5);
+
+ for (int i = 0; i < 15; i++)
+ {
+ QValueList<int> valuePair;
+ if (delta == 0)
+ valuePair.append(maxBandwidth);
+ else
+ {
+ if((maxBandwidth%5)!=0)
+ {
+ valuePair.append(maxBandwidthRounded - delta);
+ valuePair.append(maxBandwidthRounded + delta);
+ }
+ else
+ {
+ valuePair.append(maxBandwidth - delta);
+ valuePair.append(maxBandwidth + delta);
+ }
+ }
+
+ for (int j = 0; j < (int)valuePair.count(); j++)
+ {
+ if (valuePair[j] >= 1)
+ {
+ if(rate == valuePair[j] && j==0)
+ {
+ setItemChecked(insertItem(QString("%1").arg(valuePair[j]),-1, (j == 0) ? 2 : count()), true);
+ }
+ else
+ insertItem(QString("%1").arg(valuePair[j]),-1, (j == 0) ? 2 : count());
+ }
+ }
+
+ delta += (delta >= 50) ? 50 : (delta >= 20) ? 10 : 5;
+
+ }
+}
+void SetMaxRate::update()
+{
+ clear();
+ makeMenu();
+}
+
+void SetMaxRate::rateSelected(int id)
+{
+ int rate;
+ QString ratestr = text(id).remove('&');
+ if (ratestr.contains(i18n("Unlimited")))
+ rate = 0;
+ else
+ rate = ratestr.toInt();
+
+ if(type==0)
+ {
+ m_core->setMaxUploadSpeed(rate);
+ net::SocketMonitor::setUploadCap( Settings::maxUploadRate() * 1024);
+ }
+ else
+ {
+ m_core->setMaxDownloadSpeed(rate);
+ net::SocketMonitor::setDownloadCap(Settings::maxDownloadRate()*1024);
+ }
+ Settings::writeConfig();
+
+ update();
+}
+
+
+#include "trayicon.moc"
diff --git a/apps/ktorrent/trayicon.h b/apps/ktorrent/trayicon.h
new file mode 100644
index 0000000..0c1af44
--- /dev/null
+++ b/apps/ktorrent/trayicon.h
@@ -0,0 +1,141 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <ksystemtray.h>
+#include <kpopupmenu.h>
+#include <qpainter.h>
+
+#include "ktorrentcore.h"
+#include "settings.h"
+#include "interfaces/torrentinterface.h"
+#include <util/constants.h>
+
+using namespace bt;
+class QString;
+class TrayHoverPopup;
+
+struct TrayStats
+{
+ bt::Uint32 download_speed;
+ bt::Uint32 upload_speed;
+ bt::Uint64 bytes_downloaded;
+ bt::Uint64 bytes_uploaded;
+};
+
+/**
+ * @author Joris Guisson
+ * @author Ivan Vasic
+*/
+class TrayIcon : public KSystemTray
+{
+ Q_OBJECT
+public:
+ TrayIcon(KTorrentCore* tc, QWidget *parent = 0, const char *name = 0);
+ virtual ~TrayIcon();
+
+ /// Update stats for system tray icon
+ void updateStats(const CurrentStats stats, bool showBars=false, int downloadBandwidth=0, int uploadBandwidth=0);
+
+private:
+ void drawSpeedBar(int downloadSpeed, int uploadSpeed, int downloadBandwidth, int uploadBandwidth);
+ void showPassivePopup(const QString & msg,const QString & titile);
+ virtual void enterEvent(QEvent* ev);
+ virtual void leaveEvent(QEvent* ev);
+
+private slots:
+ /**
+ * Show a passive popup, that the torrent has stopped downloading.
+ * @param tc The torrent
+ */
+ void finished(kt::TorrentInterface* tc);
+
+ /**
+ * Show a passive popup that a torrent has reached it's max share ratio.
+ * @param tc The torrent
+ */
+ void maxShareRatioReached(kt::TorrentInterface* tc);
+
+ /**
+ * Show a passive popup that a torrent has reached it's max seed time
+ * @param tc The torrent
+ */
+ void maxSeedTimeReached(kt::TorrentInterface* tc);
+
+ /**
+ * Show a passive popup when a torrent has been stopped by an error.
+ * @param tc The torrent
+ * @param msg Error message
+ */
+ void torrentStoppedByError(kt::TorrentInterface* tc, QString msg);
+
+ /**
+ * Corrupted data has been found.
+ * @param tc The torrent
+ */
+ void corruptedData(kt::TorrentInterface* tc);
+
+ /**
+ * User tried to enqueue a torrent that has reached max share ratio or max seed time
+ * Show passive popup message.
+ */
+ void queuingNotPossible(kt::TorrentInterface* tc);
+
+ /**
+ * We failed to start a torrent
+ * @param tc The torrent
+ * @param reason The reason it failed
+ */
+ void canNotStart(kt::TorrentInterface* tc,kt::TorrentStartResponse reason);
+
+ ///Shows passive popup message
+ void lowDiskSpace(kt::TorrentInterface* tc, bool stopped);
+
+private:
+ KTorrentCore* m_core;
+ QPainter *paint;
+ int previousDownloadHeight;
+ int previousUploadHeight;
+ TrayHoverPopup* m_hover_popup;
+ QPixmap m_kt_pix;
+};
+
+class SetMaxRate : public KPopupMenu
+{
+ Q_OBJECT
+ public:
+ SetMaxRate(KTorrentCore* tc, int t, QWidget *parent=0, const char *name=0); // type: 0 Upload; 1 Download
+ ~SetMaxRate()
+ {}
+ ;
+
+ void update();
+ private:
+ KTorrentCore* m_core;
+ int type;
+ void makeMenu();
+ private slots:
+ void rateSelected(int id);
+};
+
+#endif
diff --git a/apps/ktorrent/viewmanager.cpp b/apps/ktorrent/viewmanager.cpp
new file mode 100644
index 0000000..17c2782
--- /dev/null
+++ b/apps/ktorrent/viewmanager.cpp
@@ -0,0 +1,265 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kconfig.h>
+#include <klocale.h>
+#include <ktabwidget.h>
+#include <interfaces/torrentinterface.h>
+#include <groups/group.h>
+#include "viewmanager.h"
+#include "ktorrentview.h"
+#include "ktorrent.h"
+
+typedef QValueList<KTorrentView*>::iterator ViewItr;
+
+ViewManager::ViewManager ( QObject *parent, const char *name )
+ : QObject ( parent, name ),current(0)
+{}
+
+
+ViewManager::~ViewManager()
+{}
+
+KTorrentView* ViewManager::newView()
+{
+ KTorrentView* v = new KTorrentView(0);
+ views.append(v);
+ return v;
+}
+
+void ViewManager::saveViewState(KConfig* cfg)
+{
+ QStringList cv;
+ int idx = 0;
+ for (ViewItr i = views.begin();i != views.end();i++)
+ {
+ cv.append((*i)->getCurrentGroup()->groupName());
+ (*i)->saveSettings(cfg,idx++);
+ }
+ cfg->setGroup("ViewManager");
+ cfg->writeEntry("current_views",cv);
+}
+
+void ViewManager::restoreViewState(KConfig* cfg,KTorrent* ktor)
+{
+ QStringList def;
+ def.append(i18n("Downloads"));
+ def.append(i18n("Uploads"));
+
+ cfg->setGroup("ViewManager");
+
+ QStringList to_load = cfg->readListEntry("current_views",def);
+ if (to_load.empty())
+ to_load = def;
+
+ for (QStringList::iterator i = to_load.begin();i != to_load.end();i++)
+ {
+ ktor->openView(*i);
+ }
+
+ if (views.count() == 0)
+ {
+ // no view open, so open default ones
+ for (QStringList::iterator i = def.begin();i != def.end();i++)
+ ktor->openView(*i);
+ }
+
+ // load status for each view
+ int idx = 0;
+ for (ViewItr i = views.begin();i != views.end();i++)
+ {
+ (*i)->loadSettings(cfg,idx++);
+ }
+}
+
+void ViewManager::updateActions()
+{
+ if (current)
+ current->updateActions();
+}
+
+void ViewManager::addTorrent(kt::TorrentInterface* tc)
+{
+ for (ViewItr i = views.begin();i != views.end();i++)
+ {
+ (*i)->addTorrent(tc);
+ }
+}
+
+void ViewManager::removeTorrent(kt::TorrentInterface* tc)
+{
+ for (ViewItr i = views.begin();i != views.end();i++)
+ {
+ (*i)->removeTorrent(tc);
+ }
+}
+
+void ViewManager::startDownloads()
+{
+ if (current)
+ current->startDownloads();
+}
+
+void ViewManager::stopDownloads()
+{
+ if (current)
+ current->stopDownloads();
+}
+
+void ViewManager::startAllDownloads()
+{
+ if (current)
+ current->startAllDownloads();
+}
+
+void ViewManager::stopAllDownloads()
+{
+ if (current)
+ current->stopAllDownloads();
+}
+
+void ViewManager::removeDownloads()
+{
+ if (current)
+ current->removeDownloads();
+}
+
+kt::TorrentInterface* ViewManager::getCurrentTC()
+{
+ return current ? current->getCurrentTC() : 0;
+}
+
+void ViewManager::update()
+{
+ // update the caption of each view if necessary
+ for (ViewItr i = views.begin();i != views.end();i++)
+ {
+ if (*i != current)
+ {
+ KTorrentView* w = *i;
+ w->updateCaption();
+ }
+ }
+
+ if (current)
+ current->update();
+}
+
+void ViewManager::queueAction()
+{
+ if (current)
+ current->queueSlot();
+}
+
+void ViewManager::checkDataIntegrity()
+{
+ if (current)
+ current->checkDataIntegrity();
+}
+
+void ViewManager::getSelection(QValueList<kt::TorrentInterface*> & sel)
+{
+ if (current)
+ current->getSelection(sel);
+}
+
+void ViewManager::onCurrentTabChanged(QWidget* w)
+{
+ KTorrentView* old = current;
+ current = 0;
+ for (ViewItr i = views.begin();i != views.end() && !current;i++)
+ {
+ if (w == *i)
+ current = *i;
+ }
+
+ if (!current)
+ current = old;
+ else
+ {
+ current->update();
+ current->updateActions();
+ }
+}
+
+bool ViewManager::closeAllowed(QWidget* )
+{
+ return views.count() > 1;
+}
+
+void ViewManager::tabCloseRequest(kt::GUIInterface* gui,QWidget* tab)
+{
+ for (ViewItr i = views.begin();i != views.end();i++)
+ {
+ if (tab == *i)
+ {
+ if (current == *i)
+ current = 0;
+
+ gui->removeTabPage(tab);
+ delete tab;
+ views.erase(i);
+ break;
+ }
+ }
+}
+
+void ViewManager::groupRenamed(kt::Group* g,KTabWidget* mtw)
+{
+ for (ViewItr i = views.begin();i != views.end();i++)
+ {
+ KTorrentView* v = *i;
+ if (v->getCurrentGroup() == g)
+ {
+ mtw->changeTab(v,g->groupName());
+ v->setIcon(g->groupIcon());
+ v->setCurrentGroup(g);
+ }
+ }
+}
+
+void ViewManager::groupRemoved(kt::Group* g,KTabWidget* mtw,kt::GUIInterface* gui,kt::Group* all_group)
+{
+ for (ViewItr i = views.begin();i != views.end();)
+ {
+ KTorrentView* v = *i;
+ if (v->getCurrentGroup() == g)
+ {
+ if (views.count() > 1)
+ {
+ // close the tab
+ gui->removeTabPage(v);
+ delete v;
+ i = views.erase(i);
+ }
+ else
+ {
+ mtw->changeTab(v,all_group->groupName());
+ v->setIcon(all_group->groupIcon());
+ v->setCurrentGroup(all_group);
+ i++;
+ }
+ }
+ else
+ i++;
+ }
+}
+
+
+#include "viewmanager.moc"
diff --git a/apps/ktorrent/viewmanager.h b/apps/ktorrent/viewmanager.h
new file mode 100644
index 0000000..d008c62
--- /dev/null
+++ b/apps/ktorrent/viewmanager.h
@@ -0,0 +1,114 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 VIEWMANAGER_H
+#define VIEWMANAGER_H
+
+#include <qobject.h>
+#include <qvaluelist.h>
+#include <interfaces/guiinterface.h>
+
+class KConfig;
+class KTabWidget;
+class KTorrentView;
+class KTorrent;
+
+/**
+ @author Joris Guisson <joris.guisson@gmail.com>
+*/
+class ViewManager : public QObject, public kt::CloseTabListener
+{
+ Q_OBJECT
+public:
+ ViewManager(QObject *parent = 0, const char *name = 0);
+ virtual ~ViewManager();
+
+ /// Create a new view
+ KTorrentView* newView();
+
+ /// Save all views
+ void saveViewState(KConfig* cfg);
+
+ /// Restore all views from configuration
+ void restoreViewState(KConfig* cfg,KTorrent* ktor);
+
+ /// Start all selected downloads in the current view
+ void startDownloads();
+
+ /// Stop all selected downloads in the current view
+ void stopDownloads();
+
+ /// Start all downloads in the current view
+ void startAllDownloads();
+
+ /// Stop all downloads in the current view
+ void stopAllDownloads();
+
+ /// Get the current torrent in the current view
+ kt::TorrentInterface* getCurrentTC();
+
+ /// Remove selected downloads in the current view
+ void removeDownloads();
+
+ /// Update the current view
+ void update();
+
+ /**
+ * Put the current selection of the current view in a list.
+ * @param sel The list to put it in
+ */
+ void getSelection(QValueList<kt::TorrentInterface*> & sel);
+
+ /// Get the current view
+ KTorrentView* getCurrentView() {return current;}
+
+ virtual bool closeAllowed(QWidget* tab);
+ virtual void tabCloseRequest(kt::GUIInterface* gui,QWidget* tab);
+
+ /// A group was renamed, modify all view which where showing this group
+ void groupRenamed(kt::Group* g,KTabWidget* mtw);
+
+ /// A group has been removed, close any tab showing it (in case it is the last tab, switch to All Torrents)
+ void groupRemoved(kt::Group* g,KTabWidget* mtw,kt::GUIInterface* gui,kt::Group* all_group);
+
+ /// Call updateActions on the current view
+ void updateActions();
+
+public slots:
+ /// Add a torrent to all views
+ void addTorrent(kt::TorrentInterface* tc);
+
+ /// Remove a torernt from all views
+ void removeTorrent(kt::TorrentInterface* tc);
+
+ /// Enqueue/Dequeue selected torrents in current view
+ void queueAction();
+
+ /// Check data integrity of current torrent
+ void checkDataIntegrity();
+
+ /// The current tab has changed
+ void onCurrentTabChanged(QWidget* w);
+
+private:
+ QValueList<KTorrentView*> views;
+ KTorrentView* current;
+};
+
+#endif
diff --git a/apps/ktorrent/x-bittorrent.desktop b/apps/ktorrent/x-bittorrent.desktop
new file mode 100644
index 0000000..2db2de8
--- /dev/null
+++ b/apps/ktorrent/x-bittorrent.desktop
@@ -0,0 +1,39 @@
+[Desktop Entry]
+Encoding=UTF-8
+Comment=BitTorrent Download
+Comment[ar]=تنزيل BitTorrent
+Comment[bg]=Сваляне на Бит Торент
+Comment[ca]=Una baixada BitTorrent
+Comment[cs]=Stažení BitTorrent
+Comment[cy]=Lawrlwythiad BitTorrent
+Comment[da]=BitTorrent-download
+Comment[de]=BitTorrent-Herunterladevorgang
+Comment[el]=Λήψη BitTorrent
+Comment[es]=Descarga de BitTorrent
+Comment[et]=BitTorrenti allalaadimine
+Comment[fa]=بارگیری BitTorrent
+Comment[gl]=Descarga de BitTorrent
+Comment[it]=Scaricamento BitTorrent
+Comment[ja]=BitTorrent ダウンロード
+Comment[ka]=BitTorrent-ით ჩამოტვირვა
+Comment[nb]=BitTorrent-nedlasting
+Comment[nds]=Bittorrent-Daalladen
+Comment[nl]=BitTorrent-download
+Comment[pl]=Pobieranie plików BitTorrent
+Comment[pt]=Transferência do BitTorrent
+Comment[pt_BR]=Um programa BitTorrent para download
+Comment[sk]=Sťahovanie BitTorrent
+Comment[sr]=BitTorrent преузимање
+Comment[sr@Latn]=BitTorrent preuzimanje
+Comment[sv]=BitTorrent-nerladdning
+Comment[tr]=BitTorrent İndirme
+Comment[uk]=Звантаження BitTorrent
+Comment[xx]=xxBitTorrent Downloadxx
+Comment[zh_CN]=BitTorrent 下载
+Comment[zh_TW]=BitTorrent 下載
+Hidden=false
+MimeType=application/x-bittorrent
+Icon=torrent
+Type=MimeType
+Patterns=*.torrent;*.tor
+X-KDE-AutoEmbed=false
diff --git a/apps/kttorinfo/Makefile.am b/apps/kttorinfo/Makefile.am
new file mode 100644
index 0000000..01e34c3
--- /dev/null
+++ b/apps/kttorinfo/Makefile.am
@@ -0,0 +1,10 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+
+bin_PROGRAMS = kttorinfo
+kttorinfo_SOURCES = main.cpp
+kttorinfo_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+kttorinfo_LDADD = ../../libktorrent/libktorrent.la $(LIB_KPARTS) $(LIB_KFILE) \
+ $(LIB_KIO)
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/apps/kttorinfo/main.cpp b/apps/kttorinfo/main.cpp
new file mode 100644
index 0000000..e33a763
--- /dev/null
+++ b/apps/kttorinfo/main.cpp
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <qstring.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+
+using namespace bt;
+
+void help()
+{
+ Out() << "Usage : kttorinfo <torrent>" << endl;
+ exit(0);
+}
+
+int main(int argc,char** argv)
+{
+ Globals::instance().setDebugMode(true);
+ Globals::instance().initLog("kttorinfo.log");
+ if (argc < 2)
+ help();
+
+ try
+ {
+ Torrent tor;
+ tor.load(argv[1],false);
+ tor.debugPrintInfo();
+ }
+ catch (Error & e)
+ {
+ Out() << "Error : " << e.toString() << endl;
+ }
+ Globals::cleanup();
+ return 0;
+}
diff --git a/apps/ktupnptest/Makefile.am b/apps/ktupnptest/Makefile.am
new file mode 100644
index 0000000..95cfa6e
--- /dev/null
+++ b/apps/ktupnptest/Makefile.am
@@ -0,0 +1,9 @@
+INCLUDES = -I$(srcdir)/../../libktorrent -I$(srcdir)/../.. $(all_includes)
+METASOURCES = AUTO
+bin_PROGRAMS = ktupnptest
+
+ktupnptest_SOURCES = main.cpp upnptestapp.cpp mainwidget.ui
+ktupnptest_LDADD = ../../plugins/upnp/libktupnp.la \
+ ../../libktorrent/libktorrent.la
+noinst_HEADERS = upnptestapp.h
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/apps/ktupnptest/main.cpp b/apps/ktupnptest/main.cpp
new file mode 100644
index 0000000..c2629ef
--- /dev/null
+++ b/apps/ktupnptest/main.cpp
@@ -0,0 +1,98 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <klocale.h>
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmdlineargs.h>
+#include <libktorrent/functions.h>
+
+
+#include "upnptestapp.h"
+
+using namespace kt;
+using namespace bt;
+
+static const char description[] =
+ I18N_NOOP("A KDE KPart Application");
+
+static const char version[] = "1.3dev";
+
+static KCmdLineOptions options[] =
+{
+// { "+[URL]", I18N_NOOP( "Document to open" ), 0 },
+ KCmdLineLastOption
+};
+
+
+
+
+int main(int argc,char** argv)
+{
+ Globals::instance().setDebugMode(true);
+ KAboutData about("ktupnptest", I18N_NOOP("KTUPnPTest"), version, description,
+ KAboutData::License_GPL, "(C) 2005 Joris Guisson", 0,
+ "http://ktorrent.org/");
+ KCmdLineArgs::init(argc, argv,&about);
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app;
+ Globals::instance().initLog(kt::DataDir() + "ktupnptest.log");
+ UPnPTestApp* mwnd = new UPnPTestApp();
+
+ app.setMainWidget(mwnd);
+ mwnd->show();
+ app.exec();
+ Globals::cleanup();
+ return 0;
+
+ /*
+ if (argc >= 2)
+ {
+ kt::UPnPRouter router(QString::null,"http://foobar.com");
+ kt::UPnPDescriptionParser dp;
+
+ if (!dp.parse(argv[1],&router))
+ {
+ Out() << "Cannot parse " << QString(argv[1]) << endl;
+ }
+ else
+ {
+ Out() << "Succesfully parsed the UPnP contents" << endl;
+ router.debugPrintData();
+ }
+ }
+
+
+ Out() << "Doing second test" << endl;
+ UPnPMCastSocket mcast;
+ UPnPRouter* r = mcast.parseResponse(QCString(test_ps));
+ if (r)
+ {
+ Out() << "Succesfully parsed test_ps" << endl;
+ delete r;
+ }
+ else
+ {
+ Out() << "Failed to parse test_ps" << endl;
+ }
+ */
+
+}
diff --git a/apps/ktupnptest/mainwidget.ui b/apps/ktupnptest/mainwidget.ui
new file mode 100644
index 0000000..cb375f8
--- /dev/null
+++ b/apps/ktupnptest/mainwidget.ui
@@ -0,0 +1,76 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>MainWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>MainWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTextBrowser">
+ <property name="name">
+ <cstring>output</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>61</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>test_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Test</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>close_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/apps/ktupnptest/upnptestapp.cpp b/apps/ktupnptest/upnptestapp.cpp
new file mode 100644
index 0000000..d50b314
--- /dev/null
+++ b/apps/ktupnptest/upnptestapp.cpp
@@ -0,0 +1,87 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kpushbutton.h>
+#include <klocale.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+#include <qtextbrowser.h>
+#include <util/error.h>
+#include "upnptestapp.h"
+#include "mainwidget.h"
+
+using namespace bt;
+using namespace kt;
+
+UPnPTestApp::UPnPTestApp(QWidget *parent, const char *name)
+ : KMainWindow(parent, name)
+{
+ sock = new UPnPMCastSocket(true);
+ connect(sock,SIGNAL(discovered( UPnPRouter* )),this,SLOT(discovered( UPnPRouter* )));
+ mwnd = new MainWidget(this);
+ setCentralWidget(mwnd);
+ connect(mwnd->test_btn,SIGNAL(clicked()),this,SLOT(onTestBtn()));
+ connect(mwnd->close_btn,SIGNAL(clicked()),this,SLOT(onCloseBtn()));
+ bt::Log & lg = bt::Globals::instance().getLog(0);
+ lg.addMonitor(this);
+ Out() << "UPnPTestApp started up !" << endl;
+}
+
+
+UPnPTestApp::~UPnPTestApp()
+{
+ sock->deleteLater();
+}
+
+void UPnPTestApp::discovered(kt::UPnPRouter* router)
+{
+ try
+ {
+ router->forward(net::Port(9999,net::TCP,false));
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,e.toString());
+ }
+}
+
+void UPnPTestApp::onTestBtn()
+{
+ sock->discover();
+}
+
+void UPnPTestApp::onCloseBtn()
+{
+ kapp->quit();
+}
+
+bool UPnPTestApp::queryExit()
+{
+ bt::Log & lg = bt::Globals::instance().getLog(0);
+ lg.removeMonitor(this);
+ return true;
+}
+
+void UPnPTestApp::message(const QString& line, unsigned int arg)
+{
+ mwnd->output->append(line);
+}
+
+
+#include "upnptestapp.moc"
diff --git a/apps/ktupnptest/upnptestapp.h b/apps/ktupnptest/upnptestapp.h
new file mode 100644
index 0000000..6554687
--- /dev/null
+++ b/apps/ktupnptest/upnptestapp.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UPNPTESTAPP_H
+#define UPNPTESTAPP_H
+
+#include <kmainwindow.h>
+#include <libktorrent/util/log.h>
+#include <libktorrent/torrent/globals.h>
+#include <plugins/upnp/upnprouter.h>
+#include <plugins/upnp/upnpdescriptionparser.h>
+#include <plugins/upnp/upnpmcastsocket.h>
+#include <interfaces/logmonitorinterface.h>
+
+class MainWidget;
+
+using kt::UPnPRouter;
+
+/**
+ @author Joris Guisson <joris.guisson@gmail.com>
+*/
+class UPnPTestApp : public KMainWindow, public kt::LogMonitorInterface
+{
+ Q_OBJECT
+public:
+ UPnPTestApp(QWidget *parent = 0, const char *name = 0);
+ virtual ~UPnPTestApp();
+
+ virtual void message(const QString& line, unsigned int arg);
+ bool queryExit();
+
+private slots:
+ void discovered(UPnPRouter* router);
+ void onTestBtn();
+ void onCloseBtn();
+
+private:
+ kt::UPnPMCastSocket* sock;
+ MainWidget* mwnd;
+};
+
+#endif
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..d48d310
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,300 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to 1 if you have the <Carbon/Carbon.h> header file. */
+#undef HAVE_CARBON_CARBON_H
+
+/* Define if you have the CoreAudio API */
+#undef HAVE_COREAUDIO
+
+/* Define to 1 if you have the <crt_externs.h> header file. */
+#undef HAVE_CRT_EXTERNS_H
+
+/* Defines if your system has the crypt function */
+#undef HAVE_CRYPT
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the `fopen64' function. */
+#undef HAVE_FOPEN64
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+#undef HAVE_FSEEKO
+
+/* Define to 1 if you have the `fseeko64' function. */
+#undef HAVE_FSEEKO64
+
+/* Define to 1 if you have the `fstat64' function. */
+#undef HAVE_FSTAT64
+
+/* Define to 1 if you have the `ftello64' function. */
+#undef HAVE_FTELLO64
+
+/* Define to 1 if you have the `ftruncate64' function. */
+#undef HAVE_FTRUNCATE64
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have libjpeg */
+#undef HAVE_LIBJPEG
+
+/* Define if you have libpng */
+#undef HAVE_LIBPNG
+
+/* Define if you have a working libpthread (will enable threaded code) */
+#undef HAVE_LIBPTHREAD
+
+/* Define if you have libz */
+#undef HAVE_LIBZ
+
+/* Define to 1 if you have the `lseek64' function. */
+#undef HAVE_LSEEK64
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mmap64' function. */
+#undef HAVE_MMAP64
+
+/* Define to 1 if you have the `munmap64' function. */
+#undef HAVE_MUNMAP64
+
+/* Define if your system needs _NSGetEnviron to set up the environment */
+#undef HAVE_NSGETENVIRON
+
+/* Define to 1 if you have the `posix_fallocate' function. */
+#undef HAVE_POSIX_FALLOCATE
+
+/* Define to 1 if you have the `posix_fallocate64' function. */
+#undef HAVE_POSIX_FALLOCATE64
+
+/* Define if you have res_init */
+#undef HAVE_RES_INIT
+
+/* Define if you have the res_init prototype */
+#undef HAVE_RES_INIT_PROTO
+
+/* Define if you have a STL implementation by SGI */
+#undef HAVE_SGI_STL
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the `stat64' function. */
+#undef HAVE_STAT64
+
+/* Define to 1 if you have the `statvfs' function. */
+#undef HAVE_STATVFS
+
+/* Define to 1 if you have the `statvfs64' function. */
+#undef HAVE_STATVFS64
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have strlcat */
+#undef HAVE_STRLCAT
+
+/* Define if you have the strlcat prototype */
+#undef HAVE_STRLCAT_PROTO
+
+/* Define if you have strlcpy */
+#undef HAVE_STRLCPY
+
+/* Define if you have the strlcpy prototype */
+#undef HAVE_STRLCPY_PROTO
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the <xfs/xfs.h> header file. */
+#undef HAVE_XFS_XFS_H
+
+/* Define to 1 if the system has the type `__s64'. */
+#undef HAVE___S64
+
+/* Define to 1 if the system has the type `__u64'. */
+#undef HAVE___U64
+
+/* Suffix for lib directories */
+#undef KDELIBSUFF
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `char *', as computed by sizeof. */
+#undef SIZEOF_CHAR_P
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Use system geoip */
+#undef USE_SYSTEM_GEOIP
+
+/* Version number of package */
+#undef VERSION
+
+/* Defined if compiling without arts */
+#undef WITHOUT_ARTS
+
+/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+
+
+
+/*
+ * AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
+ * that defines bzero.
+ */
+
+#if defined(_AIX)
+#include <strings.h>
+#endif
+
+
+
+#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
+# include <sys/time.h>
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+
+#if !defined(HAVE_RES_INIT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+int res_init(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCAT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcat(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCPY_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcpy(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+#undef _LARGEFILE_SOURCE
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
+
+/*
+ * On HP-UX, the declaration of vsnprintf() is needed every time !
+ */
+
+#if !defined(HAVE_VSNPRINTF) || defined(hpux)
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
+#ifdef __cplusplus
+extern "C"
+#endif
+int snprintf(char *str, size_t n, char const *fmt, ...);
+#endif
+
+
+
+#if defined(__SVR4) && !defined(__svr4__)
+#define __svr4__ 1
+#endif
+
+
+/* type to use in place of socklen_t if not defined */
+#undef kde_socklen_t
+
+/* type to use in place of socklen_t if not defined (deprecated, use
+ kde_socklen_t) */
+#undef ksize_t
diff --git a/configure.files b/configure.files
new file mode 100644
index 0000000..97d9bce
--- /dev/null
+++ b/configure.files
@@ -0,0 +1,3 @@
+./admin/configure.in.min
+configure.in.in
+configure.in.bot
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..af2f8b4
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,456 @@
+dnl =======================================================
+dnl FILE: ./admin/configure.in.min
+dnl =======================================================
+
+dnl This file is part of the KDE libraries/packages
+dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org)
+
+dnl This file is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Library General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2 of the License, or (at your option) any later version.
+
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl Library General Public License for more details.
+
+dnl You should have received a copy of the GNU Library General Public License
+dnl along with this library; see the file COPYING.LIB. If not, write to
+dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+dnl Boston, MA 02110-1301, USA.
+
+# Original Author was Kalle@kde.org
+# I lifted it in some mater. (Stephan Kulow)
+# I used much code from Janos Farkas
+
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(acinclude.m4) dnl a source file from your sub dir
+
+dnl This is so we can use kde-common
+AC_CONFIG_AUX_DIR(admin)
+
+dnl This ksh/zsh feature conflicts with `cd blah ; pwd`
+unset CDPATH
+
+dnl Checking host/target/build systems, for make, install etc.
+AC_CANONICAL_SYSTEM
+dnl Perform program name transformation
+AC_ARG_PROGRAM
+
+dnl Automake doc recommends to do this only here. (Janos)
+AM_INIT_AUTOMAKE(ktorrent, 2.2.6) dnl searches for some needed programs
+
+KDE_SET_PREFIX
+
+dnl generate the config header
+AM_CONFIG_HEADER(config.h) dnl at the distribution this done
+
+dnl Checks for programs.
+AC_CHECK_COMPILERS
+AC_ENABLE_SHARED(yes)
+AC_ENABLE_STATIC(no)
+KDE_PROG_LIBTOOL
+
+dnl for NLS support. Call them in this order!
+dnl WITH_NLS is for the po files
+AM_KDE_WITH_NLS
+
+KDE_USE_QT(3.3)
+AC_PATH_KDE
+dnl =======================================================
+dnl FILE: configure.in.in
+dnl =======================================================
+
+#MIN_CONFIG(3.3)
+
+dnl PACKAGE set before
+
+dnl #### Check for FSEEK variants
+AC_SYS_LARGEFILE
+AC_FUNC_FSEEKO
+AC_CHECK_FUNCS(fopen64, ktorrent_cv_func_fopen64=yes, ktorrent_cv_func_fopen64=no)
+AC_CHECK_FUNCS(fseeko64, ktorrent_cv_func_fseek64=yes, ktorrent_cv_func_fseek64=no)
+AC_CHECK_FUNCS(ftello64, ktorrent_cv_func_ftell64=yes, ktorrent_cv_func_ftell64=no)
+AC_CHECK_FUNCS(fstat64, ktorrent_cv_func_fstat64=yes, ktorrent_cv_func_fstat64=no)
+AC_CHECK_FUNCS(stat64, ktorrent_cv_func_stat64=yes, ktorrent_cv_func_stat64=no)
+AC_CHECK_FUNCS(ftruncate64, ktorrent_cv_func_ftruncate64=yes, ktorrent_cv_func_ftruncate64=no)
+AC_CHECK_FUNCS(lseek64, ktorrent_cv_func_lseek64=yes, ktorrent_cv_func_lseek64=no)
+AC_CHECK_FUNCS(mmap64, ktorrent_cv_func_mmap64=yes, ktorrent_cv_func_mmap64=no)
+AC_CHECK_FUNCS(munmap64, ktorrent_cv_func_munmap64=yes, ktorrent_cv_func_munmap64=no)
+AC_CHECK_FUNCS(posix_fallocate, ktorrent_cv_func_posix_fallocate=yes,ktorrent_cv_func_posix_fallocate=no)
+AC_CHECK_FUNCS(posix_fallocate64, ktorrent_cv_func_posix_fallocate64=yes,ktorrent_cv_func_posix_fallocate64=no)
+AC_CHECK_FUNCS(statvfs, ktorrent_cv_func_statvfs=yes,ktorrent_cv_func_statvfs=no)
+AC_CHECK_FUNCS(statvfs64, ktorrent_cv_func_statvfs64=yes,ktorrent_cv_func_statvfs64=no)
+
+AC_LANG_PUSH([C++])
+AC_CHECK_HEADERS([xfs/xfs.h])
+AC_CHECK_TYPES([__u64, __s64], [], [], [#include <xfs/xfs.h>])
+AC_LANG_POP
+
+if test "$ktorrent_cv_func_posix_fallocate" = yes ; then
+ AC_DEFINE(HAVE_POSIX_FALLOCATE, 1)
+else
+ AC_DEFINE(HAVE_POSIX_FALLOCATE, 0)
+fi
+
+if test "$ktorrent_cv_func_posix_fallocate64" = yes ; then
+ AC_DEFINE(HAVE_POSIX_FALLOCATE64, 1)
+else
+ AC_DEFINE(HAVE_POSIX_FALLOCATE64, 0)
+fi
+
+if test "$ktorrent_cv_func_fopen64" = yes ; then
+ AC_DEFINE(HAVE_FOPEN64, 1)
+else
+ AC_DEFINE(HAVE_FOPEN64, 0)
+fi
+
+if test "$ktorrent_cv_func_fseek64" = yes -a "$ktorrent_cv_func_ftell64" = yes; then
+ AC_DEFINE(HAVE_FSEEKO64, 1)
+else
+ AC_DEFINE(HAVE_FSEEKO64, 0)
+fi
+
+if test "$ktorrent_cv_func_fstat64" = yes -a "$ktorrent_cv_func_stat64" = yes ; then
+ AC_DEFINE(HAVE_STAT64,1)
+else
+ AC_DEFINE(HAVE_STAT64,0)
+fi
+
+if test "$ktorrent_cv_func_ftruncate64" = yes ; then
+ AC_DEFINE(HAVE_FTRUNCATE64,1)
+else
+ AC_DEFINE(HAVE_FTRUNCATE64,0)
+fi
+
+if test "$ktorrent_cv_func_lseek64" = yes ; then
+ AC_DEFINE(HAVE_LSEEK64,1)
+else
+ AC_DEFINE(HAVE_LSEEK64,0)
+fi
+
+if test "$ktorrent_cv_func_mmap64" = yes ; then
+ AC_DEFINE(HAVE_MMAP64, 1)
+else
+ AC_DEFINE(HAVE_MMAP64, 0)
+fi
+
+if test "$ktorrent_cv_func_munmap64" = yes ; then
+ AC_DEFINE(HAVE_MUNMAP64, 1)
+else
+ AC_DEFINE(HAVE_MUNMAP64, 0)
+fi
+
+if test "$ktorrent_cv_func_statvfs" = yes ; then
+ AC_DEFINE(HAVE_STATVFS, 1)
+else
+ AC_DEFINE(HAVE_STATVFS, 0)
+fi
+
+if test "$ktorrent_cv_func_statvfs64" = yes ; then
+ AC_DEFINE(HAVE_STATVFS64, 1)
+else
+ AC_DEFINE(HAVE_STATVFS64, 0)
+fi
+
+KDE_CHECK_LIB(gmp, __gmpz_init, [have_gmp=yes],
+ [
+ have_gmp=no
+ AC_MSG_ERROR(libgmp is required to install this program)
+ ])
+
+KDE_CHECK_HEADER(gmp.h, [have_gmp=yes],
+ [
+ have_gmp=no
+ AC_MSG_ERROR(libgmp is required to install this program)
+ ])
+
+KDE_CHECK_HEADER(GeoIP.h, [have_system_geoip=yes], [have_system_geoip=no])
+
+KDE_INIT_DOXYGEN([The API Reference], [Version $VERSION])
+
+AC_ARG_ENABLE(
+ memleak-check,
+ [AS_HELP_STRING(--enable-memleak-check,[Enable memory leak checking])],
+ [CXXFLAGS="$CXXFLAGS -DKT_LEAKTRACE"])
+
+AC_ARG_ENABLE(
+ profile,
+ [AS_HELP_STRING(--enable-profile,[Enable profiling])],
+ [CXXFLAGS="$CXXFLAGS -DKT_PROFILE"])
+
+
+AC_ARG_ENABLE(geoip,
+ [AS_HELP_STRING(--enable-geoip,[Enables builtin GeoIP database installation])],
+ [case "${enableval}" in
+ yes) geoip=true ;;
+ no) geoip=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-geoip) ;;
+ esac],[geoip=true])
+
+AC_ARG_ENABLE(system-geoip,
+ [AS_HELP_STRING(--enable-system-geoip,[Enables use of system-wide GeoIP database (implies --disable-geoip) (no by default)])],
+ [case "${enableval}" in
+ yes) if test "$have_system_geoip" = yes; then
+ system_geoip=true
+ geoip=false
+ else
+ AC_MSG_ERROR(cannot enable system geoip. GeoIP library headers were not found on your system)
+ fi ;;
+ no) system_geoip=true ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-system-geoip) ;;
+ esac],[system_geoip=false])
+
+AM_CONDITIONAL(ENABLE_GEOIP, test x$geoip = xtrue)
+AM_CONDITIONAL(USE_SYSTEM_GEOIP, test x$system_geoip = xtrue)
+
+if test x$system_geoip = xtrue; then
+ AC_DEFINE(USE_SYSTEM_GEOIP, 1, [Use system geoip])
+fi
+
+
+AC_ARG_ENABLE(builtin-country-flags,
+ [AS_HELP_STRING(--enable-builtin-country-flags,[Install and prefer builtin country flags to the ones provided by KDE (yes by default)])],
+ [case "${enableval}" in
+ yes) builtin_country_flags=true ;;
+ no) builtin_country_flags=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-builtin-country-flags) ;;
+ esac],[builtin_country_flags=true])
+
+AM_CONDITIONAL(ENABLE_BUILTIN_COUNTRY_FLAGS, test x$builtin_country_flags = xtrue)
+
+AC_ARG_ENABLE(torrent-mimetype,
+ [ --enable-torrent-mimetype Enables the installation of the torrent mimetype which uses a KTorrent based icon],
+ [case "${enableval}" in
+ yes) mimetype_install=true ;;
+ no) mimetype_install=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-torrent-mimetype) ;;
+ esac],[mimetype_install=false])
+
+AM_CONDITIONAL(ENABLE_TORRENT_MIMETYPE, test x$mimetype_install = xtrue)
+
+## -- BEGIN -- ADDED BY Kevin ---
+
+# Check for pkg-config manually first, as if its not installed the
+# PKG_PROG_PKG_CONFIG macro won't be defined.
+AC_CHECK_PROG(have_pkg_config, pkg-config, yes, no)
+
+if test x"$have_pkg_config" = "xno"; then
+ AC_MSG_ERROR(pkg-config is required to install this program)
+fi
+
+m4_pattern_allow(PKG_CONFIG_MIN_VERSION)
+PKG_PROG_PKG_CONFIG
+
+PKG_CHECK_MODULES( AVAHI, avahi-client >= 0.6.10,
+[
+ AC_SUBST(AVAHI_CFLAGS)
+ AC_SUBST(AVAHI_LIBS)
+ avahi=true
+],
+[
+ missing_avahi_warning=yes
+ avahi=false
+])
+
+PKG_CHECK_MODULES( AVAHI_QT3, avahi-qt3 >= 0.6.10,
+[
+ AC_SUBST(AVAHI_QT3_CFLAGS)
+ AC_SUBST(AVAHI_QT3_LIBS)
+ avahi=true
+],
+[
+ missing_avahi_warning=yes
+ avahi=false
+])
+
+AM_CONDITIONAL(COMPILE_ZEROCONF, test x$avahi = xtrue)
+KDE_CREATE_SUBDIRSLIST
+AC_CONFIG_FILES([ Makefile ])
+AC_CONFIG_FILES([ apps/Makefile ])
+AC_CONFIG_FILES([ apps/ktcachecheck/Makefile ])
+AC_CONFIG_FILES([ apps/ktorrent/Makefile ])
+AC_CONFIG_FILES([ apps/ktorrent/groups/Makefile ])
+AC_CONFIG_FILES([ apps/ktorrent/newui/Makefile ])
+AC_CONFIG_FILES([ apps/kttorinfo/Makefile ])
+AC_CONFIG_FILES([ apps/ktupnptest/Makefile ])
+AC_CONFIG_FILES([ libktorrent/Makefile ])
+AC_CONFIG_FILES([ libktorrent/datachecker/Makefile ])
+AC_CONFIG_FILES([ libktorrent/interfaces/Makefile ])
+AC_CONFIG_FILES([ libktorrent/kademlia/Makefile ])
+AC_CONFIG_FILES([ libktorrent/migrate/Makefile ])
+AC_CONFIG_FILES([ libktorrent/mse/Makefile ])
+AC_CONFIG_FILES([ libktorrent/net/Makefile ])
+AC_CONFIG_FILES([ libktorrent/torrent/Makefile ])
+AC_CONFIG_FILES([ libktorrent/util/Makefile ])
+AC_CONFIG_FILES([ plugins/Makefile ])
+AC_CONFIG_FILES([ plugins/infowidget/Makefile ])
+AC_CONFIG_FILES([ plugins/infowidget/geoip/Makefile ])
+AC_CONFIG_FILES([ plugins/ipfilter/Makefile ])
+AC_CONFIG_FILES([ plugins/logviewer/Makefile ])
+AC_CONFIG_FILES([ plugins/partfileimport/Makefile ])
+AC_CONFIG_FILES([ plugins/rssfeed/Makefile ])
+AC_CONFIG_FILES([ plugins/rssfeed/rss/Makefile ])
+AC_CONFIG_FILES([ plugins/scanfolder/Makefile ])
+AC_CONFIG_FILES([ plugins/scheduler/Makefile ])
+AC_CONFIG_FILES([ plugins/search/Makefile ])
+AC_CONFIG_FILES([ plugins/stats/Makefile ])
+AC_CONFIG_FILES([ plugins/upnp/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/coldmilk/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/coldmilk/icons/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/coldmilk/icons/16x16/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/coldmilk/icons/22x22/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/coldmilk/icons/32x32/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/coldmilk/icons/48x48/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/coldmilk/icons/64x64/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/default/Makefile ])
+AC_CONFIG_FILES([ plugins/webinterface/www/mobile/Makefile ])
+AC_CONFIG_FILES([ plugins/zeroconf/Makefile ])
+AC_CONFIG_FILES([ scripts/Makefile ])
+AC_CONFIG_FILES([ translations/Makefile ])
+AC_CONFIG_FILES([ translations/ar/Makefile ])
+AC_CONFIG_FILES([ translations/ar/messages/Makefile ])
+AC_CONFIG_FILES([ translations/bg/Makefile ])
+AC_CONFIG_FILES([ translations/bg/messages/Makefile ])
+AC_CONFIG_FILES([ translations/br/Makefile ])
+AC_CONFIG_FILES([ translations/br/messages/Makefile ])
+AC_CONFIG_FILES([ translations/ca/Makefile ])
+AC_CONFIG_FILES([ translations/ca/messages/Makefile ])
+AC_CONFIG_FILES([ translations/cs/Makefile ])
+AC_CONFIG_FILES([ translations/cs/messages/Makefile ])
+AC_CONFIG_FILES([ translations/cy/Makefile ])
+AC_CONFIG_FILES([ translations/cy/messages/Makefile ])
+AC_CONFIG_FILES([ translations/da/Makefile ])
+AC_CONFIG_FILES([ translations/da/messages/Makefile ])
+AC_CONFIG_FILES([ translations/de/Makefile ])
+AC_CONFIG_FILES([ translations/de/messages/Makefile ])
+AC_CONFIG_FILES([ translations/el/Makefile ])
+AC_CONFIG_FILES([ translations/el/messages/Makefile ])
+AC_CONFIG_FILES([ translations/en_GB/Makefile ])
+AC_CONFIG_FILES([ translations/en_GB/messages/Makefile ])
+AC_CONFIG_FILES([ translations/es/Makefile ])
+AC_CONFIG_FILES([ translations/es/messages/Makefile ])
+AC_CONFIG_FILES([ translations/et/Makefile ])
+AC_CONFIG_FILES([ translations/et/messages/Makefile ])
+AC_CONFIG_FILES([ translations/fa/Makefile ])
+AC_CONFIG_FILES([ translations/fa/messages/Makefile ])
+AC_CONFIG_FILES([ translations/fr/Makefile ])
+AC_CONFIG_FILES([ translations/fr/messages/Makefile ])
+AC_CONFIG_FILES([ translations/gl/Makefile ])
+AC_CONFIG_FILES([ translations/gl/messages/Makefile ])
+AC_CONFIG_FILES([ translations/hu/Makefile ])
+AC_CONFIG_FILES([ translations/hu/messages/Makefile ])
+AC_CONFIG_FILES([ translations/it/Makefile ])
+AC_CONFIG_FILES([ translations/it/messages/Makefile ])
+AC_CONFIG_FILES([ translations/ja/Makefile ])
+AC_CONFIG_FILES([ translations/ja/messages/Makefile ])
+AC_CONFIG_FILES([ translations/ka/Makefile ])
+AC_CONFIG_FILES([ translations/ka/messages/Makefile ])
+AC_CONFIG_FILES([ translations/lt/Makefile ])
+AC_CONFIG_FILES([ translations/lt/messages/Makefile ])
+AC_CONFIG_FILES([ translations/ms/Makefile ])
+AC_CONFIG_FILES([ translations/ms/messages/Makefile ])
+AC_CONFIG_FILES([ translations/nb/Makefile ])
+AC_CONFIG_FILES([ translations/nb/messages/Makefile ])
+AC_CONFIG_FILES([ translations/nds/Makefile ])
+AC_CONFIG_FILES([ translations/nds/messages/Makefile ])
+AC_CONFIG_FILES([ translations/nl/Makefile ])
+AC_CONFIG_FILES([ translations/nl/messages/Makefile ])
+AC_CONFIG_FILES([ translations/pa/Makefile ])
+AC_CONFIG_FILES([ translations/pa/messages/Makefile ])
+AC_CONFIG_FILES([ translations/pl/Makefile ])
+AC_CONFIG_FILES([ translations/pl/messages/Makefile ])
+AC_CONFIG_FILES([ translations/pt/Makefile ])
+AC_CONFIG_FILES([ translations/pt/messages/Makefile ])
+AC_CONFIG_FILES([ translations/pt_BR/Makefile ])
+AC_CONFIG_FILES([ translations/pt_BR/messages/Makefile ])
+AC_CONFIG_FILES([ translations/ru/Makefile ])
+AC_CONFIG_FILES([ translations/ru/messages/Makefile ])
+AC_CONFIG_FILES([ translations/rw/Makefile ])
+AC_CONFIG_FILES([ translations/rw/messages/Makefile ])
+AC_CONFIG_FILES([ translations/sk/Makefile ])
+AC_CONFIG_FILES([ translations/sk/messages/Makefile ])
+AC_CONFIG_FILES([ translations/sr/Makefile ])
+AC_CONFIG_FILES([ translations/sr/messages/Makefile ])
+AC_CONFIG_FILES([ translations/sr@Latn/Makefile ])
+AC_CONFIG_FILES([ translations/sr@Latn/messages/Makefile ])
+AC_CONFIG_FILES([ translations/sv/Makefile ])
+AC_CONFIG_FILES([ translations/sv/messages/Makefile ])
+AC_CONFIG_FILES([ translations/tr/Makefile ])
+AC_CONFIG_FILES([ translations/tr/messages/Makefile ])
+AC_CONFIG_FILES([ translations/uk/Makefile ])
+AC_CONFIG_FILES([ translations/uk/messages/Makefile ])
+AC_CONFIG_FILES([ translations/zh_CN/Makefile ])
+AC_CONFIG_FILES([ translations/zh_CN/messages/Makefile ])
+AC_CONFIG_FILES([ translations/zh_TW/Makefile ])
+AC_CONFIG_FILES([ translations/zh_TW/messages/Makefile ])
+AC_OUTPUT
+if test x$have_gmp = xno; then
+ echo ""
+ echo "----------------------------------------------------------"
+ echo "KTorrent ERROR:"
+ echo "KTorrent requires gmp (http://www.swox.com/gmp)"
+ echo "----------------------------------------------------------"
+ echo ""
+fi
+
+
+if test x$missing_avahi_warning = xyes; then
+ echo ""
+ echo "----------------------------------------------------------"
+ echo "KTorrent WARNING:"
+ echo "Cannot find avahi-client with version 0.6.10 or later."
+ echo "The zeroconf plugin will not be installed because of this."
+ echo "----------------------------------------------------------"
+ echo ""
+fi
+
+# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure
+if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then
+ # And if so, warn when they don't match
+ if test "$kde_libs_prefix" != "$given_prefix"; then
+ # And if kde doesn't know about the prefix yet
+ echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null
+ if test $? -ne 0; then
+ echo ""
+ echo "Warning: you chose to install this package in $given_prefix,"
+ echo "but KDE was found in $kde_libs_prefix."
+ echo "For this to work, you will need to tell KDE about the new prefix, by ensuring"
+ echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix"
+ echo "Then restart KDE."
+ echo ""
+ fi
+ fi
+fi
+
+if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then
+ echo ""
+ echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility"
+ echo "was not included. Therefore, GCC symbol visibility support remains disabled."
+ echo ""
+ echo "For better performance, consider including the Qt visibility supporting patch"
+ echo "located at:"
+ echo ""
+ echo "http://bugs.kde.org/show_bug.cgi?id=109386"
+ echo ""
+ echo "and recompile all of Qt and KDE. Note, this is entirely optional and"
+ echo "everything will continue to work just fine without it."
+ echo ""
+fi
+
+if test "$all_tests" = "bad"; then
+ if test ! "$cache_file" = "/dev/null"; then
+ echo ""
+ echo "Please remove the file $cache_file after changing your setup"
+ echo "so that configure will find the changes next time."
+ echo ""
+ fi
+else
+ echo ""
+ echo "Good - your configure finished. Start make now"
+ echo ""
+fi
diff --git a/configure.in.bot b/configure.in.bot
new file mode 100644
index 0000000..b3f5186
--- /dev/null
+++ b/configure.in.bot
@@ -0,0 +1,20 @@
+if test x$have_gmp = xno; then
+ echo ""
+ echo "----------------------------------------------------------"
+ echo "KTorrent ERROR:"
+ echo "KTorrent requires gmp (http://www.swox.com/gmp)"
+ echo "----------------------------------------------------------"
+ echo ""
+fi
+
+
+if test x$missing_avahi_warning = xyes; then
+ echo ""
+ echo "----------------------------------------------------------"
+ echo "KTorrent WARNING:"
+ echo "Cannot find avahi-client with version 0.6.10 or later."
+ echo "The zeroconf plugin will not be installed because of this."
+ echo "----------------------------------------------------------"
+ echo ""
+fi
+
diff --git a/configure.in.in b/configure.in.in
new file mode 100644
index 0000000..81026cc
--- /dev/null
+++ b/configure.in.in
@@ -0,0 +1,204 @@
+#MIN_CONFIG(3.3)
+
+AM_INIT_AUTOMAKE(ktorrent,2.2.6)
+
+dnl #### Check for FSEEK variants
+AC_SYS_LARGEFILE
+AC_FUNC_FSEEKO
+AC_CHECK_FUNCS(fopen64, ktorrent_cv_func_fopen64=yes, ktorrent_cv_func_fopen64=no)
+AC_CHECK_FUNCS(fseeko64, ktorrent_cv_func_fseek64=yes, ktorrent_cv_func_fseek64=no)
+AC_CHECK_FUNCS(ftello64, ktorrent_cv_func_ftell64=yes, ktorrent_cv_func_ftell64=no)
+AC_CHECK_FUNCS(fstat64, ktorrent_cv_func_fstat64=yes, ktorrent_cv_func_fstat64=no)
+AC_CHECK_FUNCS(stat64, ktorrent_cv_func_stat64=yes, ktorrent_cv_func_stat64=no)
+AC_CHECK_FUNCS(ftruncate64, ktorrent_cv_func_ftruncate64=yes, ktorrent_cv_func_ftruncate64=no)
+AC_CHECK_FUNCS(lseek64, ktorrent_cv_func_lseek64=yes, ktorrent_cv_func_lseek64=no)
+AC_CHECK_FUNCS(mmap64, ktorrent_cv_func_mmap64=yes, ktorrent_cv_func_mmap64=no)
+AC_CHECK_FUNCS(munmap64, ktorrent_cv_func_munmap64=yes, ktorrent_cv_func_munmap64=no)
+AC_CHECK_FUNCS(posix_fallocate, ktorrent_cv_func_posix_fallocate=yes,ktorrent_cv_func_posix_fallocate=no)
+AC_CHECK_FUNCS(posix_fallocate64, ktorrent_cv_func_posix_fallocate64=yes,ktorrent_cv_func_posix_fallocate64=no)
+AC_CHECK_FUNCS(statvfs, ktorrent_cv_func_statvfs=yes,ktorrent_cv_func_statvfs=no)
+AC_CHECK_FUNCS(statvfs64, ktorrent_cv_func_statvfs64=yes,ktorrent_cv_func_statvfs64=no)
+
+AC_LANG_PUSH([C++])
+AC_CHECK_HEADERS([xfs/xfs.h])
+AC_CHECK_TYPES([__u64, __s64], [], [], [#include <xfs/xfs.h>])
+AC_LANG_POP
+
+if test "$ktorrent_cv_func_posix_fallocate" = yes ; then
+ AC_DEFINE(HAVE_POSIX_FALLOCATE, 1)
+else
+ AC_DEFINE(HAVE_POSIX_FALLOCATE, 0)
+fi
+
+if test "$ktorrent_cv_func_posix_fallocate64" = yes ; then
+ AC_DEFINE(HAVE_POSIX_FALLOCATE64, 1)
+else
+ AC_DEFINE(HAVE_POSIX_FALLOCATE64, 0)
+fi
+
+if test "$ktorrent_cv_func_fopen64" = yes ; then
+ AC_DEFINE(HAVE_FOPEN64, 1)
+else
+ AC_DEFINE(HAVE_FOPEN64, 0)
+fi
+
+if test "$ktorrent_cv_func_fseek64" = yes -a "$ktorrent_cv_func_ftell64" = yes; then
+ AC_DEFINE(HAVE_FSEEKO64, 1)
+else
+ AC_DEFINE(HAVE_FSEEKO64, 0)
+fi
+
+if test "$ktorrent_cv_func_fstat64" = yes -a "$ktorrent_cv_func_stat64" = yes ; then
+ AC_DEFINE(HAVE_STAT64,1)
+else
+ AC_DEFINE(HAVE_STAT64,0)
+fi
+
+if test "$ktorrent_cv_func_ftruncate64" = yes ; then
+ AC_DEFINE(HAVE_FTRUNCATE64,1)
+else
+ AC_DEFINE(HAVE_FTRUNCATE64,0)
+fi
+
+if test "$ktorrent_cv_func_lseek64" = yes ; then
+ AC_DEFINE(HAVE_LSEEK64,1)
+else
+ AC_DEFINE(HAVE_LSEEK64,0)
+fi
+
+if test "$ktorrent_cv_func_mmap64" = yes ; then
+ AC_DEFINE(HAVE_MMAP64, 1)
+else
+ AC_DEFINE(HAVE_MMAP64, 0)
+fi
+
+if test "$ktorrent_cv_func_munmap64" = yes ; then
+ AC_DEFINE(HAVE_MUNMAP64, 1)
+else
+ AC_DEFINE(HAVE_MUNMAP64, 0)
+fi
+
+if test "$ktorrent_cv_func_statvfs" = yes ; then
+ AC_DEFINE(HAVE_STATVFS, 1)
+else
+ AC_DEFINE(HAVE_STATVFS, 0)
+fi
+
+if test "$ktorrent_cv_func_statvfs64" = yes ; then
+ AC_DEFINE(HAVE_STATVFS64, 1)
+else
+ AC_DEFINE(HAVE_STATVFS64, 0)
+fi
+
+KDE_CHECK_LIB(gmp, __gmpz_init, [have_gmp=yes],
+ [
+ have_gmp=no
+ AC_MSG_ERROR(libgmp is required to install this program)
+ ])
+
+KDE_CHECK_HEADER(gmp.h, [have_gmp=yes],
+ [
+ have_gmp=no
+ AC_MSG_ERROR(libgmp is required to install this program)
+ ])
+
+KDE_CHECK_HEADER(GeoIP.h, [have_system_geoip=yes], [have_system_geoip=no])
+
+KDE_INIT_DOXYGEN([The API Reference], [Version $VERSION])
+
+AC_ARG_ENABLE(
+ memleak-check,
+ [AS_HELP_STRING(--enable-memleak-check,[Enable memory leak checking])],
+ [CXXFLAGS="$CXXFLAGS -DKT_LEAKTRACE"])
+
+AC_ARG_ENABLE(
+ profile,
+ [AS_HELP_STRING(--enable-profile,[Enable profiling])],
+ [CXXFLAGS="$CXXFLAGS -DKT_PROFILE"])
+
+
+AC_ARG_ENABLE(geoip,
+ [AS_HELP_STRING(--enable-geoip,[Enables builtin GeoIP database installation])],
+ [case "${enableval}" in
+ yes) geoip=true ;;
+ no) geoip=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-geoip) ;;
+ esac],[geoip=true])
+
+AC_ARG_ENABLE(system-geoip,
+ [AS_HELP_STRING(--enable-system-geoip,[Enables use of system-wide GeoIP database (implies --disable-geoip) (no by default)])],
+ [case "${enableval}" in
+ yes) if test "$have_system_geoip" = yes; then
+ system_geoip=true
+ geoip=false
+ else
+ AC_MSG_ERROR(cannot enable system geoip. GeoIP library headers were not found on your system)
+ fi ;;
+ no) system_geoip=true ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-system-geoip) ;;
+ esac],[system_geoip=false])
+
+AM_CONDITIONAL(ENABLE_GEOIP, test x$geoip = xtrue)
+AM_CONDITIONAL(USE_SYSTEM_GEOIP, test x$system_geoip = xtrue)
+
+if test x$system_geoip = xtrue; then
+ AC_DEFINE(USE_SYSTEM_GEOIP, 1, [Use system geoip])
+fi
+
+
+AC_ARG_ENABLE(builtin-country-flags,
+ [AS_HELP_STRING(--enable-builtin-country-flags,[Install and prefer builtin country flags to the ones provided by KDE (yes by default)])],
+ [case "${enableval}" in
+ yes) builtin_country_flags=true ;;
+ no) builtin_country_flags=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-builtin-country-flags) ;;
+ esac],[builtin_country_flags=true])
+
+AM_CONDITIONAL(ENABLE_BUILTIN_COUNTRY_FLAGS, test x$builtin_country_flags = xtrue)
+
+AC_ARG_ENABLE(torrent-mimetype,
+ [ --enable-torrent-mimetype Enables the installation of the torrent mimetype which uses a KTorrent based icon],
+ [case "${enableval}" in
+ yes) mimetype_install=true ;;
+ no) mimetype_install=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-torrent-mimetype) ;;
+ esac],[mimetype_install=false])
+
+AM_CONDITIONAL(ENABLE_TORRENT_MIMETYPE, test x$mimetype_install = xtrue)
+
+## -- BEGIN -- ADDED BY Kevin ---
+
+# Check for pkg-config manually first, as if its not installed the
+# PKG_PROG_PKG_CONFIG macro won't be defined.
+AC_CHECK_PROG(have_pkg_config, pkg-config, yes, no)
+
+if test x"$have_pkg_config" = "xno"; then
+ AC_MSG_ERROR(pkg-config is required to install this program)
+fi
+
+m4_pattern_allow(PKG_CONFIG_MIN_VERSION)
+PKG_PROG_PKG_CONFIG
+
+PKG_CHECK_MODULES( AVAHI, avahi-client >= 0.6.10,
+[
+ AC_SUBST(AVAHI_CFLAGS)
+ AC_SUBST(AVAHI_LIBS)
+ avahi=true
+],
+[
+ missing_avahi_warning=yes
+ avahi=false
+])
+
+PKG_CHECK_MODULES( AVAHI_QT3, avahi-qt3 >= 0.6.10,
+[
+ AC_SUBST(AVAHI_QT3_CFLAGS)
+ AC_SUBST(AVAHI_QT3_LIBS)
+ avahi=true
+],
+[
+ missing_avahi_warning=yes
+ avahi=false
+])
+
+AM_CONDITIONAL(COMPILE_ZEROCONF, test x$avahi = xtrue)
diff --git a/estimation-scripts/EstimationResults.rb b/estimation-scripts/EstimationResults.rb
new file mode 100644
index 0000000..01eedcc
--- /dev/null
+++ b/estimation-scripts/EstimationResults.rb
@@ -0,0 +1,100 @@
+require 'Estimators'
+require 'Sample'
+
+class EstimationResults
+
+ attr_reader :estimator
+
+ def initialize(estimator, samples)
+ @samples = samples
+ @totalTime = samples.keys.max
+ @totalSize = @samples[@totalTime].bytesDownloaded + @samples[@totalTime].bytesLeft
+ @estimator = estimator
+
+ @maxError = nil
+ @estimations = nil
+ @absoluteErrors = nil
+ @relativeErrors = nil
+ @rootMeanSquareErrorRelative = nil
+ end
+
+ def getRootMeanSquareErrorRelative
+ if @rootMeanSquareErrorRelative == nil
+ relativeErrors = getRelativeErrors
+ @rootMeanSquareErrorRelative = 0.0
+ relativeErrors.each_value do |x|
+ @rootMeanSquareErrorRelative += x**2
+ end
+ @rootMeanSquareErrorRelative = Math.sqrt( @rootMeanSquareErrorRelative / relativeErrors.size )
+ end
+ return @rootMeanSquareErrorRelative
+ end
+
+ # returns the root mean square error for a specific interval of the download
+ # left and right must be floats between 0.0 (no bytes downloaded, start of download) and 1.0 (download complete), right must be greater than left
+
+ def getRootMeanSquareErrorRelative(left, right)
+ relativeErrors = getRelativeErrors
+ rmser = 0.0
+
+ n = 0
+ @samples.keys.each do |x|
+ percentage = @samples[x].bytesDownloaded.to_f / @totalSize
+ if percentage >= left and percentage <= right
+ rmser += relativeErrors[x]**2
+ n += 1
+ end
+ end
+
+ rmser = Math.sqrt( rmser / n )
+
+ return rmser
+ end
+
+ def getRelativeErrors
+ if @relativeErrors == nil
+ @relativeErrors = Hash.new
+ absoluteErrors = getAbsoluteErrors
+ absoluteErrors.keys.sort.each do |time|
+ timeLeft = @totalTime - time;
+ @relativeErrors[time] = absoluteErrors[time].abs.to_f / timeLeft
+ @relativeErrors[time] = @maxError if @maxError != nil and @relativeErrors[time] > @maxError
+ end
+ end
+ return @relativeErrors
+ end
+
+ def setMaxError(maxError)
+ if maxError != @maxError
+ @maxError = maxError
+ @relativeErrors = nil
+ @rootMeanSquareErrorRelative = nil
+ end
+ end
+
+ def getAbsoluteErrors
+ if @absoluteErrors == nil
+ @absoluteErrors = Hash.new
+ estimations = getEstimations
+ estimations.keys.sort.each do |time|
+ @absoluteErrors[time] = @estimations[time] - (@totalTime - time)
+ end
+ end
+
+ return @absoluteErrors
+ end
+
+ def getEstimations
+
+ if @estimations == nil
+ @estimations = Hash.new
+ @samples.values.sort.each do |sample|
+ @estimator.process(sample)
+ @estimations[sample.time] = @estimator.estimate
+ end
+ end
+
+ return @estimations
+ end
+end
+
diff --git a/estimation-scripts/Estimators.rb b/estimation-scripts/Estimators.rb
new file mode 100644
index 0000000..1ef0c6e
--- /dev/null
+++ b/estimation-scripts/Estimators.rb
@@ -0,0 +1,90 @@
+require 'Sample'
+
+# abstract base class of all estimators
+
+class Estimator
+
+ # processes a sample
+ def process(sample)
+ end
+
+ # returns an estimate (ETA as float)
+ # note that you must process at least one sample before this will return meaningful output
+ def estimate
+ end
+
+ # returns the name of the estimator
+ def name
+ end
+end
+
+# estimator that uses the current speed
+class CSAEstimator < Estimator
+ def process(sample)
+ @sample = sample.clone
+ end
+
+ def estimate
+ return @sample.bytesLeft.to_f / @sample.speed
+ end
+
+ def name
+ 'CurrentSpeedEstimator'
+ end
+end
+
+# estimator that uses the global average speed of the whole torrent download for estimation
+
+class GASAEstimator < Estimator
+ def process(sample)
+ @first = sample.clone if @first == nil
+ @last = sample.clone
+ @avgSpeed = Sample.averageSpeed(@first, @last)
+ end
+
+ def estimate
+ return @last.bytesLeft.to_f / @avgSpeed
+ end
+
+ def name
+ 'AverageSpeedEstimator'
+ end
+end
+
+# estimator that uses the average over the last n seconds
+
+class WINXEstimator < Estimator
+
+ attr_reader :windowSize
+
+ def process(sample)
+ # remove all samples that are older than the window size. Note: samples are sorted.
+ @list.pop until @list.length <= 1 or (sample.time - @list.last.time) <= @windowSize
+
+ # prepend array with newest sample
+ @list.unshift(sample.clone)
+ end
+
+ def estimate
+
+ if @list.length > 1
+ first = @list.first
+ last = @list.last
+ return first.bytesLeft.to_f / Sample.averageSpeed(last, first)
+ elsif @list.length == 1
+ sample = @list.first
+ return sample.bytesLeft.to_f / sample.speed
+ elsif @list.length == 0
+ return 0
+ end
+ end
+
+ def name
+ "MovingAverageEstimator_#{@windowSize}s"
+ end
+
+ def initialize(windowSizeInSeconds)
+ @list = Array.new
+ @windowSize = windowSizeInSeconds
+ end
+end
diff --git a/estimation-scripts/README b/estimation-scripts/README
new file mode 100644
index 0000000..00ba46f
--- /dev/null
+++ b/estimation-scripts/README
@@ -0,0 +1,40 @@
+Introduction
+============
+
+This directory contains patches and scripts for my experiments regarding download time estimation
+algorithms, using KTorrent for gathering data ;-)
+
+Files
+=====
+
+enable-logging.diff - Patch to apply to enable logging download stats once per second to $KDEHOME/share/apps/ktorrent/log (by Ivan). Apply it if you want to help collecting test cases.
+
+processlog.rb - extracts logs for single torrents from $KDEHOME/share/apps/ktorrent/log and stores them in $FILENAME-torrent.log
+
+Sample.rb - class representing a sample, does the parsing (given a line from adjustTimestmaps output)
+
+Estimators.rb - Some basic estimators, for estimation based on current speed, average speed and moving average speed.
+
+EstimationResults.rb - Calculates and holds the estimation results of an estimator, including statistics such as relative error for each estimation, root mean square error and the like
+
+What to do
+==========
+
+1) Apply the patch: In torrent/ dir, apply it via
+
+ cat enable-logging.diff | patch -p0
+
+2) Run ktorrent and download torrents. When completed, run processlog.rb:
+
+ ruby processlog.rb $KDEHOME/share/apps/ktorrent/log
+
+Extracted logs end up in $TORRENTFILENAME-torrent.log. ATTENTION: existing files are overwritten!
+
+4) Now, analyze the -adjusted file with a ruby script, using Sample.rb, Estimators.rb, and EstimationResults.rb... ;-)
+I will upload something useful as soon as finished.
+
+
+Frank Osterfeld, <frank.osterfeld at kdemail.net>
+
+
+
diff --git a/estimation-scripts/Sample.rb b/estimation-scripts/Sample.rb
new file mode 100644
index 0000000..b0c38c2
--- /dev/null
+++ b/estimation-scripts/Sample.rb
@@ -0,0 +1,64 @@
+
+class Sample
+
+ attr_reader :time, :speed, :bytesDownloaded, :bytesLeft, :peersTotal
+
+ def Sample.averageSpeed(sample1, sample2)
+ if sample2.time - sample1.time > 0
+ return (sample1.bytesLeft - sample2.bytesLeft).to_f / (sample2.time - sample1.time).to_f
+ else
+ return sample1.speed
+ end
+ end
+
+ def <=>(other)
+ @time <=> other.time
+ end
+
+ # parses a single sample from a line. Format is
+ #
+ # \<tt>timestamp,speed,bytesDownloaded,bytesLeft,peersTotal</tt>
+ #
+ # where
+ # - timestamp is in seconds since epoch (Integer)
+ # - speed is bytes/seconds as Integer
+ # - bytesDownloaded, bytesLeft are bytes as Integer
+ # - peersTotal is the number of available peers (both seeders and leecher, both
+ # connected and not connected to us)
+
+ def Sample.parse(line)
+
+ splitted = line.split(",")
+
+ # TODO: do better error checking
+ return nil if splitted.length != 5
+
+ time = splitted[0].to_i
+ speed = splitted[1].to_i
+ bytesDownloaded = splitted[2].to_i
+ bytesLeft = splitted[3].to_i
+ peersTotal = splitted[4].to_i
+ return Sample.new(time, speed, bytesDownloaded, bytesLeft, peersTotal)
+ end
+
+ # parses samples from a text file, with one sample per line
+ def Sample.parseFromFile(filename)
+ samples = Hash.new
+
+ input = File.open(filename)
+ input.each_line do |line|
+ s = Sample.parse(line)
+ samples[s.time] = s unless s == nil
+ end
+ input.close
+ return samples
+ end
+
+ def initialize(time, speed, bytesDownloaded, bytesLeft, peersTotal)
+ @time = time
+ @speed = speed
+ @bytesDownloaded = bytesDownloaded
+ @bytesLeft = bytesLeft
+ @peersTotal = peersTotal
+ end
+end
diff --git a/estimation-scripts/demo.rb b/estimation-scripts/demo.rb
new file mode 100644
index 0000000..9cf235b
--- /dev/null
+++ b/estimation-scripts/demo.rb
@@ -0,0 +1,18 @@
+require 'Sample'
+require 'Estimators'
+require 'EstimationResults'
+
+samples = Sample.parseFromFile(ARGV[0])
+
+est = WINXEstimator.new(ARGV[1].to_i)
+
+results = EstimationResults.new(est, samples)
+results.setMaxError(10.0)
+
+relErrors = results.getRelativeErrors
+
+relErrors.keys.sort.each do |x|
+ puts "#{x} #{relErrors[x]}"
+end
+
+#puts "RMSE: #{results.getRootMeanSquareErrorRelative}"
diff --git a/estimation-scripts/enable-logging.diff b/estimation-scripts/enable-logging.diff
new file mode 100644
index 0000000..57dc703
--- /dev/null
+++ b/estimation-scripts/enable-logging.diff
@@ -0,0 +1,224 @@
+Index: estimation-scripts/enable-logging.diff
+===================================================================
+--- estimation-scripts/enable-logging.diff (revision 472081)
++++ estimation-scripts/enable-logging.diff (working copy)
+@@ -1,106 +0,0 @@
+-Index: apps/ktorrent/ktorrentviewitem.cpp
+-===================================================================
+---- apps/ktorrent/ktorrentviewitem.cpp (revision 469614)
+-+++ apps/ktorrent/ktorrentviewitem.cpp (working copy)
+-@@ -25,6 +25,7 @@
+- #include <math.h>
+- #include "ktorrentviewitem.h"
+- #include "functions.h"
+-+#include <util/log.h>
+-
+- using namespace bt;
+-
+-@@ -77,6 +78,9 @@
+- KTorrentViewItem::KTorrentViewItem(QListView* parent,bt::TorrentControl* tc)
+- : KListViewItem(parent),tc(tc)
+- {
+-+ toLog = true;
+-+ counter = 1;
+-+ started = false;
+- update();
+- }
+-
+-@@ -86,6 +90,7 @@
+-
+- void KTorrentViewItem::update()
+- {
+-+ bool tmpLog = true;
+- /*
+- addColumn(i18n("File"));
+- addColumn(i18n("Status"));
+-@@ -114,8 +119,43 @@
+- setText(6,KBytesPerSecToString(tc->getUploadRate() / 1024.0));
+-
+- KLocale* loc = KGlobal::locale();
+-+
+-+
+-+ if(counter==1)
+-+ {
+-+ if (tc->isRunning())
+-+ {
+-+ if(!started)
+-+ {
+-+ Out() << "{" << tc->getTorrentName() << "}," << QDateTime::currentDateTime().toTime_t() << "," << tc->getDownloadRate() << "," << tc->getBytesDownloaded() << "," << tc->getBytesLeft() << "," << tc->getNumPeers() << ",ACTIVATED" << endl;
+-+ tmpLog = false;
+-+ started = true;
+-+ toLog = true;
+-+ }
+-+ }
+-+
+-+ if(!tc->isRunning())
+-+ {
+-+ if(started)
+-+ {
+-+ Out() << "{" << tc->getTorrentName() << "}," << QDateTime::currentDateTime().toTime_t() << "," << tc->getDownloadRate() << "," << tc->getBytesDownloaded() << "," << tc->getBytesLeft() << "," << tc->getNumPeers() << ",DEACTIVATED" <<endl;
+-+ tmpLog = false;
+-+ started = false;
+-+ }
+-+ toLog = false;
+-+ }
+-+ }
+-+
+-+ if(counter!=1) tmpLog=false;
+-+ counter *= -1;
+-+
+-+
+- if (tc->getBytesLeft() == 0)
+- {
+-+ if(toLog && tmpLog)
+-+ Out() << "{" << tc->getTorrentName() << "}," << QDateTime::currentDateTime().toTime_t() << "," << tc->getDownloadRate() << "," << tc->getBytesDownloaded() << "," << 0 << "," << tc->getNumPeers() << ",FINISHED" << endl;
+-+ toLog = false;
+-+
+- setText(7,i18n("finished"));
+- }
+- else
+-@@ -124,9 +164,16 @@
+- if( bytes_downloaded < 1 ) //if we just started download use old algorithm
+- {
+- if (tc->getDownloadRate() == 0)
+-+ {
+-+ if(toLog && tmpLog)
+-+ Out() << "{" << tc->getTorrentName() << "}," << QDateTime::currentDateTime().toTime_t() << "," << 0 << "," << tc->getBytesDownloaded() << "," << tc->getBytesLeft() << "," << tc->getNumPeers() << ",RUNNING" << endl;
+- setText(7,i18n("infinity"));
+-+ }
+- else
+- {
+-+ if(toLog && tmpLog)
+-+ Out() << "{" << tc->getTorrentName() << "}," << QDateTime::currentDateTime().toTime_t() << "," << tc->getDownloadRate() << "," << tc->getBytesDownloaded() << "," << tc->getBytesLeft() << "," << tc->getNumPeers() << ",RUNNING" << endl;
+-+
+- Uint32 secs = (int)floor( (float)tc->getBytesLeft() / (float)tc->getDownloadRate() );
+- QTime t;
+- t = t.addSecs(secs);
+-Index: apps/ktorrent/ktorrentviewitem.h
+-===================================================================
+---- apps/ktorrent/ktorrentviewitem.h (revision 469614)
+-+++ apps/ktorrent/ktorrentviewitem.h (working copy)
+-@@ -41,6 +41,10 @@
+- void update();
+-
+- private:
+-+ bool toLog;
+-+ int counter;
+-+ bool started;
+-+ uint start_timestamp;
+- int compare(QListViewItem * i,int col,bool ascending) const;
+- void paintCell(QPainter* p,const QColorGroup & cg,int column,int width,int align);
+-
+Index: apps/ktorrent/ktorrentviewitem.cpp
+===================================================================
+--- apps/ktorrent/ktorrentviewitem.cpp (revision 472081)
++++ apps/ktorrent/ktorrentviewitem.cpp (working copy)
+@@ -25,7 +25,10 @@
+ #include <math.h>
+ #include "ktorrentviewitem.h"
+ #include "functions.h"
++#include <util/log.h>
++#include <torrent/globals.h>
+
++
+ using namespace bt;
+ using namespace kt;
+
+@@ -78,6 +81,9 @@
+ KTorrentViewItem::KTorrentViewItem(QListView* parent,TorrentInterface* tc)
+ : KListViewItem(parent),tc(tc)
+ {
++ toLog = true;
++ counter = 1;
++ started = false;
+ update();
+ }
+
+@@ -87,6 +93,7 @@
+
+ void KTorrentViewItem::update()
+ {
++ bool tmpLog = true;
+ /*
+ addColumn(i18n("File"));
+ addColumn(i18n("Status"));
+@@ -114,8 +121,46 @@
+ setText(6,KBytesPerSecToString(s.upload_rate / 1024.0));
+
+ KLocale* loc = KGlobal::locale();
++
++
++
++ if(counter==1)
++ {
++ if (s.running)
++ {
++ if(!started)
++ {
++ Out() << "{" << s.torrent_name << "}," << QDateTime::currentDateTime().toTime_t() << "," << s.download_rate << "," << s.bytes_downloaded << "," << s.bytes_left << "," << s.num_peers << ",ACTIVATED" << endl;
++ tmpLog = false;
++ started = true;
++ toLog = true;
++ }
++ }
++
++ if(!s.running)
++ {
++ if(started)
++ {
++ Out() << "{" << s.torrent_name << "}," << QDateTime::currentDateTime().toTime_t() << "," << s.download_rate << "," << s.bytes_downloaded << "," << s.bytes_left << "," << s.num_peers << ",DEACTIVATED" <<endl;
++ tmpLog = false;
++ started = false;
++ }
++ toLog = false;
++ }
++ }
++
++ if(counter!=1) tmpLog=false;
++ counter *= -1;
++
++
++
+ if (s.bytes_left == 0)
+ {
++ if(toLog && tmpLog)
++ Out() << "{" << s.torrent_name << "}," << QDateTime::currentDateTime().toTime_t() << "," << s.download_rate << "," << s.bytes_downloaded << "," << 0 << "," << s.num_peers << ",FINISHED" << endl;
++ toLog = false;
++
++
+ setText(7,i18n("finished"));
+ }
+ else
+@@ -124,9 +169,17 @@
+ if( bytes_downloaded < 1 ) //if we just started download use old algorithm
+ {
+ if (s.download_rate == 0)
++ {
++ if(toLog && tmpLog)
++ Out() << "{" << s.torrent_name << "}," << QDateTime::currentDateTime().toTime_t() << "," << 0 << "," << s.bytes_downloaded << "," << s.bytes_left << "," << s.num_peers << ",RUNNING" << endl;
++
+ setText(7,i18n("infinity"));
++ }
+ else
+ {
++ if(toLog && tmpLog)
++ Out() << "{" << s.torrent_name << "}," << QDateTime::currentDateTime().toTime_t() << "," << s.download_rate << "," << s.bytes_downloaded << "," << s.bytes_left << "," << s.num_peers << ",RUNNING" << endl;
++
+ Uint32 secs = (int)floor( (float)s.bytes_left / (float)s.download_rate);
+ setText(7,DurationToString(secs));
+ }
+Index: apps/ktorrent/ktorrentviewitem.h
+===================================================================
+--- apps/ktorrent/ktorrentviewitem.h (revision 472081)
++++ apps/ktorrent/ktorrentviewitem.h (working copy)
+@@ -41,6 +41,10 @@
+ void update();
+
+ private:
++ bool toLog;
++ int counter;
++ bool started;
++ uint start_timestamp;
+ int compare(QListViewItem * i,int col,bool ascending) const;
+ void paintCell(QPainter* p,const QColorGroup & cg,int column,int width,int align);
+
diff --git a/estimation-scripts/processlog.rb b/estimation-scripts/processlog.rb
new file mode 100644
index 0000000..c750ba5
--- /dev/null
+++ b/estimation-scripts/processlog.rb
@@ -0,0 +1,63 @@
+IDX_TIME = 0
+IDX_STATE = 5
+
+def adjustTimestamps(perFile)
+ startTime = 0
+ offset = 0
+ lastDeactivation = -1
+ lastSample = nil
+
+ perFile.each_key do |file|
+ perFile[file].each do |line|
+
+ time = line[0].to_i
+
+ startTime = time if startTime == 0
+
+ time = time - startTime - offset
+
+ line[IDX_TIME] = time.to_s
+
+ if line[IDX_STATE] == 'RUNNING'
+ lastSample = line
+ elsif line[IDX_STATE] == 'ACTIVATED'
+ offset = time - lastDeactivation unless lastDeactivation == -1
+ perFile[file].delete(line)
+ elsif line[IDX_STATE] == 'DEACTIVATED'
+ lastDeactivation = time
+ perFile[file].delete(line)
+ elsif line[IDX_STATE] == 'FINISHED'
+ # print last sample: time speed=0 downloaded left=0 peersTotal
+ # puts "#{line[0].to_i},0,#{lastSample[2].to_i + lastSample[3].to_i},0,#{lastSample[4].to_i}"
+ perFile[file].delete(line)
+ end
+ end
+ end
+end
+
+perFile = Hash.new
+
+inputFile = File.new(ARGV[0])
+
+inputFile.each do |line|
+
+ splitted = line.strip.split(",")
+ if splitted.length == 7
+ key = splitted[0]
+ perFile[key] = Array.new if perFile[key] == nil
+ perFile[key].push(splitted[1..6])
+ end
+
+end
+
+inputFile.close
+
+adjustTimestamps(perFile)
+
+perFile.each_key do |file|
+ outfile = File.new("torrent-#{file}.log", "w")
+ perFile[file].each do |line|
+ outfile.puts line[0..4].join(",")
+ end
+ outfile.close
+end
diff --git a/inst-apps b/inst-apps
new file mode 100644
index 0000000..98c0567
--- /dev/null
+++ b/inst-apps
@@ -0,0 +1,5 @@
+apps
+libktorrent
+plugins
+scripts
+translations
diff --git a/ktorrent.kdevelop b/ktorrent.kdevelop
new file mode 100644
index 0000000..8f22e31
--- /dev/null
+++ b/ktorrent.kdevelop
@@ -0,0 +1,314 @@
+<?xml version = '1.0'?>
+<kdevelop>
+ <general>
+ <author>Joris Guisson</author>
+ <email>joris.guisson@gmail.com</email>
+ <version>0.1</version>
+ <projectmanagement>KDevKDEAutoProject</projectmanagement>
+ <primarylanguage>C++</primarylanguage>
+ <keywords>
+ <keyword>C++</keyword>
+ <keyword>Code</keyword>
+ <keyword>Qt</keyword>
+ <keyword>KDE</keyword>
+ </keywords>
+ <projectdirectory>.</projectdirectory>
+ <absoluteprojectpath>false</absoluteprojectpath>
+ <description/>
+ <ignoreparts/>
+ <versioncontrol>kdevsubversion</versioncontrol>
+ <projectname>ktorrent</projectname>
+ <defaultencoding/>
+ </general>
+ <kdevautoproject>
+ <general>
+ <activetarget>apps/ktorrent/ktorrent</activetarget>
+ <useconfiguration>debug</useconfiguration>
+ <useactivetarget>true</useactivetarget>
+ </general>
+ <run>
+ <mainprogram>/home/joris/ktorrent/trunk-kde3/debug/apps/ktorrent/ktorrent</mainprogram>
+ <terminal>false</terminal>
+ <directoryradio>executable</directoryradio>
+ <customdirectory>/</customdirectory>
+ <programargs>--nofork</programargs>
+ <autocompile>true</autocompile>
+ <envvars/>
+ <runarguments>
+ <ktorrent/>
+ <kttorinfo/>
+ <cachecheck/>
+ <ktcachecheck/>
+ <ktupnptest/>
+ <ktutester/>
+ </runarguments>
+ <debugarguments>
+ <ktorrent>--nofork</ktorrent>
+ </debugarguments>
+ <cwd>
+ <ktorrent>/home/joris/ktorrent/newstuff/debug/./plugins/infowidget</ktorrent>
+ </cwd>
+ <globaldebugarguments>--nofork</globaldebugarguments>
+ <globalcwd>/home/joris</globalcwd>
+ <useglobalprogram>true</useglobalprogram>
+ <autoinstall>false</autoinstall>
+ <autokdesu>false</autokdesu>
+ </run>
+ <make>
+ <envvars>
+ <envvar value="1" name="WANT_AUTOCONF_2_5" />
+ <envvar value="1" name="WANT_AUTOMAKE_1_6" />
+ </envvars>
+ <abortonerror>true</abortonerror>
+ <numberofjobs>1</numberofjobs>
+ <dontact>false</dontact>
+ <makebin/>
+ <prio>0</prio>
+ <runmultiplejobs>false</runmultiplejobs>
+ </make>
+ <configurations>
+ <optimized>
+ <builddir>optimized</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O2 -g0</cxxflags>
+ <envvars/>
+ <configargs/>
+ <topsourcedir/>
+ <cppflags/>
+ <ldflags/>
+ <ccompilerbinary/>
+ <cxxcompilerbinary/>
+ <f77compilerbinary/>
+ <cflags/>
+ <f77flags/>
+ </optimized>
+ <debug>
+ <configargs>--enable-debug=full</configargs>
+ <builddir>debug</builddir>
+ <ccompiler>kdevgccoptions</ccompiler>
+ <cxxcompiler>kdevgppoptions</cxxcompiler>
+ <f77compiler>kdevg77options</f77compiler>
+ <cxxflags>-O0 -g3</cxxflags>
+ <envvars/>
+ <topsourcedir/>
+ <cppflags/>
+ <ldflags/>
+ <ccompilerbinary/>
+ <cxxcompilerbinary/>
+ <f77compilerbinary/>
+ <cflags/>
+ <f77flags/>
+ </debug>
+ </configurations>
+ <subclassing>
+ <subclass uifile="/src/infowidgetbase.ui" sourcefile="/src/infowidget.cpp" />
+ <subclass uifile="/src/infowidgetbase.ui" sourcefile="/src/infowidget.h" />
+ <subclass uifile="/src/fileselectdlgbase.ui" sourcefile="/src/fileselectdlg.cpp" />
+ <subclass uifile="/src/fileselectdlgbase.ui" sourcefile="/src/fileselectdlg.h" />
+ <subclass uifile="/plugins/upnp/upnpwidget.ui" sourcefile="/plugins/upnp/upnpprefwidget.cpp" />
+ <subclass uifile="/plugins/upnp/upnpwidget.ui" sourcefile="/plugins/upnp/upnpprefwidget.h" />
+ <subclass uifile="/plugins/partfileimport/importdlgbase.ui" sourcefile="/plugins/partfileimport/importdialog.cpp" />
+ <subclass uifile="/plugins/partfileimport/importdlgbase.ui" sourcefile="/plugins/partfileimport/importdialog.h" />
+ <subclass uifile="/apps/ktorrent/scandlgbase.ui" sourcefile="/apps/ktorrent/scandialog.cpp" />
+ <subclass uifile="/apps/ktorrent/scandlgbase.ui" sourcefile="/apps/ktorrent/scandialog.h" />
+ <subclass uifile="/plugins/infowidget/statustabbase.ui" sourcefile="/plugins/infowidget/statustab.cpp" />
+ <subclass uifile="/plugins/infowidget/statustabbase.ui" sourcefile="/plugins/infowidget/statustab.h" />
+ <subclass uifile="/apps/ktorrent/speedlimitsdlgbase.ui" sourcefile="/apps/ktorrent/speedlimitsdlg.cpp" />
+ <subclass uifile="/apps/ktorrent/speedlimitsdlgbase.ui" sourcefile="/apps/ktorrent/speedlimitsdlg.h" />
+ </subclassing>
+ </kdevautoproject>
+ <kdevfileview>
+ <groups>
+ <group pattern="*.cpp;*.cxx;*.h" name="Sources" />
+ <group pattern="*.ui" name="User Interface" />
+ <group pattern="*.png" name="Icons" />
+ <group pattern="*.po;*.ts" name="Translations" />
+ <group pattern="*" name="Others" />
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidenonlocation>false</hidenonlocation>
+ </groups>
+ <tree>
+ <hidenonprojectfiles>false</hidenonprojectfiles>
+ <hidepatterns>*.o,*.lo,CVS</hidepatterns>
+ <showvcsfields>true</showvcsfields>
+ </tree>
+ </kdevfileview>
+ <kdevdoctreeview>
+ <ignoretocs>
+ <toc>ada</toc>
+ <toc>ada_bugs_gcc</toc>
+ <toc>bash</toc>
+ <toc>bash_bugs</toc>
+ <toc>clanlib</toc>
+ <toc>w3c-dom-level2-html</toc>
+ <toc>fortran_bugs_gcc</toc>
+ <toc>gnome1</toc>
+ <toc>gnustep</toc>
+ <toc>gtk</toc>
+ <toc>gtk_bugs</toc>
+ <toc>haskell</toc>
+ <toc>haskell_bugs_ghc</toc>
+ <toc>java_bugs_gcc</toc>
+ <toc>java_bugs_sun</toc>
+ <toc>pascal_bugs_fp</toc>
+ <toc>php</toc>
+ <toc>php_bugs</toc>
+ <toc>perl</toc>
+ <toc>perl_bugs</toc>
+ <toc>python</toc>
+ <toc>python_bugs</toc>
+ <toc>ruby</toc>
+ <toc>ruby_bugs</toc>
+ <toc>sdl</toc>
+ <toc>w3c-svg</toc>
+ <toc>sw</toc>
+ <toc>w3c-uaag10</toc>
+ <toc>wxwidgets_bugs</toc>
+ </ignoretocs>
+ <ignoreqt_xml>
+ <toc>qmake User Guide</toc>
+ </ignoreqt_xml>
+ </kdevdoctreeview>
+ <kdevdebugger>
+ <general>
+ <dbgshell>libtool</dbgshell>
+ <programargs>--nofork</programargs>
+ <gdbpath/>
+ <breakonloadinglibs>false</breakonloadinglibs>
+ <separatetty>false</separatetty>
+ <floatingtoolbar>false</floatingtoolbar>
+ <runappinappdirectory>true</runappinappdirectory>
+ <configGdbScript/>
+ <runShellScript/>
+ <runGdbScript/>
+ <raiseGDBOnStart>false</raiseGDBOnStart>
+ </general>
+ <display>
+ <staticmembers>true</staticmembers>
+ <demanglenames>true</demanglenames>
+ <outputradix>10</outputradix>
+ </display>
+ </kdevdebugger>
+ <kdevfilecreate>
+ <filetypes/>
+ <useglobaltypes>
+ <type ext="ui" />
+ <type ext="cpp" />
+ <type ext="h" />
+ </useglobaltypes>
+ </kdevfilecreate>
+ <kdevcvs>
+ <cvsoptions>-f</cvsoptions>
+ <commitoptions/>
+ <updateoptions>-dP</updateoptions>
+ <addoptions/>
+ <removeoptions>-f</removeoptions>
+ <diffoptions>-u3 -p</diffoptions>
+ <logoptions/>
+ <rshoptions/>
+ </kdevcvs>
+ <cppsupportpart>
+ <codecompletion/>
+ <filetemplates>
+ <choosefiles>false</choosefiles>
+ <interfaceURL/>
+ <implementationURL/>
+ <interfacesuffix>.h</interfacesuffix>
+ <implementationsuffix>.cpp</implementationsuffix>
+ <lowercasefilenames>true</lowercasefilenames>
+ </filetemplates>
+ </cppsupportpart>
+ <kdevclassview>
+ <folderhierarchy>true</folderhierarchy>
+ <depthoffolders>2</depthoffolders>
+ </kdevclassview>
+ <kdevdocumentation>
+ <projectdoc>
+ <docsystem>Doxygen Documentation Collection</docsystem>
+ <docurl>ktorrent.tag</docurl>
+ <usermanualurl/>
+ </projectdoc>
+ </kdevdocumentation>
+ <substmap>
+ <APPNAME>ktorrent</APPNAME>
+ <APPNAMELC>ktorrent</APPNAMELC>
+ <APPNAMESC>Ktorrent</APPNAMESC>
+ <APPNAMEUC>KTORRENT</APPNAMEUC>
+ <AUTHOR>Joris Guisson</AUTHOR>
+ <EMAIL>joris.guisson@gmail.com</EMAIL>
+ <LICENSE>GPL</LICENSE>
+ <LICENSEFILE>COPYING</LICENSEFILE>
+ <VERSION>0.1</VERSION>
+ <YEAR>2005</YEAR>
+ <dest>/home/joris/ktorrent/code</dest>
+ </substmap>
+ <kdevcppsupport>
+ <references/>
+ <codecompletion>
+ <includeGlobalFunctions>true</includeGlobalFunctions>
+ <includeTypes>true</includeTypes>
+ <includeEnums>true</includeEnums>
+ <includeTypedefs>false</includeTypedefs>
+ <automaticCodeCompletion>true</automaticCodeCompletion>
+ <automaticArgumentsHint>true</automaticArgumentsHint>
+ <automaticHeaderCompletion>true</automaticHeaderCompletion>
+ <codeCompletionDelay>250</codeCompletionDelay>
+ <argumentsHintDelay>400</argumentsHintDelay>
+ <headerCompletionDelay>250</headerCompletionDelay>
+ <showOnlyAccessibleItems>false</showOnlyAccessibleItems>
+ <completionBoxItemOrder>0</completionBoxItemOrder>
+ <howEvaluationContextMenu>true</howEvaluationContextMenu>
+ <showCommentWithArgumentHint>true</showCommentWithArgumentHint>
+ <statusBarTypeEvaluation>false</statusBarTypeEvaluation>
+ <namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
+ <processPrimaryTypes>true</processPrimaryTypes>
+ <processFunctionArguments>false</processFunctionArguments>
+ <preProcessAllHeaders>false</preProcessAllHeaders>
+ <parseMissingHeaders>false</parseMissingHeaders>
+ <resolveIncludePaths>true</resolveIncludePaths>
+ <alwaysParseInBackground>true</alwaysParseInBackground>
+ <usePermanentCaching>true</usePermanentCaching>
+ <alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
+ <includePaths>.;</includePaths>
+ <parseMissingHeadersExperimental>false</parseMissingHeadersExperimental>
+ <resolveIncludePathsUsingMakeExperimental>false</resolveIncludePathsUsingMakeExperimental>
+ </codecompletion>
+ <creategettersetter>
+ <prefixGet/>
+ <prefixSet>set</prefixSet>
+ <prefixVariable>m_,_</prefixVariable>
+ <parameterName>theValue</parameterName>
+ <inlineGet>true</inlineGet>
+ <inlineSet>true</inlineSet>
+ </creategettersetter>
+ <designerintegration>
+ <qtdesigner/>
+ </designerintegration>
+ <qt>
+ <used>true</used>
+ <version>3</version>
+ <root>/usr/share/qt3</root>
+ <includestyle>3</includestyle>
+ <designerintegration>EmbeddedKDevDesigner</designerintegration>
+ <qmake>/usr/bin/qmake</qmake>
+ <designer>/usr/bin/designer</designer>
+ <designerpluginpaths/>
+ </qt>
+ <splitheadersource>
+ <enabled>false</enabled>
+ <synchronize>true</synchronize>
+ <orientation>Vertical</orientation>
+ </splitheadersource>
+ </kdevcppsupport>
+ <kdevvisualadvance>
+ <emulator>VisualBoyAdvance</emulator>
+ <binary/>
+ <addOptions/>
+ <terminal>false</terminal>
+ <fullscreen>false</fullscreen>
+ <graphicFilter>-f0</graphicFilter>
+ <scaling>-1</scaling>
+ </kdevvisualadvance>
+</kdevelop>
diff --git a/libktorrent/Makefile.am b/libktorrent/Makefile.am
new file mode 100644
index 0000000..cea2eaa
--- /dev/null
+++ b/libktorrent/Makefile.am
@@ -0,0 +1,22 @@
+INCLUDES = -I$(srcdir)/. $(all_includes)
+SUBDIRS = util torrent kademlia interfaces migrate mse datachecker net
+METASOURCES = AUTO
+
+lib_LTLIBRARIES = libktorrent.la
+libktorrent_la_LDFLAGS = ${KDE_RPATH} $(all_libraries) -release $(VERSION)
+
+kde_kcfg_DATA = ktorrent.kcfg
+
+# make sure settings.h is built before anything else
+BUILT_SOURCES=settings.h
+
+noinst_HEADERS = expandablewidget.h functions.h ktversion.h labelview.h \
+ pluginmanager.h pluginmanagerprefpage.h
+libktorrent_la_SOURCES = expandablewidget.cpp functions.cpp labelview.cpp \
+ labelviewitembase.ui pluginmanager.cpp pluginmanagerprefpage.cpp pluginmanagerwidget.ui \
+ settings.kcfgc
+libktorrent_la_LIBADD = ../libktorrent/net/libnet.la \
+ ../libktorrent/datachecker/libdatachecker.la ../libktorrent/mse/libmse.la ../libktorrent/migrate/libmigrate.la \
+ ../libktorrent/util/libutil.la ../libktorrent/torrent/libtorrent.la \
+ ../libktorrent/kademlia/libkademlia.la ../libktorrent/interfaces/libinterfaces.la $(LIB_KPARTS)
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/datachecker/Makefile.am b/libktorrent/datachecker/Makefile.am
new file mode 100644
index 0000000..b5e9ee0
--- /dev/null
+++ b/libktorrent/datachecker/Makefile.am
@@ -0,0 +1,8 @@
+INCLUDES = -I$(srcdir)/.. -I$(srcdir)/. $(all_includes)
+METASOURCES = AUTO
+libdatachecker_la_LDFLAGS = $(all_libraries)
+noinst_LTLIBRARIES = libdatachecker.la
+libdatachecker_la_SOURCES = datachecker.cpp multidatachecker.cpp \
+ singledatachecker.cpp datacheckerlistener.cpp datacheckerthread.cpp
+noinst_HEADERS = datacheckerlistener.h datacheckerthread.h
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/datachecker/datachecker.cpp b/libktorrent/datachecker/datachecker.cpp
new file mode 100644
index 0000000..04bd08e
--- /dev/null
+++ b/libktorrent/datachecker/datachecker.cpp
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "datachecker.h"
+
+namespace bt {
+
+ DataChecker::DataChecker() : listener(0)
+ {
+ }
+
+
+ DataChecker::~DataChecker()
+ {
+ }
+
+
+}
diff --git a/libktorrent/datachecker/datachecker.h b/libktorrent/datachecker/datachecker.h
new file mode 100644
index 0000000..e181925
--- /dev/null
+++ b/libktorrent/datachecker/datachecker.h
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTDATACHECKER_H
+#define BTDATACHECKER_H
+
+#include <util/bitset.h>
+#include "datacheckerlistener.h"
+
+class QString;
+
+
+namespace bt
+{
+ class Torrent;
+
+
+ /**
+ * @author Joris Guisson
+ *
+ * Checks which data is downloaded, given a torrent and a file or directory containing
+ * files of the torrent.
+ */
+ class DataChecker
+ {
+ public:
+ DataChecker();
+ virtual ~DataChecker();
+
+ /// Set the listener
+ void setListener(DataCheckerListener* l) {listener = l;}
+
+ /**
+ * Check to see which chunks have been downloaded of a torrent, and which chunks fail.
+ * The corresponding bitsets should be filled with this information.
+ * If anything goes wrong and Error should be thrown.
+ * @param path path to the file or dir (this needs to end with the name suggestion of the torrent)
+ * @param tor The torrent
+ * @param dnddir DND dir, optional argument if we know this
+ */
+ virtual void check(const QString & path,const Torrent & tor,const QString & dnddir) = 0;
+
+ /**
+ * Get the BitSet representing all the downloaded chunks.
+ */
+ const BitSet & getDownloaded() const {return downloaded;}
+
+ /**
+ * Get the BitSet representing all the failed chunks.
+ */
+ const BitSet & getFailed() const {return failed;}
+
+ /// Get the listener
+ DataCheckerListener* getListener() {return listener;}
+ protected:
+ BitSet failed,downloaded;
+ DataCheckerListener* listener;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/datachecker/datacheckerlistener.cpp b/libktorrent/datachecker/datacheckerlistener.cpp
new file mode 100644
index 0000000..a4a2201
--- /dev/null
+++ b/libktorrent/datachecker/datacheckerlistener.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "datacheckerlistener.h"
+
+namespace bt
+{
+
+ DataCheckerListener::DataCheckerListener(bool auto_import) : stopped(false),auto_import(auto_import)
+ {}
+
+
+ DataCheckerListener::~DataCheckerListener()
+ {}
+
+
+}
diff --git a/libktorrent/datachecker/datacheckerlistener.h b/libktorrent/datachecker/datacheckerlistener.h
new file mode 100644
index 0000000..a770bab
--- /dev/null
+++ b/libktorrent/datachecker/datacheckerlistener.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTDATACHECKERLISTENER_H
+#define BTDATACHECKERLISTENER_H
+
+#include <util/constants.h>
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class DataCheckerListener
+ {
+ public:
+ DataCheckerListener(bool auto_import);
+ virtual ~DataCheckerListener();
+
+ /**
+ * Called when a chunk has been proccessed.
+ * @param num The number processed
+ * @param total The total number of pieces to process
+ */
+ virtual void progress(Uint32 num,Uint32 total) = 0;
+
+ /**
+ * Called when a failed or dowloaded chunk is found.
+ * @param num_failed The number of failed chunks
+ * @param num_downloaded Number of downloaded chunks
+ */
+ virtual void status(Uint32 num_failed,Uint32 num_downloaded) = 0;
+
+ /**
+ * Data check has been finished.
+ */
+ virtual void finished() = 0;
+
+ /**
+ * Test if we need to stop.
+ */
+ bool needToStop() const {return stopped;}
+
+ /// Check if the check has been stopped
+ bool isStopped() const {return stopped;}
+
+ /// Is this an auto_import
+ bool isAutoImport() const {return auto_import;}
+
+ /**
+ * Stop the data check.
+ */
+ void stop() {stopped = true;}
+ private:
+ bool stopped;
+
+ protected:
+ bool auto_import;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/datachecker/datacheckerthread.cpp b/libktorrent/datachecker/datacheckerthread.cpp
new file mode 100644
index 0000000..12a58d7
--- /dev/null
+++ b/libktorrent/datachecker/datacheckerthread.cpp
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/error.h>
+#include <torrent/torrent.h>
+#include "datachecker.h"
+#include "datacheckerthread.h"
+
+namespace bt
+{
+
+ DataCheckerThread::DataCheckerThread(DataChecker* dc,
+ const QString & path,
+ const Torrent & tor,
+ const QString & dnddir)
+ : dc(dc),path(path),tor(tor),dnddir(dnddir)
+ {
+ running = true;
+ }
+
+
+ DataCheckerThread::~DataCheckerThread()
+ {
+ delete dc;
+ }
+
+ void DataCheckerThread::run()
+ {
+ try
+ {
+ dc->check(path,tor,dnddir);
+ }
+ catch (bt::Error & e)
+ {
+ error = e.toString();
+ Out(SYS_GEN|LOG_DEBUG) << error << endl;
+ }
+ running = false;
+ }
+
+}
diff --git a/libktorrent/datachecker/datacheckerthread.h b/libktorrent/datachecker/datacheckerthread.h
new file mode 100644
index 0000000..749e3e8
--- /dev/null
+++ b/libktorrent/datachecker/datacheckerthread.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTDATACHECKERTHREAD_H
+#define BTDATACHECKERTHREAD_H
+
+#include <qthread.h>
+
+namespace bt
+{
+ class Torrent;
+ class DataChecker;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Thread which runs the data check.
+ */
+ class DataCheckerThread : public QThread
+ {
+ DataChecker* dc;
+ QString path;
+ const Torrent & tor;
+ QString dnddir;
+ bool running;
+ QString error;
+ public:
+ DataCheckerThread(DataChecker* dc,const QString & path,const Torrent & tor,const QString & dnddir);
+ virtual ~DataCheckerThread();
+
+ virtual void run();
+
+ /// Get the data checker
+ DataChecker* getDataChecker() {return dc;}
+
+ /// Are we still running
+ bool isRunning() const {return running;}
+
+ /// Get the error (if any occured)
+ QString getError() const {return error;}
+ };
+
+}
+
+#endif
diff --git a/libktorrent/datachecker/multidatachecker.cpp b/libktorrent/datachecker/multidatachecker.cpp
new file mode 100644
index 0000000..3c26721
--- /dev/null
+++ b/libktorrent/datachecker/multidatachecker.cpp
@@ -0,0 +1,201 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson & Maggioni Marcello *
+ * joris.guisson@gmail.com *
+ * marcello.maggioni@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kapplication.h>
+#include <util/log.h>
+#include <util/file.h>
+#include <util/fileops.h>
+#include <util/error.h>
+#include <util/array.h>
+#include <util/functions.h>
+#include <torrent/dndfile.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include <torrent/torrentfile.h>
+#include "multidatachecker.h"
+
+namespace bt
+{
+
+ MultiDataChecker::MultiDataChecker(): DataChecker(),buf(0)
+ {}
+
+
+ MultiDataChecker::~MultiDataChecker()
+ {
+ delete [] buf;
+ }
+
+ void MultiDataChecker::check(const QString& path, const Torrent& tor,const QString & dnddir)
+ {
+ Uint32 num_chunks = tor.getNumChunks();
+ // initialize the bitsets
+ downloaded = BitSet(num_chunks);
+ failed = BitSet(num_chunks);
+
+ cache = path;
+ if (!cache.endsWith(bt::DirSeparator()))
+ cache += bt::DirSeparator();
+
+ dnd_dir = dnddir;
+ if (!dnddir.endsWith(bt::DirSeparator()))
+ dnd_dir += bt::DirSeparator();
+
+ Uint64 chunk_size = tor.getChunkSize();
+ Uint32 cur_chunk = 0;
+ TimeStamp last_update_time = bt::GetCurrentTime();
+
+ buf = new Uint8[chunk_size];
+
+ for (cur_chunk = 0;cur_chunk < num_chunks;cur_chunk++)
+ {
+ Uint32 cs = (cur_chunk == num_chunks - 1) ? tor.getFileLength() % chunk_size : chunk_size;
+ if (cs == 0)
+ cs = chunk_size;
+ if (!loadChunk(cur_chunk,cs,tor))
+ {
+ downloaded.set(cur_chunk,false);
+ failed.set(cur_chunk,true);
+ continue;
+ }
+
+ bool ok = (SHA1Hash::generate(buf,cs) == tor.getHash(cur_chunk));
+ downloaded.set(cur_chunk,ok);
+ failed.set(cur_chunk,!ok);
+
+ if (listener)
+ {
+ listener->status(failed.numOnBits(),downloaded.numOnBits());
+ listener->progress(cur_chunk,num_chunks);
+ if (listener->needToStop())
+ return;
+ }
+
+ TimeStamp now = bt::GetCurrentTime();
+ if (now - last_update_time > 1000)
+ {
+ Out() << "Checked " << cur_chunk << " chunks" << endl;
+ // KApplication::kApplication()->processEvents();
+ last_update_time = now;
+ }
+ }
+ }
+
+ static Uint32 ReadFullChunk(Uint32 chunk,Uint32 cs,
+ const TorrentFile & tf,
+ const Torrent & tor,
+ Uint8* buf,
+ const QString & cache)
+ {
+ File fptr;
+ if (!fptr.open(cache + tf.getPath(), "rb"))
+ {
+ Out() << QString("Warning : Cannot open %1 : %2").arg(cache +
+ tf.getPath()).arg(fptr.errorString()) << endl;
+ return 0;
+ }
+
+ Uint64 off = tf.fileOffset(chunk,tor.getChunkSize());
+ fptr.seek(File::BEGIN,off);
+ return fptr.read(buf,cs);
+ }
+
+ bool MultiDataChecker::loadChunk(Uint32 ci,Uint32 cs,const Torrent & tor)
+ {
+ QValueList<Uint32> tflist;
+ tor.calcChunkPos(ci,tflist);
+
+ // one file is simple
+ if (tflist.count() == 1)
+ {
+ const TorrentFile & f = tor.getFile(tflist.first());
+ if (!f.doNotDownload())
+ {
+ ReadFullChunk(ci,cs,f,tor,buf,cache);
+ return true;
+ }
+ return false;
+ }
+
+ Uint64 read = 0; // number of bytes read
+ for (Uint32 i = 0;i < tflist.count();i++)
+ {
+ const TorrentFile & f = tor.getFile(tflist[i]);
+
+ // first calculate offset into file
+ // only the first file can have an offset
+ // the following files will start at the beginning
+ Uint64 off = 0;
+ if (i == 0)
+ off = f.fileOffset(ci,tor.getChunkSize());
+
+ Uint32 to_read = 0;
+ // then the amount of data we can read from this file
+ if (i == 0)
+ to_read = f.getLastChunkSize();
+ else if (i == tflist.count() - 1)
+ to_read = cs - read;
+ else
+ to_read = f.getSize();
+
+ // read part of data
+ if (f.doNotDownload())
+ {
+ if (!dnd_dir.isNull() && bt::Exists(dnd_dir + f.getPath() + ".dnd"))
+ {
+ Uint32 ret = 0;
+ DNDFile dfd(dnd_dir + f.getPath() + ".dnd");
+ if (i == 0)
+ ret = dfd.readLastChunk(buf,read,cs);
+ else if (i == tflist.count() - 1)
+ ret = dfd.readFirstChunk(buf,read,cs);
+ else
+ ret = dfd.readFirstChunk(buf,read,cs);
+
+ if (ret > 0 && ret != to_read)
+ Out() << "Warning : MultiDataChecker::load ret != to_read (dnd)" << endl;
+ }
+ }
+ else
+ {
+ if (!bt::Exists(cache + f.getPath()) || bt::FileSize(cache + f.getPath()) < off)
+ return false;
+
+ File fptr;
+ if (!fptr.open(cache + f.getPath(), "rb"))
+ {
+ Out() << QString("Warning : Cannot open %1 : %2").arg(cache +
+ f.getPath()).arg(fptr.errorString()) << endl;
+ return false;
+ }
+ else
+ {
+ fptr.seek(File::BEGIN,off);
+ if (fptr.read(buf+read,to_read) != to_read)
+ Out() << "Warning : MultiDataChecker::load ret != to_read" << endl;
+ }
+ }
+ read += to_read;
+ }
+ return true;
+ }
+}
diff --git a/libktorrent/datachecker/multidatachecker.h b/libktorrent/datachecker/multidatachecker.h
new file mode 100644
index 0000000..d095e99
--- /dev/null
+++ b/libktorrent/datachecker/multidatachecker.h
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTMULTIDATACHECKER_H
+#define BTMULTIDATACHECKER_H
+
+#include "datachecker.h"
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class MultiDataChecker : public DataChecker
+ {
+ public:
+ MultiDataChecker();
+ virtual ~MultiDataChecker();
+
+ virtual void check(const QString& path, const Torrent& tor,const QString & dnddir);
+ private:
+ bool loadChunk(Uint32 ci,Uint32 cs,const Torrent & to);
+
+ private:
+ QString cache;
+ QString dnd_dir;
+ Uint8* buf;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/datachecker/singledatachecker.cpp b/libktorrent/datachecker/singledatachecker.cpp
new file mode 100644
index 0000000..0579338
--- /dev/null
+++ b/libktorrent/datachecker/singledatachecker.cpp
@@ -0,0 +1,103 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kapplication.h>
+#include <util/log.h>
+#include <util/file.h>
+#include <util/error.h>
+#include <util/array.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include "singledatachecker.h"
+
+namespace bt
+{
+
+ SingleDataChecker::SingleDataChecker(): DataChecker()
+ {}
+
+
+ SingleDataChecker::~SingleDataChecker()
+ {}
+
+
+ void SingleDataChecker::check(const QString& path, const Torrent& tor,const QString &)
+ {
+ // open the file
+ Uint32 num_chunks = tor.getNumChunks();
+ Uint32 chunk_size = tor.getChunkSize();
+ File fptr;
+ if (!fptr.open(path,"rb"))
+ {
+ throw Error(i18n("Cannot open file : %1 : %2")
+ .arg(path).arg( fptr.errorString()));
+ }
+
+ // initialize the bitsets
+ downloaded = BitSet(num_chunks);
+ failed = BitSet(num_chunks);
+
+ TimeStamp last_update_time = bt::GetCurrentTime();
+
+ // loop over all chunks
+ Array<Uint8> buf(chunk_size);
+ for (Uint32 i = 0;i < num_chunks;i++)
+ {
+ if (listener)
+ {
+ listener->progress(i,num_chunks);
+ if (listener->needToStop()) // if we need to stop just return
+ return;
+ }
+
+ TimeStamp now = bt::GetCurrentTime();
+ if (now - last_update_time > 1000)
+ {
+ Out(SYS_DIO|LOG_DEBUG) << "Checked " << i << " chunks" << endl;
+ last_update_time = now;
+ }
+
+ if (!fptr.eof())
+ {
+ // read the chunk
+ Uint32 size = i == num_chunks - 1 && tor.getFileLength() % tor.getChunkSize() > 0 ?
+ tor.getFileLength() % tor.getChunkSize() : (Uint32)tor.getChunkSize();
+
+ fptr.seek(File::BEGIN,(Int64)i*tor.getChunkSize());
+ fptr.read(buf,size);
+ // generate and test hash
+ SHA1Hash h = SHA1Hash::generate(buf,size);
+ bool ok = (h == tor.getHash(i));
+ downloaded.set(i,ok);
+ failed.set(i,!ok);
+ }
+ else
+ {
+ // at end of file so set to default values for a failed chunk
+ downloaded.set(i,false);
+ failed.set(i,true);
+ }
+ if (listener)
+ listener->status(failed.numOnBits(),downloaded.numOnBits());
+ }
+ }
+
+}
diff --git a/libktorrent/datachecker/singledatachecker.h b/libktorrent/datachecker/singledatachecker.h
new file mode 100644
index 0000000..20107b3
--- /dev/null
+++ b/libktorrent/datachecker/singledatachecker.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSINGLEDATACHECKER_H
+#define BTSINGLEDATACHECKER_H
+
+#include "datachecker.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ *
+ * Data checker for single file torrents.
+ */
+ class SingleDataChecker : public DataChecker
+ {
+ public:
+ SingleDataChecker();
+ virtual ~SingleDataChecker();
+
+ virtual void check(const QString& path, const Torrent& tor,const QString & dnddir);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/expandablewidget.cpp b/libktorrent/expandablewidget.cpp
new file mode 100644
index 0000000..cdac376
--- /dev/null
+++ b/libktorrent/expandablewidget.cpp
@@ -0,0 +1,179 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qlayout.h>
+#include <qsplitter.h>
+#include "expandablewidget.h"
+
+namespace kt
+{
+
+ ExpandableWidget::ExpandableWidget(QWidget* child,QWidget *parent, const char *name)
+ : QWidget(parent, name)
+ {
+ top_layout = new QHBoxLayout(this);
+ child->reparent(this,QPoint(),true);
+ // make top of stack
+ begin = new StackElement;
+ begin->w = child;
+ top_layout->add(child);
+ }
+
+
+ ExpandableWidget::~ExpandableWidget()
+ {
+ if (begin)
+ {
+ // delete begin->w;
+ delete begin;
+ }
+ }
+
+ void ExpandableWidget::expand(QWidget* w,Position pos)
+ {
+ // create new element
+ StackElement* se = new StackElement;
+ se->w = w;
+ se->pos = pos;
+ se->next = begin;
+
+ // remove old top from layout
+ top_layout->remove(begin->w);
+
+ // create new toplevel splitter
+ Qt::Orientation orientation = (pos == RIGHT || pos == LEFT) ? Qt::Horizontal : Qt::Vertical;
+ QSplitter* s = new QSplitter(orientation,this);;
+ se->s = s;
+
+ // reparent w and the bottom widget to s
+ w->reparent(s,QPoint(),false);
+ if (begin->s)
+ begin->s->reparent(s,QPoint(),false);
+ else
+ begin->w->reparent(s,QPoint(),false);
+
+ // add w and the bottom widget to s
+ if (pos == RIGHT || pos == ABOVE)
+ {
+ s->moveToFirst(w);
+ s->setResizeMode(w,QSplitter::KeepSize);
+ s->moveToLast(begin->s ? begin->s : begin->w);
+ }
+ else
+ {
+ s->moveToFirst(begin->s ? begin->s : begin->w);
+ s->moveToLast(w);
+ s->setResizeMode(w,QSplitter::KeepSize);
+ }
+ // make se new top of stack
+ begin = se;
+
+ // add toplevel splitter to layout
+ top_layout->add(s);
+
+ // show s
+ s->show();
+ }
+
+ void ExpandableWidget::remove(QWidget* w)
+ {
+ // find the correct stackelement
+ StackElement* se = begin;
+ StackElement* prev = 0; // element before se
+ while (se->w != w && se->next)
+ {
+ prev = se;
+ se = se->next;
+ }
+
+ // do not remove last
+ if (!se->next)
+ return;
+
+ if (!prev)
+ {
+ // we need to remove the first
+ top_layout->remove(se->s);
+ // reparent current top to 0
+ se->w->reparent(0,QPoint(),false);
+ se->s->reparent(0,QPoint(),false);
+ // set new top
+ begin = se->next;
+
+
+ if (begin->s)
+ {
+ begin->s->reparent(this,QPoint(),false);
+ top_layout->add(begin->s);
+ begin->s->show();
+ }
+ else
+ {
+ begin->w->reparent(this,QPoint(),false);
+ top_layout->add(begin->w);
+ begin->w->show();
+ }
+
+ se->next = 0;
+ // delete splitter and se
+ delete se->s;
+ delete se;
+ }
+ else
+ {
+ StackElement* next = se->next;
+ // isolate the node
+ se->next = 0;
+ prev->next = next;
+
+ // reparent se to 0
+ se->s->reparent(0,QPoint(),false);
+ se->w->reparent(0,QPoint(),false);
+
+ // reparent se->next to prev
+ if (next->s)
+ next->s->reparent(prev->s,QPoint(),false);
+ else
+ next->w->reparent(prev->s,QPoint(),false);
+
+ // update prev's splitter
+ if (prev->pos == RIGHT || prev->pos == ABOVE)
+ {
+ prev->s->moveToFirst(prev->w);
+ prev->s->setResizeMode(prev->w,QSplitter::KeepSize);
+ prev->s->moveToLast(next->s ? next->s : next->w);
+ prev->s->setResizeMode(next->s ? next->s : next->w,QSplitter::KeepSize);
+ }
+ else
+ {
+ prev->s->moveToFirst(next->s ? next->s : next->w);
+ prev->s->setResizeMode(next->s ? next->s : next->w,QSplitter::KeepSize);
+ prev->s->moveToLast(prev->w);
+ prev->s->setResizeMode(prev->w,QSplitter::KeepSize);
+ }
+
+ // delete se and splitter
+ delete se->s;
+ delete se;
+ prev->next->w->show();
+ prev->s->show();
+ }
+ }
+}
+#include "expandablewidget.moc"
diff --git a/libktorrent/expandablewidget.h b/libktorrent/expandablewidget.h
new file mode 100644
index 0000000..823ce5f
--- /dev/null
+++ b/libktorrent/expandablewidget.h
@@ -0,0 +1,89 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTEXPANDABLEWIDGET_H
+#define KTEXPANDABLEWIDGET_H
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <interfaces/guiinterface.h>
+
+class QSplitter;
+class QHBoxLayout;
+
+namespace kt
+{
+
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Widget which can be expanded with more widgets
+ *
+ * This is a sort of container widget, which at the minimum has
+ * one child widget. It allows to add more widgets separating the new widget
+ * and everything which was previously in the container by a separator.
+ */
+ class ExpandableWidget : public QWidget
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, the first child must be provided.
+ * @param child The first child
+ * @param parent The parent
+ * @param name The name
+ */
+ ExpandableWidget(QWidget* child,QWidget *parent = 0, const char *name = 0);
+ virtual ~ExpandableWidget();
+
+
+
+ /**
+ * Expand the widget. This will ensure the proper parent child relations.
+ * @param w The widget
+ * @param pos It's position relative to the current widget
+ */
+ void expand(QWidget* w,Position pos);
+
+ /**
+ * Remove a widget. This will ensure the proper parent child relations.
+ * The widget w will become parentless. Note the first child will never be removed.
+ * @param w The widget
+ */
+ void remove(QWidget* w);
+ private:
+ struct StackElement
+ {
+ QWidget* w;
+ QSplitter* s;
+ Position pos;
+ StackElement* next;
+
+ StackElement() : w(0),s(0),pos(LEFT),next(0) {}
+ ~StackElement() {delete next;}
+ };
+
+ StackElement* begin;
+ QHBoxLayout* top_layout;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/functions.cpp b/libktorrent/functions.cpp
new file mode 100644
index 0000000..3bc4f88
--- /dev/null
+++ b/libktorrent/functions.cpp
@@ -0,0 +1,40 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qdatetime.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <util/functions.h>
+#include "functions.h"
+
+using namespace bt;
+
+namespace kt
+{
+ QString DataDir()
+ {
+ QString str = KGlobal::dirs()->saveLocation("data","ktorrent");
+ if (!str.endsWith(bt::DirSeparator()))
+ return str + bt::DirSeparator();
+ else
+ return str;
+ }
+
+}
diff --git a/libktorrent/functions.h b/libktorrent/functions.h
new file mode 100644
index 0000000..02f7870
--- /dev/null
+++ b/libktorrent/functions.h
@@ -0,0 +1,35 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 FUNCTIONS_H
+#define FUNCTIONS_H
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace kt
+{
+ /**
+ * Will return the data directory
+ * @return ~/.kde/share/apps/ktorrent/
+ */
+ QString DataDir();
+}
+
+#endif
diff --git a/libktorrent/interfaces/Makefile.am b/libktorrent/interfaces/Makefile.am
new file mode 100644
index 0000000..dca1a4a
--- /dev/null
+++ b/libktorrent/interfaces/Makefile.am
@@ -0,0 +1,15 @@
+INCLUDES = -I$(srcdir)/.. $(all_includes)
+METASOURCES = AUTO
+libinterfaces_la_LDFLAGS = $(all_libraries)
+noinst_LTLIBRARIES = libinterfaces.la
+noinst_HEADERS = plugin.h coreinterface.h guiinterface.h torrentinterface.h \
+ monitorinterface.h chunkdownloadinterface.h peerinterface.h torrentfileinterface.h \
+ filetreeitem.h filetreediritem.h logmonitorinterface.h ipblockinginterface.h \
+ trackerslist.h peersource.h exitoperation.h
+libinterfaces_la_SOURCES = plugin.cpp coreinterface.cpp guiinterface.cpp \
+ prefpageinterface.cpp torrentinterface.cpp monitorinterface.cpp chunkdownloadinterface.cpp \
+ peerinterface.cpp torrentfileinterface.cpp filetreeitem.cpp filetreediritem.cpp \
+ functions.cpp logmonitorinterface.cpp ipblockinginterface.cpp trackerslist.cpp \
+ peersource.cpp exitoperation.cpp
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/interfaces/chunkdownloadinterface.cpp b/libktorrent/interfaces/chunkdownloadinterface.cpp
new file mode 100644
index 0000000..d991605
--- /dev/null
+++ b/libktorrent/interfaces/chunkdownloadinterface.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "chunkdownloadinterface.h"
+
+namespace kt
+{
+
+ ChunkDownloadInterface::ChunkDownloadInterface()
+ {}
+
+
+ ChunkDownloadInterface::~ChunkDownloadInterface()
+ {}
+
+
+}
diff --git a/libktorrent/interfaces/chunkdownloadinterface.h b/libktorrent/interfaces/chunkdownloadinterface.h
new file mode 100644
index 0000000..161a534
--- /dev/null
+++ b/libktorrent/interfaces/chunkdownloadinterface.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTCHUNKDOWNLOADINTERFACE_H
+#define KTCHUNKDOWNLOADINTERFACE_H
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace kt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface for a ChunkDownload
+ *
+ * This class provides the interface for a ChunkDownload object.
+ */
+ class ChunkDownloadInterface
+ {
+ public:
+ ChunkDownloadInterface();
+ virtual ~ChunkDownloadInterface();
+
+ struct Stats
+ {
+ /// The PeerID of the current downloader
+ QString current_peer_id;
+ /// The current download speed
+ bt::Uint32 download_speed;
+ /// The index of the chunk
+ bt::Uint32 chunk_index;
+ /// The number of pieces of the chunk which have been downloaded
+ bt::Uint32 pieces_downloaded;
+ /// The total number of pieces of the chunk
+ bt::Uint32 total_pieces;
+ /// The number of assigned downloaders
+ bt::Uint32 num_downloaders;
+ };
+
+ virtual void getStats(Stats & s) = 0;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/coreinterface.cpp b/libktorrent/interfaces/coreinterface.cpp
new file mode 100644
index 0000000..cb350d8
--- /dev/null
+++ b/libktorrent/interfaces/coreinterface.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "coreinterface.h"
+
+namespace kt
+{
+
+ CoreInterface::CoreInterface()
+ {}
+
+
+ CoreInterface::~CoreInterface()
+ {}
+}
+
+#include "coreinterface.moc"
diff --git a/libktorrent/interfaces/coreinterface.h b/libktorrent/interfaces/coreinterface.h
new file mode 100644
index 0000000..613ba8e
--- /dev/null
+++ b/libktorrent/interfaces/coreinterface.h
@@ -0,0 +1,258 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTCOREINTERFACE_H
+#define KTCOREINTERFACE_H
+
+#include <kurl.h>
+#include <qobject.h>
+#include <util/constants.h>
+#include <torrent/queuemanager.h>
+
+///Stats struct
+struct CurrentStats
+{
+ bt::Uint32 download_speed;
+ bt::Uint32 upload_speed;
+ bt::Uint64 bytes_downloaded;
+ bt::Uint64 bytes_uploaded;
+};
+
+namespace bt
+{
+ class QueueManager;
+}
+namespace kt
+{
+ class TorrentInterface;
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface for plugins to communicate with the application's core
+ *
+ * This interface provides the plugin with the functionality to modify
+ * the applications core, the core is responsible for managing all
+ * TorrentControl objects.
+ */
+ class CoreInterface : public QObject
+ {
+ Q_OBJECT
+ public:
+ CoreInterface();
+ virtual ~CoreInterface();
+
+ /**
+ * Set the maximum number of simultanious downloads.
+ * @param max The max num (0 == no limit)
+ */
+ virtual void setMaxDownloads(int max) = 0;
+
+ virtual void setMaxSeeds(int max) = 0;
+
+ virtual void setMaxDownloadSpeed(int v) = 0;
+ virtual void setMaxUploadSpeed(int v) = 0;
+
+ /**
+ * Set wether or not we should keep seeding after
+ * a download has finished.
+ * @param ks Keep seeding yes or no
+ */
+ virtual void setKeepSeeding(bool ks) = 0;
+
+ /**
+ * Change the data dir. This involves copying
+ * all data from the old dir to the new.
+ * This can offcourse go horribly wrong, therefore
+ * if it doesn't succeed it returns false
+ * and leaves everything where it supposed to be.
+ * @param new_dir The new directory
+ */
+ virtual bool changeDataDir(const QString & new_dir) = 0;
+
+ /**
+ * Start all, takes into account the maximum number of downloads.
+ * @param type - Weather to start downloads, seeds or both. 1=Downloads, 2=Seeds, 3=All
+ */
+ virtual void startAll(int type) = 0;
+
+ /**
+ * Stop all torrents.
+ * @param type - Weather to start downloads, seeds or both. 1=Downloads, 2=Seeds, 3=All
+ */
+ virtual void stopAll(int type) = 0;
+
+ /**
+ * Start a torrent, takes into account the maximum number of downloads.
+ * @param tc The TorrentControl
+ */
+ virtual void start(TorrentInterface* tc) = 0;
+
+ /**
+ * Stop a torrent, may start another download if it hasn't been started.
+ * @param tc The TorrentControl
+ * @param user true if user stopped the torrent, false otherwise
+ */
+ virtual void stop(TorrentInterface* tc, bool user = false) = 0;
+
+ /**
+ * Enqueue/Dequeue function. Places a torrent in queue.
+ * If the torrent is already in queue this will remove it from queue.
+ * @param tc TorrentControl pointer.
+ */
+ virtual void queue(kt::TorrentInterface* tc) = 0;
+
+ virtual bt::QueueManager* getQueueManager() = 0;
+
+ virtual CurrentStats getStats() = 0;
+
+ /**
+ * Switch the port when no torrents are running.
+ * @param port The new port
+ * @return true if we can, false if there are torrents running
+ */
+ virtual bool changePort(bt::Uint16 port) = 0;
+
+ /// Get the number of torrents running (including seeding torrents).
+ virtual bt::Uint32 getNumTorrentsRunning() const = 0;
+
+ /// Get the number of torrents not running.
+ virtual bt::Uint32 getNumTorrentsNotRunning() const = 0;
+
+ /**
+ * Load a torrent file. Pops up an error dialog
+ * if something goes wrong.
+ * @param file The torrent file
+ * @param savedir Dir to save the data
+ * @param silently Wether or not to do this silently
+ */
+ virtual bool load(const QString & file,const QString & savedir,bool silently) = 0;
+
+ /**
+ * Load a torrent file. Pops up an error dialog
+ * if something goes wrong. Will ask the user for a save location, or use
+ * the default.
+ * @param url The torrent file
+ */
+ virtual void load(const KURL& url) = 0;
+
+ /**
+ * Load a torrent file. Pops up an error dialog
+ * if something goes wrong. Will ask the user for a save location, or use
+ * the default. This will not popup a file selection dialog for multi file torrents.
+ * @param url The torrent file
+ */
+ virtual void loadSilently(const KURL& url) = 0;
+
+ /**
+ * Remove a download.This will delete all temp
+ * data from this TorrentControl And delete the
+ * TorrentControl itself. It can also potentially
+ * start a new download (when one is waiting to be downloaded).
+ * @param tc The torrent
+ * @param data_to Wether or not to delete the file data to
+ */
+ virtual void remove(TorrentInterface* tc,bool data_to) = 0;
+
+ /**
+ * Inserts IP range to be blocked into IPBlocklist
+ * @param ip QString reference to single IP or IP range. For example:
+ * single - 127.0.0.5
+ * range - 127.0.*.*
+ **/
+ virtual void addBlockedIP(QString& ip) = 0;
+
+ /**
+ * Removes IP range from IPBlocklist
+ * @param ip QString reference to single IP or IP range. For example:
+ * single - 127.0.0.5
+ * range - 127.0.*.*
+ **/
+ virtual void removeBlockedIP(QString& ip) = 0;
+
+ /**
+ * Find the next free torX dir.
+ * @return Path to the dir (including the torX part)
+ */
+ virtual QString findNewTorrentDir() const = 0;
+
+ /**
+ * Load an existing torrent, which has already a properly set up torX dir.
+ * @param tor_dir The torX dir
+ */
+ virtual void loadExistingTorrent(const QString & tor_dir) = 0;
+
+ /**
+ * Returns maximum allowed download speed.
+ */
+ virtual int getMaxDownloadSpeed() = 0;
+
+ /**
+ * Returns maximum allowed upload speed.
+ */
+ virtual int getMaxUploadSpeed() = 0;
+
+ /**
+ * Sets global paused state for all torrents (QueueManager) and stopps all torrents.
+ * No torrents will be automatically started/stopped.
+ */
+ virtual void setPausedState(bool pause) = 0;
+
+ /// Get the global share ratio limit
+ virtual float getGlobalMaxShareRatio() const = 0;
+
+ signals:
+ /**
+ * Seeing that when load returns the loading process may not have finished yet,
+ * and some code expects this. We emit this signal to notify that code of it.
+ * @param url The url which has been loaded
+ * @param success Wether or not it succeeded
+ * @param canceled Wether or not it was canceled by the user
+ */
+ void loadingFinished(const KURL & url,bool success,bool canceled);
+
+ /**
+ * A TorrentInterface was added
+ * @param tc
+ */
+ void torrentAdded(kt::TorrentInterface* tc);
+
+
+ /**
+ * A TorrentInterface was removed
+ * @param tc
+ */
+ void torrentRemoved(kt::TorrentInterface* tc);
+
+ /**
+ * A TorrentInterface has finished downloading.
+ * @param tc
+ */
+ void finished(kt::TorrentInterface* tc);
+
+ /**
+ * Torrent download is stopped by error
+ * @param tc TorrentInterface
+ * @param msg Error message
+ */
+ void torrentStoppedByError(kt::TorrentInterface* tc, QString msg);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/exitoperation.cpp b/libktorrent/interfaces/exitoperation.cpp
new file mode 100644
index 0000000..8eedb7a
--- /dev/null
+++ b/libktorrent/interfaces/exitoperation.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "exitoperation.h"
+
+namespace kt
+{
+
+ ExitOperation::ExitOperation()
+ {}
+
+
+ ExitOperation::~ExitOperation()
+ {}
+
+ ExitJobOperation::ExitJobOperation(KIO::Job* j)
+ {
+ connect(j,SIGNAL(result(KIO::Job*)),this,SLOT(onResult( KIO::Job* )));
+ }
+
+ ExitJobOperation::~ExitJobOperation()
+ {
+ }
+
+ void ExitJobOperation::onResult(KIO::Job* )
+ {
+ operationFinished(this);
+ }
+
+}
+#include "exitoperation.moc"
diff --git a/libktorrent/interfaces/exitoperation.h b/libktorrent/interfaces/exitoperation.h
new file mode 100644
index 0000000..edaa2fa
--- /dev/null
+++ b/libktorrent/interfaces/exitoperation.h
@@ -0,0 +1,67 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTEXITOPERATION_H
+#define KTEXITOPERATION_H
+
+#include <qobject.h>
+#include <kio/job.h>
+
+namespace kt
+{
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Object to derive from for operations which need to be performed at exit.
+ * The operation should emit the operationFinished signal when they are done.
+ *
+ * ExitOperation's can be used in combination with a WaitJob, to wait for a certain amount of time
+ * to give serveral ExitOperation's the time time to finish up.
+ */
+ class ExitOperation : public QObject
+ {
+ Q_OBJECT
+ public:
+ ExitOperation();
+ virtual ~ExitOperation();
+
+ /// wether or not we can do a deleteLater on the job after it has finished.
+ virtual bool deleteAllowed() const {return true;}
+ signals:
+ void operationFinished(kt::ExitOperation* opt);
+ };
+
+ /**
+ * Exit operation which waits for a KIO::Job
+ */
+ class ExitJobOperation : public ExitOperation
+ {
+ Q_OBJECT
+ public:
+ ExitJobOperation(KIO::Job* j);
+ virtual ~ExitJobOperation();
+
+ virtual bool deleteAllowed() const {return false;}
+ private slots:
+ virtual void onResult(KIO::Job* j);
+ };
+}
+
+#endif
diff --git a/libktorrent/interfaces/filetreediritem.cpp b/libktorrent/interfaces/filetreediritem.cpp
new file mode 100644
index 0000000..b294015
--- /dev/null
+++ b/libktorrent/interfaces/filetreediritem.cpp
@@ -0,0 +1,295 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmimetype.h>
+#include <util/functions.h>
+#include <interfaces/functions.h>
+#include <torrent/globals.h>
+#include "filetreediritem.h"
+#include "filetreeitem.h"
+#include "torrentfileinterface.h"
+#include <torrent/torrentfile.h>
+
+using namespace bt;
+
+namespace kt
+{
+
+ FileTreeDirItem::FileTreeDirItem(KListView* klv,const QString & name,FileTreeRootListener* rl)
+ : QCheckListItem(klv,QString::null,QCheckListItem::CheckBox),name(name),root_listener(rl)
+ {
+ parent = 0;
+ size = 0;
+ setPixmap(0,KGlobal::iconLoader()->loadIcon("folder",KIcon::Small));
+ setText(0,name);
+ setText(1,BytesToString(size));
+ setText(2,i18n("Yes"));
+ manual_change = true;
+ setOn(true);
+ manual_change = false;
+ }
+
+ FileTreeDirItem::FileTreeDirItem(FileTreeDirItem* parent,const QString & name)
+ : QCheckListItem(parent,QString::null,QCheckListItem::CheckBox),
+ name(name),parent(parent)
+ {
+ size = 0;
+ setPixmap(0,KGlobal::iconLoader()->loadIcon("folder",KIcon::Small));
+ setText(0,name);
+ setText(1,BytesToString(size));
+ setText(2,i18n("Yes"));
+ manual_change = true;
+ setOn(true);
+ manual_change = false;
+ }
+
+ FileTreeDirItem::~FileTreeDirItem()
+ {
+ }
+
+ void FileTreeDirItem::insert(const QString & path,kt::TorrentFileInterface & file)
+ {
+ size += file.getSize();
+ setText(1,BytesToString(size));
+ int p = path.find(bt::DirSeparator());
+ if (p == -1)
+ {
+ children.insert(path,newFileTreeItem(path,file));
+ }
+ else
+ {
+ QString subdir = path.left(p);
+ FileTreeDirItem* sd = subdirs.find(subdir);
+ if (!sd)
+ {
+ sd = newFileTreeDirItem(subdir);
+ subdirs.insert(subdir,sd);
+ }
+
+ sd->insert(path.mid(p+1),file);
+ }
+ }
+
+ void FileTreeDirItem::setAllChecked(bool on,bool keep_data)
+ {
+ if (!manual_change)
+ {
+ manual_change = true;
+ setOn(on);
+ manual_change = false;
+ }
+ // first set all the child items
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ i->second->setChecked(on,keep_data);
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ j->second->setAllChecked(on,keep_data);
+ j++;
+ }
+ }
+
+
+ void FileTreeDirItem::invertChecked()
+ {
+ // first set all the child items
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ FileTreeItem* item = i->second;
+ item->setChecked(!item->isOn());
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ j->second->invertChecked();
+ j++;
+ }
+ }
+
+ void FileTreeDirItem::stateChange(bool on)
+ {
+ if (!manual_change)
+ {
+ if (on)
+ {
+ setAllChecked(true);
+ }
+ else
+ {
+ switch (confirmationDialog())
+ {
+ case KEEP_DATA:
+ setAllChecked(false,true);
+ break;
+ case THROW_AWAY_DATA:
+ setAllChecked(false,false);
+ break;
+ case CANCELED:
+ default:
+ manual_change = true;
+ setOn(true);
+ manual_change = false;
+ return;
+ }
+ }
+ if (parent)
+ parent->childStateChange();
+ }
+ setText(2,on ? i18n("Yes") : i18n("No"));
+ }
+
+ Uint64 FileTreeDirItem::bytesToDownload() const
+ {
+ Uint64 tot = 0;
+ // first check all the child items
+ bt::PtrMap<QString,FileTreeItem>::const_iterator i = children.begin();
+ while (i != children.end())
+ {
+ const FileTreeItem* item = i->second;
+ tot += item->bytesToDownload();
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::const_iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ tot += j->second->bytesToDownload();
+ j++;
+ }
+ return tot;
+ }
+
+ bool FileTreeDirItem::allChildrenOn()
+ {
+ // first check all the child items
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ FileTreeItem* item = i->second;
+ if (!item->isOn())
+ return false;
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ if (!j->second->allChildrenOn())
+ return false;
+ j++;
+ }
+ return true;
+ }
+
+ void FileTreeDirItem::childStateChange()
+ {
+ // only set this dir on if all children are on
+ manual_change = true;
+ setOn(allChildrenOn());
+ manual_change = false;
+
+ if (parent)
+ parent->childStateChange();
+ else if (root_listener)
+ root_listener->treeItemChanged();
+
+ }
+
+ int FileTreeDirItem::compare(QListViewItem* i, int col, bool ascending) const
+ {
+ if (col == 1)
+ {
+ FileTreeDirItem* other = dynamic_cast<FileTreeDirItem*>(i);
+ if (!other)
+ return 0;
+ else
+ return (int)(size - other->size);
+ }
+ else
+ {
+ //return QCheckListItem::compare(i, col, ascending);
+ // case insensitive comparison
+ return QString::compare(text(col).lower(),i->text(col).lower());
+ }
+ }
+
+ TorrentFileInterface & FileTreeDirItem::findTorrentFile(QListViewItem* item)
+ {
+ // first check all the child items
+ TorrentFileInterface & nullfile = (TorrentFileInterface &)TorrentFile::null;
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ FileTreeItem* file = i->second;
+ if (file == (FileTreeItem*)item)
+ return file->getTorrentFile();
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ TorrentFileInterface & thefile = j->second->findTorrentFile(item);
+ if(!thefile.isNull())
+ return thefile;
+ j++;
+ }
+ return nullfile;
+ }
+
+ FileTreeItem* FileTreeDirItem::newFileTreeItem(const QString & name,TorrentFileInterface & file)
+ {
+ return new FileTreeItem(this,name,file);
+ }
+
+ FileTreeDirItem* FileTreeDirItem::newFileTreeDirItem(const QString & subdir)
+ {
+ return new FileTreeDirItem(this,subdir);
+ }
+
+ bt::ConfirmationResult FileTreeDirItem::confirmationDialog()
+ {
+ return bt::THROW_AWAY_DATA;
+ }
+
+ QString FileTreeDirItem::getPath() const
+ {
+ if (!parent)
+ return bt::DirSeparator();
+ else
+ return parent->getPath() + name + bt::DirSeparator();
+ }
+}
+
diff --git a/libktorrent/interfaces/filetreediritem.h b/libktorrent/interfaces/filetreediritem.h
new file mode 100644
index 0000000..00650f2
--- /dev/null
+++ b/libktorrent/interfaces/filetreediritem.h
@@ -0,0 +1,140 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTFILETREEDIRITEM_H
+#define KTFILETREEDIRITEM_H
+
+#include <klistview.h>
+#include <util/constants.h>
+#include <util/ptrmap.h>
+
+namespace kt
+{
+ using namespace bt;
+
+ class FileTreeItem;
+ class TorrentFileInterface;
+ class TorrentInterface;
+
+ class FileTreeRootListener
+ {
+ public:
+ /// An item in the file tree has changed his state
+ virtual void treeItemChanged() = 0;
+ };
+
+ /**
+ * @author Joris Guisson
+ *
+ * Directory item the file tree showing the files in a multifile torrent
+ */
+ class FileTreeDirItem : public QCheckListItem
+ {
+ protected:
+ QString name;
+ Uint64 size;
+ bt::PtrMap<QString,FileTreeItem> children;
+ bt::PtrMap<QString,FileTreeDirItem> subdirs;
+ FileTreeDirItem* parent;
+ bool manual_change;
+ FileTreeRootListener* root_listener;
+ public:
+ FileTreeDirItem(KListView* klv,const QString & name,FileTreeRootListener* rl = 0);
+ FileTreeDirItem(FileTreeDirItem* parent,const QString & name);
+ virtual ~FileTreeDirItem();
+
+ /// Get the path of the directory (if this is the root directory / will be returned)
+ QString getPath() const;
+
+ /**
+ * Recursively insert a TorrentFileInterface.
+ * @param path Path of file
+ * @param file File itself
+ */
+ void insert(const QString & path,kt::TorrentFileInterface & file);
+
+ /**
+ * Recursivly walk the tree to find the TorrentFile which
+ * is shown by a QListViewItem (which should be an FileTreeItem).
+ * If item can't be found or item is an FileTreeDirItem, a reference to
+ * TorrentFile::null will be returned. In which case the isNull() function
+ * of TorrentFile will return true
+ * @param item Pointer to the QListViewItem
+ * @return A reference to the TorrentFile
+ */
+ kt::TorrentFileInterface & findTorrentFile(QListViewItem* item);
+
+ /**
+ * Set all items checked or not.
+ * @param on true everything checked, false everything not checked
+ * @param keep_data In case of unchecking keep the data or not
+ */
+ void setAllChecked(bool on,bool keep_data = false);
+
+ /**
+ * Invert all items, checked items become unchecked and unchecked become checked.
+ */
+ void invertChecked();
+
+ /**
+ * Called by the child to notify the parent it's state has changed.
+ */
+ void childStateChange();
+
+ FileTreeDirItem* getParent() {return parent;}
+
+ /// Recusively get the total number of bytes to download
+ Uint64 bytesToDownload() const;
+
+ protected:
+ /**
+ * Can be overrided by subclasses, so they can use their own
+ * custom FileTreeItem's. Will be called in insert.
+ * @param name Name of the file
+ * @param file The TorrentFileInterface
+ * @return A newly created FileTreeItem
+ */
+ virtual FileTreeItem* newFileTreeItem(const QString & name,
+ TorrentFileInterface & file);
+
+
+ /**
+ * Can be overrided by subclasses, so they can use their own
+ * custom FileTreeDirItem's. Will be called in insert.
+ * @param subdir The name of the subdir
+ * @return A newly created FileTreeDirItem
+ */
+ virtual FileTreeDirItem* newFileTreeDirItem(const QString & subdir);
+
+
+ /**
+ * Subclasses should override this if they want to show a confirmation dialog.
+ * @return What to do (i.e. keep the data, get rid of it or do nothing
+ */
+ virtual bt::ConfirmationResult confirmationDialog();
+
+ private:
+ virtual void stateChange(bool on);
+ virtual int compare(QListViewItem* i, int col, bool ascending) const;
+ bool allChildrenOn();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/filetreeitem.cpp b/libktorrent/interfaces/filetreeitem.cpp
new file mode 100644
index 0000000..32f265c
--- /dev/null
+++ b/libktorrent/interfaces/filetreeitem.cpp
@@ -0,0 +1,182 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmimetype.h>
+#include <interfaces/functions.h>
+#include <torrent/globals.h>
+#include "filetreeitem.h"
+#include "filetreediritem.h"
+#include "torrentfileinterface.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ FileTreeItem::FileTreeItem(FileTreeDirItem* item,const QString & name,kt::TorrentFileInterface & file)
+ : QCheckListItem(item,QString::null,QCheckListItem::CheckBox),name(name),file(file)
+ {
+ parent = item;
+ manual_change = false;
+ init();
+ }
+
+ FileTreeItem::~FileTreeItem()
+ {
+ }
+
+ void FileTreeItem::setChecked(bool on,bool keep_data)
+ {
+ manual_change = true;
+ setOn(on);
+ manual_change = false;
+
+ if (!on)
+ {
+ if (keep_data)
+ file.setPriority(ONLY_SEED_PRIORITY);
+ else
+ file.setDoNotDownload(true);
+ }
+ else
+ {
+ if (file.getPriority() == ONLY_SEED_PRIORITY)
+ file.setPriority(NORMAL_PRIORITY);
+ else
+ file.setDoNotDownload(false);
+ }
+
+ updatePriorityText();
+ parent->childStateChange();
+ }
+
+ void FileTreeItem::updatePriorityText()
+ {
+ switch(file.getPriority())
+ {
+ case FIRST_PRIORITY:
+ setText(2,i18n("Yes, First"));
+ break;
+ case LAST_PRIORITY:
+ setText(2,i18n("Yes, Last"));
+ break;
+ case EXCLUDED:
+ case ONLY_SEED_PRIORITY:
+ setText(2,i18n("No"));
+ break;
+ case PREVIEW_PRIORITY:
+ break;
+ default:
+ setText(2,i18n("Yes"));
+ break;
+ }
+ }
+
+ void FileTreeItem::init()
+ {
+ manual_change = true;
+ if (file.doNotDownload() || file.getPriority() == ONLY_SEED_PRIORITY)
+ setOn(false);
+ else
+ setOn(true);
+ manual_change = false;
+ setText(0,name);
+ setText(1,BytesToString(file.getSize()));
+ updatePriorityText();
+ setPixmap(0,KMimeType::findByPath(name)->pixmap(KIcon::Small));
+ }
+
+ void FileTreeItem::stateChange(bool on)
+ {
+ if (manual_change)
+ {
+ updatePriorityText();
+ return;
+ }
+
+ if (!on)
+ {
+ switch (confirmationDialog())
+ {
+ case KEEP_DATA:
+ file.setPriority(ONLY_SEED_PRIORITY);
+ break;
+ case THROW_AWAY_DATA:
+ file.setDoNotDownload(true);
+ break;
+ case CANCELED:
+ default:
+ manual_change = true;
+ setOn(true);
+ manual_change = false;
+ return;
+ }
+ }
+ else
+ {
+ if (file.getPriority() == ONLY_SEED_PRIORITY)
+ file.setPriority(NORMAL_PRIORITY);
+ else
+ file.setDoNotDownload(false);
+
+ }
+
+ updatePriorityText();
+ parent->childStateChange();
+ }
+
+ int FileTreeItem::compare(QListViewItem* i, int col, bool ascending) const
+ {
+ if (col == 1)
+ {
+ FileTreeItem* other = dynamic_cast<FileTreeItem*>(i);
+ if (!other)
+ return 0;
+ else
+ return (int)(file.getSize() - other->file.getSize());
+ }
+ else
+ {
+ // lets sort case insensitive
+ return QString::compare(text(col).lower(),i->text(col).lower());
+ // QCheckListItem::compare(i, col, ascending);
+ }
+ }
+
+
+ ConfirmationResult FileTreeItem::confirmationDialog()
+ {
+ if (file.isPreExistingFile())
+ return KEEP_DATA;
+ else
+ return THROW_AWAY_DATA;
+ }
+
+ Uint64 FileTreeItem::bytesToDownload() const
+ {
+ if (file.doNotDownload())
+ return 0;
+ else
+ return file.getSize();
+ }
+
+}
diff --git a/libktorrent/interfaces/filetreeitem.h b/libktorrent/interfaces/filetreeitem.h
new file mode 100644
index 0000000..6f9f1b1
--- /dev/null
+++ b/libktorrent/interfaces/filetreeitem.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTFILETREEITEM_H
+#define KTFILETREEITEM_H
+
+#include <klistview.h>
+#include <util/constants.h>
+
+using namespace bt;
+
+namespace kt
+{
+ class TorrentFileInterface;
+ class TorrentInterface;
+ class FileTreeDirItem;
+
+
+
+ /**
+ * @author Joris Guisson
+ *
+ * File item part of a tree which shows the files in a multifile torrent.
+ * This is derived from QCheckListItem, if the user checks or unchecks the box,
+ * wether or not to download a file will be changed.
+ */
+ class FileTreeItem : public QCheckListItem
+ {
+ protected:
+ QString name;
+ TorrentFileInterface & file;
+ FileTreeDirItem* parent;
+ bool manual_change;
+ public:
+ /**
+ * Constructor, set the parent, name and file
+ * @param item Parent item
+ * @param name Name of file
+ * @param file THe TorrentFileInterface
+ * @return
+ */
+ FileTreeItem(FileTreeDirItem* item,const QString & name,TorrentFileInterface & file);
+ virtual ~FileTreeItem();
+
+ /// Get a reference to the TorrentFileInterface
+ TorrentFileInterface & getTorrentFile() {return file;}
+
+ /**
+ * Set the box checked or not.
+ * @param on Checked or not
+ * @param keep_data In case of unchecking keep the data or not
+ */
+ void setChecked(bool on,bool keep_data = false);
+
+ /// Get the number of bytes to download in this file
+ Uint64 bytesToDownload() const;
+
+
+ private:
+ void init();
+ virtual void stateChange(bool on);
+ void updatePriorityText();
+
+ protected:
+ virtual int compare(QListViewItem* i, int col, bool ascending) const;
+
+ /**
+ * Subclasses should override this if they want to show a confirmation dialog.
+ * @return What to do (i.e. keep the data, get rid of it or do nothing
+ */
+ virtual bt::ConfirmationResult confirmationDialog();
+ };
+}
+
+#endif
diff --git a/libktorrent/interfaces/functions.cpp b/libktorrent/interfaces/functions.cpp
new file mode 100644
index 0000000..2c6286f
--- /dev/null
+++ b/libktorrent/interfaces/functions.cpp
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qdatetime.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include "functions.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+
+ QString BytesToString(Uint64 bytes,int precision)
+ {
+ KLocale* loc = KGlobal::locale();
+ if (bytes >= 1024 * 1024 * 1024)
+ return i18n("%1 GB").arg(loc->formatNumber(bytes / TO_GIG,precision < 0 ? 2 : precision));
+ else if (bytes >= 1024*1024)
+ return i18n("%1 MB").arg(loc->formatNumber(bytes / TO_MEG,precision < 0 ? 1 : precision));
+ else if (bytes >= 1024)
+ return i18n("%1 KB").arg(loc->formatNumber(bytes / TO_KB,precision < 0 ? 1 : precision));
+ else
+ return i18n("%1 B").arg(bytes);
+ }
+
+ QString KBytesPerSecToString(double speed,int precision)
+ {
+ KLocale* loc = KGlobal::locale();
+ return i18n("%1 KB/s").arg(loc->formatNumber(speed,precision));
+ }
+
+ QString DurationToString(Uint32 nsecs)
+ {
+ KLocale* loc = KGlobal::locale();
+ QTime t;
+ int ndays = nsecs / 86400;
+ t = t.addSecs(nsecs % 86400);
+ QString s = loc->formatTime(t,true,true);
+ if (ndays > 0)
+ s = i18n("1 day ","%n days ",ndays) + s;
+
+ return s;
+ }
+}
diff --git a/libktorrent/interfaces/functions.h b/libktorrent/interfaces/functions.h
new file mode 100644
index 0000000..1bf7178
--- /dev/null
+++ b/libktorrent/interfaces/functions.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 FUNCTIONS_H
+#define FUNCTIONS_H
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace kt
+{
+ const double TO_KB = 1024.0;
+ const double TO_MEG = (1024.0 * 1024.0);
+ const double TO_GIG = (1024.0 * 1024.0 * 1024.0);
+
+ QString BytesToString(bt::Uint64 bytes,int precision = -1);
+ QString KBytesPerSecToString(double speed,int precision = 1);
+ QString DurationToString(bt::Uint32 nsecs);
+
+ template<class T> int CompareVal(T a,T b)
+ {
+ if (a < b)
+ return -1;
+ else if (a > b)
+ return 1;
+ else
+ return 0;
+ }
+}
+
+#endif
diff --git a/libktorrent/interfaces/guiinterface.cpp b/libktorrent/interfaces/guiinterface.cpp
new file mode 100644
index 0000000..8a87d90
--- /dev/null
+++ b/libktorrent/interfaces/guiinterface.cpp
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "guiinterface.h"
+#include "torrentinterface.h"
+
+namespace kt
+{
+
+ GUIInterface::GUIInterface()
+ {}
+
+
+ GUIInterface::~GUIInterface()
+ {}
+
+
+ void GUIInterface::notifyViewListeners(TorrentInterface* tc)
+ {
+ QPtrList<ViewListener>::iterator i = listeners.begin();
+ while (i != listeners.end())
+ {
+ ViewListener* vl = *i;
+ vl->currentTorrentChanged(tc);
+ i++;
+ }
+ }
+
+ void GUIInterface::addViewListener(ViewListener* vl)
+ {
+ listeners.append(vl);
+ }
+
+ void GUIInterface::removeViewListener(ViewListener* vl)
+ {
+ listeners.remove(vl);
+ }
+}
diff --git a/libktorrent/interfaces/guiinterface.h b/libktorrent/interfaces/guiinterface.h
new file mode 100644
index 0000000..a263bb6
--- /dev/null
+++ b/libktorrent/interfaces/guiinterface.h
@@ -0,0 +1,218 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTGUIINTERFACE_H
+#define KTGUIINTERFACE_H
+
+#include <qptrlist.h>
+
+class QWidget;
+class QIconSet;
+class QString;
+class KToolBar;
+class KProgress;
+
+namespace kt
+{
+ class PrefPageInterface;
+ class Plugin;
+ class TorrentInterface;
+ class GUIInterface;
+
+ enum Position
+ {
+ LEFT, ///< New widgets will be added to the left of the old
+ RIGHT, ///< New widgets will be added to the right of the old
+ ABOVE, ///< New widgets will be added above the old
+ BELOW ///< New widgets will be added below the old
+ };
+
+ /**
+ * Small interface for classes who want to know when
+ * current torrent in the gui changes.
+ */
+ class ViewListener
+ {
+ public:
+ ViewListener() {}
+ virtual ~ViewListener() {}
+
+ virtual void currentTorrentChanged(TorrentInterface* tc) = 0;
+ };
+
+ /**
+ * Plugins wanting to add closeable tabs, should implement this interface.
+ * That way they can be notified of close requests.
+ * Not providing this interface in addTabPage means the tab cannot be closed.
+ */
+ class CloseTabListener
+ {
+ public:
+ /// By default all tabs can be closed, but this can be overridden
+ virtual bool closeAllowed(QWidget* ) {return true;}
+
+ /// THe close button was pressed for this tab, please remove it from the GUI
+ virtual void tabCloseRequest(kt::GUIInterface* gui,QWidget* tab) = 0;
+ };
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface to modify the GUI
+ *
+ * This interface allows plugins and others to modify the GUI.
+ */
+ class GUIInterface
+ {
+ QPtrList<ViewListener> listeners;
+ public:
+ GUIInterface();
+ virtual ~GUIInterface();
+
+
+ /// Add a view listener.
+ void addViewListener(ViewListener* vl);
+
+ /// Remove a view listener
+ void removeViewListener(ViewListener* vl);
+
+ /// Add a progress bar tot the status bar, if one is already present this will fail and return 0
+ virtual KProgress* addProgressBarToStatusBar() = 0;
+
+ /// Remove the progress bar from the status bar
+ virtual void removeProgressBarFromStatusBar(KProgress* p) = 0;
+
+ /**
+ * Add a new tab page to the GUI
+ * @param page The widget
+ * @param icon Icon for the tab
+ * @param caption Text on the tab
+ * @param ctl For closeable tabs this pointer should be set
+ */
+ virtual void addTabPage(QWidget* page,const QIconSet & icon,
+ const QString & caption,CloseTabListener* ctl = 0) = 0;
+
+ /**
+ * Remove a tab page, does nothing if the page
+ * isn't added. Does not delete the widget.
+ * @param page The page
+ */
+ virtual void removeTabPage(QWidget* page) = 0;
+
+ /**
+ * Add a page to the preference dialog.
+ * @param page The page
+ */
+ virtual void addPrefPage(PrefPageInterface* page) = 0;
+
+
+ /**
+ * Remove a page from the preference dialog.
+ * @param page The page
+ */
+ virtual void removePrefPage(PrefPageInterface* page) = 0;
+
+ /**
+ * Change the statusbar message.
+ * @param msg The new message
+ */
+ virtual void changeStatusbar(const QString& msg) = 0;
+
+ /**
+ * Merge the GUI of a plugin.
+ * @param p The Plugin
+ */
+ virtual void mergePluginGui(Plugin* p) = 0;
+
+ /**
+ * Remove the GUI of a plugin.
+ * @param p The Plugin
+ */
+ virtual void removePluginGui(Plugin* p) = 0;
+
+ /**
+ * Embed a widget in the view in the mainview.
+ * The view and the new widget will be separated by a separator.
+ * @param w The widget
+ * @param pos How the widget will be positioned against the already present widgets
+ */
+ virtual void addWidgetInView(QWidget* w,Position pos) = 0;
+
+ /**
+ * Remove a widget added with addWidgetInView.
+ * The widget will be reparented to 0.
+ * @param w The widget
+ */
+ virtual void removeWidgetFromView(QWidget* w) = 0;
+
+ /**
+ * Add a widget below the view.
+ * @param w The widget
+ * @param icon Name of icon to use
+ * @param caption The caption to use
+ */
+ virtual void addWidgetBelowView(QWidget* w,const QString & icon,const QString & caption) = 0;
+
+ /**
+ * Remove a widget, which was added below the view.
+ * @param w The widget
+ */
+ virtual void removeWidgetBelowView(QWidget* w) = 0;
+
+ enum ToolDock
+ {
+ DOCK_LEFT,
+ DOCK_RIGHT,
+ DOCK_BOTTOM
+ };
+
+ /**
+ * Add a tool widget.
+ * @param w The widget
+ * @param icon Name of icon to use
+ * @param caption The caption to use
+ * @param dock Where to dock the widget
+ */
+ virtual void addToolWidget(QWidget* w,const QString & icon,const QString & caption,ToolDock dock) = 0;
+
+ /**
+ * Remove a tool widget.
+ * @param w The widget
+ */
+ virtual void removeToolWidget(QWidget* w) = 0;
+
+ /// Get the current torrent.
+ virtual const TorrentInterface* getCurrentTorrent() const = 0;
+
+ /// Add a toolbar
+ virtual KToolBar* addToolBar(const char* name) = 0;
+
+ /// Remove a toolbar
+ virtual void removeToolBar(KToolBar* tb) = 0;
+
+ protected:
+ /**
+ * Notifies all view listeners of the change in the current downloading TorrentInterface
+ * @param tc Pointer to current TorrentInterface
+ */
+ void notifyViewListeners(TorrentInterface* tc);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/ipblockinginterface.cpp b/libktorrent/interfaces/ipblockinginterface.cpp
new file mode 100644
index 0000000..e92e24c
--- /dev/null
+++ b/libktorrent/interfaces/ipblockinginterface.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 "ipblockinginterface.h"
+
+namespace kt
+{
+ IPBlockingInterface::IPBlockingInterface()
+ {}
+
+
+ IPBlockingInterface::~IPBlockingInterface()
+ {}
+}
+
+
diff --git a/libktorrent/interfaces/ipblockinginterface.h b/libktorrent/interfaces/ipblockinginterface.h
new file mode 100644
index 0000000..4054af9
--- /dev/null
+++ b/libktorrent/interfaces/ipblockinginterface.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 IPBLOCKINGINTERFACE_H
+#define IPBLOCKINGINTERFACE_H
+
+class QString;
+
+namespace kt
+{
+ /**
+ * @author Ivan Vasic
+ * @brief Interface for IPBlocklist to communicate with IPBlockingPlugin
+ */
+ class IPBlockingInterface
+ {
+ public:
+ IPBlockingInterface();
+ virtual ~IPBlockingInterface();
+
+ /**
+ * This function checks if IP is listed in antip2p filter list.
+ * @return TRUE if IP should be blocked. FALSE otherwise
+ * @arg ip String representation of IP address.
+ */
+ virtual bool isBlockedIP(const QString& ip) = 0;
+
+ };
+}
+#endif
diff --git a/libktorrent/interfaces/logmonitorinterface.cpp b/libktorrent/interfaces/logmonitorinterface.cpp
new file mode 100644
index 0000000..df77a53
--- /dev/null
+++ b/libktorrent/interfaces/logmonitorinterface.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "logmonitorinterface.h"
+
+namespace kt
+{
+
+ LogMonitorInterface::LogMonitorInterface()
+ {}
+
+
+ LogMonitorInterface::~LogMonitorInterface()
+ {}
+
+
+}
diff --git a/libktorrent/interfaces/logmonitorinterface.h b/libktorrent/interfaces/logmonitorinterface.h
new file mode 100644
index 0000000..4fccb0e
--- /dev/null
+++ b/libktorrent/interfaces/logmonitorinterface.h
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTLOGMONITORINTERFACE_H
+#define KTLOGMONITORINTERFACE_H
+
+class QString;
+
+namespace kt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface for classes who which to receive which log messages are printed
+ *
+ * This class is an interface for all classes which want to know,
+ * what is written to the log.
+ */
+ class LogMonitorInterface
+ {
+ public:
+ LogMonitorInterface();
+ virtual ~LogMonitorInterface();
+
+ /**
+ * A line was written to the log file.
+ * @param line The line
+ */
+ virtual void message(const QString & line, unsigned int arg) = 0;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/monitorinterface.cpp b/libktorrent/interfaces/monitorinterface.cpp
new file mode 100644
index 0000000..d3d0c52
--- /dev/null
+++ b/libktorrent/interfaces/monitorinterface.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "monitorinterface.h"
+
+namespace kt
+{
+
+ MonitorInterface::MonitorInterface()
+ {}
+
+
+ MonitorInterface::~MonitorInterface()
+ {}
+
+
+}
diff --git a/libktorrent/interfaces/monitorinterface.h b/libktorrent/interfaces/monitorinterface.h
new file mode 100644
index 0000000..a199800
--- /dev/null
+++ b/libktorrent/interfaces/monitorinterface.h
@@ -0,0 +1,79 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTMONITORINTERFACE_H
+#define KTMONITORINTERFACE_H
+
+
+namespace kt
+{
+ class ChunkDownloadInterface;
+ class PeerInterface;
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface for classes who want to monitor a TorrentInterface
+ *
+ * Classes who want to keep track of all peers currently connected for a given
+ * torrent and all chunks who are currently downloading can implement this interface.
+ */
+ class MonitorInterface
+ {
+ public:
+ MonitorInterface();
+ virtual ~MonitorInterface();
+
+ /**
+ * A peer has been added.
+ * @param peer The peer
+ */
+ virtual void peerAdded(kt::PeerInterface* peer) = 0;
+
+ /**
+ * A peer has been removed.
+ * @param peer The peer
+ */
+ virtual void peerRemoved(kt::PeerInterface* peer) = 0;
+
+ /**
+ * The download of a chunk has been started.
+ * @param cd The ChunkDownload
+ */
+ virtual void downloadStarted(kt::ChunkDownloadInterface* cd) = 0;
+
+ /**
+ * The download of a chunk has been stopped.
+ * @param cd The ChunkDownload
+ */
+ virtual void downloadRemoved(kt::ChunkDownloadInterface* cd) = 0;
+
+ /**
+ * The download has been stopped.
+ */
+ virtual void stopped() = 0;
+
+ /**
+ * The download has been deleted.
+ */
+ virtual void destroyed() = 0;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/peerinterface.cpp b/libktorrent/interfaces/peerinterface.cpp
new file mode 100644
index 0000000..a4ab246
--- /dev/null
+++ b/libktorrent/interfaces/peerinterface.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "peerinterface.h"
+
+namespace kt
+{
+
+ PeerInterface::PeerInterface()
+ {}
+
+
+ PeerInterface::~PeerInterface()
+ {}
+
+
+}
diff --git a/libktorrent/interfaces/peerinterface.h b/libktorrent/interfaces/peerinterface.h
new file mode 100644
index 0000000..f77d0f8
--- /dev/null
+++ b/libktorrent/interfaces/peerinterface.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTPEERINTERFACE_H
+#define KTPEERINTERFACE_H
+
+#include <qstring.h>
+#include <util/constants.h>
+namespace kt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface for a Peer
+ *
+ * This is the interface for a Peer, it allows other classes to
+ * get statistics about a Peer.
+ */
+ class PeerInterface
+ {
+ public:
+ PeerInterface();
+ virtual ~PeerInterface();
+
+ struct Stats
+ {
+ /// IP address of peer (dotted notation)
+ QString ip_address;
+ /// The client (Azureus, BitComet, ...)
+ QString client;
+ /// Download rate (bytes/s)
+ bt::Uint32 download_rate;
+ /// Upload rate (bytes/s)
+ bt::Uint32 upload_rate;
+ /// Choked or not
+ bool choked;
+ /// Snubbed or not (i.e. we haven't received a piece for a minute)
+ bool snubbed;
+ /// Percentage of file which the peer has
+ float perc_of_file;
+ /// Does this peer support DHT
+ bool dht_support;
+ /// Amount of data uploaded
+ bt::Uint64 bytes_uploaded;
+ /// Amount of data downloaded
+ bt::Uint64 bytes_downloaded;
+ /// Advanced choke algorithm score
+ double aca_score;
+ /// The evil flag is on when the peer has not choked us,
+ /// but has snubbed us and requests have timedout
+ bool evil;
+ /// Flag to indicate if this peer has an upload slot
+ bool has_upload_slot;
+ /// Wether or not this connection is encrypted
+ bool encrypted;
+ /// Number of upload requests queued
+ bt::Uint32 num_up_requests;
+ /// Number of outstanding download requests queued
+ bt::Uint32 num_down_requests;
+ /// Supports the fast extensions
+ bool fast_extensions;
+ /// Is this a peer on the local network
+ bool local;
+ /// Wether or not the peer supports the extension protocol
+ bool extension_protocol;
+ };
+
+ virtual const Stats & getStats() const = 0;
+
+ virtual void kill() = 0;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/peersource.cpp b/libktorrent/interfaces/peersource.cpp
new file mode 100644
index 0000000..18368b1
--- /dev/null
+++ b/libktorrent/interfaces/peersource.cpp
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "peersource.h"
+
+namespace kt
+{
+
+ PeerSource::PeerSource()
+ {}
+
+
+ PeerSource::~PeerSource()
+ {}
+
+ void PeerSource::completed()
+ {}
+
+ void PeerSource::manualUpdate()
+ {}
+
+ void PeerSource::aboutToBeDestroyed()
+ {}
+
+ void PeerSource::addPeer(const QString & ip,bt::Uint16 port,bool local)
+ {
+ PotentialPeer pp;
+ pp.ip = ip;
+ pp.port = port;
+ pp.local = local;
+ peers.append(pp);
+ }
+
+ bool PeerSource::takePotentialPeer(PotentialPeer & pp)
+ {
+ if (peers.count() > 0)
+ {
+ pp = peers.front();
+ peers.pop_front();
+ return true;
+ }
+ return false;
+ }
+
+
+
+}
+#include "peersource.moc"
diff --git a/libktorrent/interfaces/peersource.h b/libktorrent/interfaces/peersource.h
new file mode 100644
index 0000000..9c2b589
--- /dev/null
+++ b/libktorrent/interfaces/peersource.h
@@ -0,0 +1,118 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTPEERSOURCE_H
+#define KTPEERSOURCE_H
+
+#include <qobject.h>
+#include <qvaluelist.h>
+#include <util/constants.h>
+
+namespace bt
+{
+ class WaitJob;
+}
+
+namespace kt
+{
+ struct PotentialPeer
+ {
+ QString ip;
+ bt::Uint16 port;
+ bool local;
+
+ PotentialPeer() : port(0),local(false) {}
+ };
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * This class is the base class for all classes who which to provide potential peers
+ * for torrents. PeerSources should work independently and should emit a signal when they
+ * have peers ready.
+ */
+ class PeerSource : public QObject
+ {
+ Q_OBJECT
+ public:
+ PeerSource();
+ virtual ~PeerSource();
+
+
+
+ /**
+ * Take the first PotentialPeer from the list. The item
+ * is removed from the list.
+ * @param pp PotentialPeer struct to fill
+ * @return true If there was one available, false if not
+ */
+ bool takePotentialPeer(PotentialPeer & pp);
+
+ /**
+ * Add a peer to the list of peers.
+ * @param ip The ip
+ * @param port The port
+ * @param local Wether or not the peer is on the local network
+ */
+ void addPeer(const QString & ip,bt::Uint16 port,bool local = false);
+
+ public slots:
+ /**
+ * Start gathering peers.
+ */
+ virtual void start() = 0;
+
+ /**
+ * Stop gathering peers.
+ */
+ virtual void stop(bt::WaitJob* wjob = 0) = 0;
+
+ /**
+ * The torrent has finished downloading.
+ * This is optional and should be used by HTTP and UDP tracker sources
+ * to notify the tracker.
+ */
+ virtual void completed();
+
+ /**
+ * PeerSources wanting to implement a manual update, should implement this.
+ */
+ virtual void manualUpdate();
+
+ /**
+ * The source is about to be destroyed. Subclasses can override this
+ * to clean up some things.
+ */
+ virtual void aboutToBeDestroyed();
+ signals:
+ /**
+ * This signal should be emitted when a new batch of peers is ready.
+ * @param ps The PeerSource
+ */
+ void peersReady(kt::PeerSource* ps);
+
+
+ private:
+ /// List to keep the potential peers in.
+ QValueList<PotentialPeer> peers;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/plugin.cpp b/libktorrent/interfaces/plugin.cpp
new file mode 100644
index 0000000..6354985
--- /dev/null
+++ b/libktorrent/interfaces/plugin.cpp
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "plugin.h"
+
+namespace kt
+{
+
+ Plugin::Plugin(QObject *parent, const char* qt_name,const QStringList & /*args*/,
+ const QString & name,const QString & gui_name,const QString & author,
+ const QString & email,const QString & description,
+ const QString & icon)
+ : KParts::Plugin(parent,qt_name),
+ name(name),author(author),email(email),description(description),icon(icon),gui_name(gui_name)
+ {
+ core = 0;
+ gui = 0;
+ loaded = false;
+ }
+
+
+ Plugin::~Plugin()
+ {}
+
+ void Plugin::guiUpdate()
+ {
+ }
+
+ void Plugin::shutdown(bt::WaitJob* )
+ {
+ }
+}
+#include "plugin.moc"
diff --git a/libktorrent/interfaces/plugin.h b/libktorrent/interfaces/plugin.h
new file mode 100644
index 0000000..ac43fbc
--- /dev/null
+++ b/libktorrent/interfaces/plugin.h
@@ -0,0 +1,152 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTPLUGIN_H
+#define KTPLUGIN_H
+
+#include <ktversion.h>
+#include <kparts/plugin.h>
+
+namespace bt
+{
+ class WaitJob;
+}
+
+namespace kt
+{
+ class CoreInterface;
+ class GUIInterface;
+
+ /**
+ * @author Joris Guisson
+ * @brief Base class for all plugins
+ *
+ * This is the base class for all plugins. Plugins should implement
+ * the load and unload methods, any changes made in load must be undone in
+ * unload.
+ *
+ * It's also absolutely forbidden to do any complex initialization in the constructor
+ * (setting an int to 0 is ok, creating widgets isn't).
+ * Only the name, author and description may be set in the constructor.
+ */
+ class Plugin : public KParts::Plugin
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, set the name of the plugin, the name and e-mail of the author and
+ * a short description of the plugin.
+ * @param name Name of plugin
+ * @param gui_name Name to display in GUI (i18n version of name)
+ * @param author Author of plugin
+ * @param mail E-mail address of author
+ * @param description What does the plugin do
+ * @param icon Name of the plugin's icon
+ */
+ Plugin(QObject *parent,const char* qt_name,const QStringList & args,
+ const QString & name,const QString & gui_name,const QString & author,
+ const QString & email,const QString & description,
+ const QString & icon);
+ virtual ~Plugin();
+
+ /**
+ * This gets called, when the plugin gets loaded by KTorrent.
+ * Any changes made here must be later made undone, when unload is
+ * called.
+ * Upon error a bt::Error should be thrown. And the plugin should remain
+ * in an uninitialized state. The Error contains an error message, which will
+ * get show to the user.
+ */
+ virtual void load() = 0;
+
+ /**
+ * Gets called when the plugin gets unloaded.
+ * Should undo anything load did.
+ */
+ virtual void unload() = 0;
+
+ /**
+ * For plugins who need to update something, the same time as the
+ * GUI updates.
+ */
+ virtual void guiUpdate();
+
+ /**
+ * This should be implemented by plugins who need finish of some stuff which might take some time.
+ * These operations must be finished or killed by a timeout before we can proceed with unloading the plugin.
+ * @param job The WaitJob which monitors the plugin
+ */
+ virtual void shutdown(bt::WaitJob* job);
+
+ const QString & getName() const {return name;}
+ const QString & getAuthor() const {return author;}
+ const QString & getEMailAddress() const {return email;}
+ const QString & getDescription() const {return description;}
+ const QString & getIcon() const {return icon;}
+ const QString & getGuiName() const {return gui_name;}
+
+ /// Get a pointer to the CoreInterface
+ CoreInterface* getCore() {return core;}
+
+ /// Get a const pointer to the CoreInterface
+ const CoreInterface* getCore() const {return core;}
+
+ /**
+ * Set the core, used by PluginManager to set the pointer
+ * to the core.
+ * @param c Pointer to the core
+ */
+ void setCore(CoreInterface* c) {core = c;}
+
+ /// Get a pointer to the CoreInterface
+ GUIInterface* getGUI() {return gui;}
+
+ /// Get a const pointer to the CoreInterface
+ const GUIInterface* getGUI() const {return gui;}
+
+ /**
+ * Set the core, used by PluginManager to set the pointer
+ * to the core.
+ * @param c Pointer to the core
+ */
+ void setGUI(GUIInterface* c) {gui = c;}
+
+ /// See if the plugin is loaded
+ bool isLoaded() const {return loaded;}
+
+ /// Check wether the plugin matches the version of KT
+ virtual bool versionCheck(const QString & version) const = 0;
+
+ private:
+ QString name;
+ QString author;
+ QString email;
+ QString description;
+ QString icon;
+ QString gui_name;
+ CoreInterface* core;
+ GUIInterface* gui;
+ bool loaded;
+
+ friend class PluginManager;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/prefpageinterface.cpp b/libktorrent/interfaces/prefpageinterface.cpp
new file mode 100644
index 0000000..b905f07
--- /dev/null
+++ b/libktorrent/interfaces/prefpageinterface.cpp
@@ -0,0 +1,32 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "prefpageinterface.h"
+namespace kt
+{
+ PrefPageInterface::PrefPageInterface(const QString & name,const QString & header,
+ const QPixmap & pix)
+ : pixmap(pix),itemName(name),header(header)
+ {}
+
+
+ PrefPageInterface::~PrefPageInterface()
+ {}
+}
+
diff --git a/libktorrent/interfaces/prefpageinterface.h b/libktorrent/interfaces/prefpageinterface.h
new file mode 100644
index 0000000..7d4d6dc
--- /dev/null
+++ b/libktorrent/interfaces/prefpageinterface.h
@@ -0,0 +1,84 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 PREFPAGEINTERFACE_H
+#define PREFPAGEINTERFACE_H
+
+#include <qpixmap.h>
+
+class QWidget;
+
+namespace kt
+{
+ /**
+ * @author Ivan Vasic
+ * @brief Interface to add configuration dialog page.
+ *
+ * This interface allows plugins and others to add their own pages in Configuration dialog
+ */
+ class PrefPageInterface
+ {
+ public:
+ /**
+ * Constructor, set the name, header and pixmap
+ * @param name
+ * @param header
+ * @param pix
+ */
+ PrefPageInterface(const QString & name,const QString & header,const QPixmap & pix);
+ virtual ~PrefPageInterface();
+
+ const QString& getItemName() { return itemName; }
+ const QString& getHeader() { return header; }
+ const QPixmap& getPixmap() { return pixmap; }
+
+ /**
+ * Apply the changes that have been made in the
+ * pref page. If the settings the user gave isn't valid false should be returned.
+ * This will prevent the dialog from closing.
+ * @return true if the data validates, false otherwise
+ */
+ virtual bool apply() = 0;
+
+ /**
+ * Create the actual widget.
+ * @param parent The parent of the widget
+ */
+ virtual void createWidget(QWidget* parent)=0;
+
+ /**
+ * Update all data on the widget, gets called before
+ * the preference dialog gets shown.
+ */
+ virtual void updateData() = 0;
+
+ /// Delete the widget, gets called when the page gets removed.
+ virtual void deleteWidget() = 0;
+
+ private:
+ ///Used in IconList mode. You should prefer a pixmap with size 32x32 pixels
+ QPixmap pixmap;
+ ///String used in the list or as tab item name.
+ QString itemName;
+ ///Header text use in the list modes. Ignored in Tabbed mode. If empty, the item text is used instead.
+ QString header;
+ };
+}
+#endif
+
diff --git a/libktorrent/interfaces/torrentfileinterface.cpp b/libktorrent/interfaces/torrentfileinterface.cpp
new file mode 100644
index 0000000..4cca138
--- /dev/null
+++ b/libktorrent/interfaces/torrentfileinterface.cpp
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "torrentfileinterface.h"
+
+namespace kt
+{
+
+ TorrentFileInterface::TorrentFileInterface(const QString & path,Uint64 size)
+ : path(path),size(size),first_chunk(0),last_chunk(0),num_chunks_downloaded(0),
+ priority(NORMAL_PRIORITY),m_emitDlStatusChanged(true),preview(false)
+ {
+ preexisting = false;
+ }
+
+
+ TorrentFileInterface::~TorrentFileInterface()
+ {}
+
+ float TorrentFileInterface::getDownloadPercentage() const
+ {
+ Uint32 num = last_chunk - first_chunk + 1;
+ return 100.0f * (float)num_chunks_downloaded / num;
+ }
+}
+
+#include "torrentfileinterface.moc"
+
diff --git a/libktorrent/interfaces/torrentfileinterface.h b/libktorrent/interfaces/torrentfileinterface.h
new file mode 100644
index 0000000..430534c
--- /dev/null
+++ b/libktorrent/interfaces/torrentfileinterface.h
@@ -0,0 +1,131 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTTORRENTFILEINTERFACE_H
+#define KTTORRENTFILEINTERFACE_H
+
+#include <qobject.h>
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace kt
+{
+ using bt::Uint32;
+ using bt::Uint64;
+ using bt::Priority;
+ using bt::PREVIEW_PRIORITY;
+ using bt::FIRST_PRIORITY;
+ using bt::NORMAL_PRIORITY;
+ using bt::LAST_PRIORITY;
+ using bt::EXCLUDED;
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface for a file in a multifile torrent
+ *
+ * This class is the interface for a file in a multifile torrent.
+ */
+ class TorrentFileInterface : public QObject
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, set the path and size.
+ * @param path The path
+ * @param size The size
+ */
+ TorrentFileInterface(const QString & path,Uint64 size);
+ virtual ~TorrentFileInterface();
+
+ /// Get the path of the file
+ QString getPath() const {return path;}
+
+ /// Get the size of the file
+ Uint64 getSize() const {return size;}
+
+ /// Get the index of the first chunk in which this file lies
+ Uint32 getFirstChunk() const {return first_chunk;}
+
+ /// Get the last chunk of the file
+ Uint32 getLastChunk() const {return last_chunk;}
+
+ /// See if the TorrentFile is null.
+ bool isNull() const {return path.isNull();}
+
+ /// Set wether we have to not download this file
+ virtual void setDoNotDownload(bool dnd) = 0;
+
+ /// Wether or not we have to not download this file
+ virtual bool doNotDownload() const = 0;
+
+ /// Checks if this file is multimedial
+ virtual bool isMultimedia() const = 0;
+
+ /// Gets the current priority of the torrent
+ virtual Priority getPriority() const {return priority;}
+
+ /// Sets the priority of the torrent
+ virtual void setPriority(Priority newpriority = NORMAL_PRIORITY) = 0;
+
+ /// Wheather to emit signal when dl status changes or not.
+ virtual void setEmitDownloadStatusChanged(bool show) = 0;
+
+ /// Emits signal dlStatusChanged. Use it only with FileSelectDialog!
+ virtual void emitDownloadStatusChanged() = 0;
+
+ /// Did this file exist before the torrent was loaded by KT
+ bool isPreExistingFile() const {return preexisting;}
+
+ /// Set wether this file is preexisting
+ void setPreExisting(bool pe) {preexisting = pe;}
+
+ /// Get the % of the file which is downloaded
+ float getDownloadPercentage() const;
+
+ /// See if preview is available
+ bool isPreviewAvailable() const {return preview;}
+
+ signals:
+ /**
+ * Emitted when the download percentage has been changed.
+ * @param p The new percentage
+ */
+ void downloadPercentageChanged(float p);
+
+ /**
+ * Emitted when the preview becomes available or not.
+ * @param available
+ */
+ void previewAvailable(bool available);
+
+ protected:
+ QString path;
+ Uint64 size;
+ Uint32 first_chunk;
+ Uint32 last_chunk;
+ Uint32 num_chunks_downloaded;
+ Priority priority;
+ bool preexisting;
+ bool m_emitDlStatusChanged;
+ bool preview;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/torrentinterface.cpp b/libktorrent/interfaces/torrentinterface.cpp
new file mode 100644
index 0000000..763bd55
--- /dev/null
+++ b/libktorrent/interfaces/torrentinterface.cpp
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "torrentinterface.h"
+
+namespace kt
+{
+
+ float ShareRatio(const TorrentStats & stats)
+ {
+ if (stats.bytes_downloaded == 0)
+ return 0.0f;
+ else
+ return (float) stats.bytes_uploaded / (stats.bytes_downloaded /*+ stats.imported_bytes*/);
+ }
+
+
+ TorrentInterface::TorrentInterface()
+ {}
+
+
+ TorrentInterface::~TorrentInterface()
+ {}
+
+}
+
+#include "torrentinterface.moc"
diff --git a/libktorrent/interfaces/torrentinterface.h b/libktorrent/interfaces/torrentinterface.h
new file mode 100644
index 0000000..95d5766
--- /dev/null
+++ b/libktorrent/interfaces/torrentinterface.h
@@ -0,0 +1,509 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTTORRENTINTERFACE_H
+#define KTTORRENTINTERFACE_H
+
+#include <qobject.h>
+#include <util/constants.h>
+#include <interfaces/trackerslist.h>
+
+#include <kurl.h>
+
+namespace bt
+{
+ class BitSet;
+ class DataCheckerListener;
+ class SHA1Hash;
+ class WaitJob;
+ class PeerID;
+}
+
+namespace kt
+{
+ using bt::Uint32;
+ using bt::Uint64;
+
+ class MonitorInterface;
+ class TorrentFileInterface;
+ class PeerSource;
+
+ enum TorrentStatus
+ {
+ NOT_STARTED,
+ SEEDING_COMPLETE,
+ DOWNLOAD_COMPLETE,
+ SEEDING,
+ DOWNLOADING,
+ STALLED,
+ STOPPED,
+ ALLOCATING_DISKSPACE,
+ ERROR,
+ QUEUED,
+ CHECKING_DATA,
+ NO_SPACE_LEFT
+ };
+
+ enum TorrentStartResponse
+ {
+ START_OK,
+ USER_CANCELED,
+ NOT_ENOUGH_DISKSPACE,
+ MAX_SHARE_RATIO_REACHED,
+ BUSY_WITH_DATA_CHECK,
+ QM_LIMITS_REACHED // Max seeds or downloads reached
+ };
+
+ enum AutoStopReason
+ {
+ MAX_RATIO_REACHED,
+ MAX_SEED_TIME_REACHED
+ };
+
+ struct TorrentStats
+ {
+ /// The number of bytes imported (igore these for average speed)
+ Uint64 imported_bytes;
+ /// Total number of bytes downloaded.
+ Uint64 bytes_downloaded;
+ /// Total number of bytes uploaded.
+ Uint64 bytes_uploaded;
+ /// The number of bytes left (gets sent to the tracker)
+ Uint64 bytes_left;
+ /// The number of bytes left to download (bytes_left - excluded bytes)
+ Uint64 bytes_left_to_download;
+ /// total number of bytes in torrent
+ Uint64 total_bytes;
+ /// The total number of bytes which need to be downloaded
+ Uint64 total_bytes_to_download;
+ /// The download rate in bytes per sec
+ Uint32 download_rate;
+ /// The upload rate in bytes per sec
+ Uint32 upload_rate;
+ /// The number of peers we are connected to
+ Uint32 num_peers;
+ /// The number of chunks we are currently downloading
+ Uint32 num_chunks_downloading;
+ /// The total number of chunks
+ Uint32 total_chunks;
+ /// The number of chunks which have been downloaded
+ Uint32 num_chunks_downloaded;
+ /// Get the number of chunks which have been excluded
+ Uint32 num_chunks_excluded;
+ /// Get the number of chunks left
+ Uint32 num_chunks_left;
+ /// Size of each chunk
+ Uint32 chunk_size;
+ /// Total seeders in swarm
+ Uint32 seeders_total;
+ /// Num seeders connected to
+ Uint32 seeders_connected_to;
+ /// Total leechers in swarm
+ Uint32 leechers_total;
+ /// Num leechers connected to
+ Uint32 leechers_connected_to;
+ /// Status of the download
+ TorrentStatus status;
+ /// The status of the tracker
+ QString trackerstatus;
+ /// The number of bytes downloaded in this session
+ Uint64 session_bytes_downloaded;
+ /// The number of bytes uploaded in this session
+ Uint64 session_bytes_uploaded;
+ /// The number of bytes downloaded since the last started event, this gets sent to the tracker
+ Uint64 trk_bytes_downloaded;
+ /// The number of bytes upload since the last started event, this gets sent to the tracker
+ Uint64 trk_bytes_uploaded;
+ /// Name of the torrent
+ QString torrent_name;
+ /// Path of the dir or file where the data will get saved
+ QString output_path;
+ /// See if we are running
+ bool running;
+ /// See if the torrent has been started
+ bool started;
+ /// See if we are allowed to startup this torrent automatically.
+ bool autostart;
+ /// See if we have a multi file torrent
+ bool multi_file_torrent;
+ /// See if the torrent is stopped by error
+ bool stopped_by_error;
+ /// See if the download is completed
+ bool completed;
+ /// See if this torrent is controlled by user
+ bool user_controlled;
+ /// Maximum share ratio
+ float max_share_ratio;
+ /// Maximum seed time
+ float max_seed_time;
+ /// Private torrent (i.e. no use of DHT)
+ bool priv_torrent;
+ /// Number of corrupted chunks found since the last check
+ Uint32 num_corrupted_chunks;
+ };
+
+
+ struct DHTNode
+ {
+ QString ip;
+ bt::Uint16 port;
+ };
+
+ enum TorrentFeature
+ {
+ DHT_FEATURE,
+ UT_PEX_FEATURE // µTorrent peer exchange
+ };
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Interface for an object which controls one torrent
+ *
+ * This class is the interface for an object which controls the
+ * up- and download of one torrent.
+ */
+ class TorrentInterface : public QObject
+ {
+ Q_OBJECT
+ public:
+ TorrentInterface();
+ virtual ~TorrentInterface();
+
+
+ /**
+ * Update the object, should be called periodically.
+ */
+ virtual void update() = 0;
+
+ /**
+ * Start the download of the torrent.
+ */
+ virtual void start() = 0;
+
+ /**
+ * Stop the download, closes all connections.
+ * @param user wether or not the user did this explicitly
+ * @param wjob WaitJob, used when KT is shutting down,
+ * so that we can wait for all stopped events to reach the tracker
+ */
+ virtual void stop(bool user,bt::WaitJob* wjob = 0) = 0;
+
+ /**
+ * Update the tracker, this should normally handled internally.
+ * We leave it public so that the user can do a manual announce.
+ */
+ virtual void updateTracker() = 0;
+
+ /// Get the torrent's statistics
+ const TorrentStats & getStats() const {return stats;}
+
+ /**
+ * Checks if torrent is multimedial and chunks needed for preview are downloaded
+ * @param start_chunk The index of starting chunk to check
+ * @param end_chunk The index of the last chunk to check
+ * In case of single torrent file defaults can be used (0,1)
+ **/
+ virtual bool readyForPreview(int start_chunk = 0, int end_chunk = 1) = 0;
+
+ /**
+ * Get the torX directory of this torrent. Temporary stuff like the index
+ * file get stored there.
+ */
+ virtual QString getTorDir() const = 0;
+
+ /// Get the data directory of this torrent
+ virtual QString getDataDir() const = 0;
+
+ /// Get a short error message
+ virtual QString getShortErrorMessage() const = 0;
+
+ /**
+ * Get the download running time of this torrent in seconds
+ * @return Uint32 - time in seconds
+ */
+ virtual Uint32 getRunningTimeDL() const = 0;
+
+ /**
+ * Get the upload running time of this torrent in seconds
+ * @return Uint32 - time in seconds
+ */
+ virtual Uint32 getRunningTimeUL() const = 0;
+
+ /**
+ * Change to a new data dir. If this fails
+ * we will fall back on the old directory.
+ * @param new_dir The new directory
+ * @return true upon succes
+ */
+ virtual bool changeDataDir(const QString & new_dir) = 0;
+
+ /**
+ * Change torrents output directory. If this fails we will fall back on the old directory.
+ * @param new_dir The new directory
+ * @param moveFiles Wheather to actually move the files or just change the directory without moving them.
+ * @return true upon success.
+ */
+ virtual bool changeOutputDir(const QString& new_dir, bool moveFiles = true) = 0;
+
+ /**
+ * Roll back the previous changeDataDir call.
+ * Does nothing if there was no previous changeDataDir call.
+ */
+ virtual void rollback() = 0;
+
+ /**
+ * Get a BitSet of the status of all Chunks
+ */
+ virtual const bt::BitSet & downloadedChunksBitSet() const = 0;
+
+ /**
+ * Get a BitSet of the availability of all Chunks
+ */
+ virtual const bt::BitSet & availableChunksBitSet() const = 0;
+
+ /**
+ * Get a BitSet of the excluded Chunks
+ */
+ virtual const bt::BitSet & excludedChunksBitSet() const = 0;
+
+ /**
+ * Get a bitset of only seed chunks
+ */
+ virtual const bt::BitSet & onlySeedChunksBitSet() const = 0;
+
+ /// Set the monitor
+ virtual void setMonitor(MonitorInterface* tmo) = 0;
+
+ /// Get the time to the next tracker update in seconds.
+ virtual Uint32 getTimeToNextTrackerUpdate() const = 0;
+
+ /// Get the number of files in a multifile torrent (0 if we do not have a multifile torrent)
+ virtual Uint32 getNumFiles() const = 0;
+
+ /**
+ * Get the index'th file of a multifile torrent
+ * @param index The index
+ * @return The TorrentFileInterface (isNull() will be true in case of error)
+ */
+ virtual TorrentFileInterface & getTorrentFile(Uint32 index) = 0;
+
+ ///Get a pointer to TrackersList object
+ virtual TrackersList* getTrackersList() = 0;
+
+ ///Get a pointer to TrackersList object
+ virtual const TrackersList* getTrackersList() const = 0;
+
+ ///Get the torrent queue number. Zero if not in queue
+ virtual int getPriority() const = 0;
+
+ ///Set the torrent queue number.
+ virtual void setPriority(int p) = 0;
+
+ /// Set the max share ratio
+ virtual void setMaxShareRatio(float ratio) = 0;
+
+ /// Get the max share ratio
+ virtual float getMaxShareRatio() const = 0;
+
+ /// Set the max seed time in hours (0 is no limit)
+ virtual void setMaxSeedTime(float hours) = 0;
+
+ /// Get the max seed time
+ virtual float getMaxSeedTime() const = 0;
+
+ /// Make a string of the current status
+ virtual QString statusToString() const = 0;
+
+ ///Is manual announce allowed?
+ virtual bool announceAllowed() = 0;
+
+
+ /**
+ * Returns estimated time left for finishing download. Returned value is in seconds.
+ * Uses TimeEstimator class to calculate this value.
+ */
+ virtual Uint32 getETA() = 0;
+
+ /**
+ * Verify the correctness of all data.
+ * @param lst The listener
+ * @param auto_import Wether or not this is an initial import
+ */
+ virtual void startDataCheck(bt::DataCheckerListener* lst,bool auto_import) = 0;
+
+ /**
+ * Data check has been finished, this should be called.
+ */
+ virtual void afterDataCheck() = 0;
+
+ /**
+ * Are we doing a data check on this torrent.
+ * @param finished This will be set to true if the data check is finished
+ */
+ virtual bool isCheckingData(bool & finished) const = 0;
+
+ /**
+ * Test all files and see if they are not missing.
+ * If so put them in a list
+ */
+ virtual bool hasMissingFiles(QStringList & sl) = 0;
+
+ /**
+ * Recreate missing files.
+ */
+ virtual void recreateMissingFiles() = 0;
+
+ /**
+ * Mark missing files as do not download.
+ */
+ virtual void dndMissingFiles() = 0;
+
+
+ /// Get the number of initial DHT nodes
+ virtual Uint32 getNumDHTNodes() const = 0;
+
+ /// Get a DHT node
+ virtual const DHTNode & getDHTNode(Uint32 i) const = 0;
+
+ /** Delete the data files of the torrent,
+ * they will be lost permanently
+ */
+ virtual void deleteDataFiles() = 0;
+
+ ///Checks if a seeding torrent has reached its maximum share ratio
+ virtual bool overMaxRatio() = 0;
+
+ /// Checks if a seeding torrent has reached it's max seed time
+ virtual bool overMaxSeedTime() = 0;
+
+ /// Handle an error
+ virtual void handleError(const QString & err) = 0;
+
+ /// Get the info_hash.
+ virtual const bt::SHA1Hash & getInfoHash() const = 0;
+
+ /**
+ * Add a new PeerSource
+ * @param ps
+ */
+ virtual void addPeerSource(PeerSource* ps) = 0;
+
+ /**
+ * Remove a nPeerSource
+ * @param ps
+ */
+ virtual void removePeerSource(PeerSource* ps) = 0;
+
+ /// Is a feature enabled
+ virtual bool isFeatureEnabled(TorrentFeature tf) = 0;
+
+ /// Disable or enable a feature
+ virtual void setFeatureEnabled(TorrentFeature tf,bool on) = 0;
+
+ /// Get our PeerID
+ virtual const bt::PeerID & getOwnPeerID() const = 0;
+
+ /// Set the traffic limits for this torrent
+ virtual void setTrafficLimits(Uint32 up,Uint32 down) = 0;
+
+ /// Get the traffic limits
+ virtual void getTrafficLimits(Uint32 & up,Uint32 & down) = 0;
+
+ /// Check if there is enough diskspace available for this torrent
+ virtual bool checkDiskSpace(bool emit_sig = true) = 0;
+
+ /// Are we in the process of moving files
+ virtual bool isMovingFiles() const = 0;
+ signals:
+ /**
+ * Emited when we have finished downloading.
+ * @param me The object who emitted the signal
+ */
+ void finished(kt::TorrentInterface* me);
+
+ /**
+ * Emited when a Torrent download is stopped by error
+ * @param me The object who emitted the signal
+ * @param msg Error message
+ */
+ void stoppedByError(kt::TorrentInterface* me, QString msg);
+
+ /**
+ * Emited when maximum share ratio for this torrent is changed
+ * @param me The object which emitted the signal.
+ */
+ void maxRatioChanged(kt::TorrentInterface* me);
+
+ /**
+ * Emited then torrent is stopped from seeding by KTorrent.
+ * Happens when torrent has reached maximum share ratio and maybe we'll add something more...
+ * @param me The object which emitted the signal.
+ */
+ void seedingAutoStopped(kt::TorrentInterface* me,kt::AutoStopReason reason);
+
+ /**
+ * Emitted just before the torrent is started, this should be used to do some
+ * checks on the files in the cache.
+ * @param me The torrent which emitted the signal
+ * @param ret The return value
+ */
+ void aboutToBeStarted(kt::TorrentInterface* me,bool & ret);
+
+ /**
+ * Emitted when missing files have been marked as dnd.
+ * The intention of this signal is to update the GUI.
+ * @param me The torrent which emitted the signal
+ */
+ void missingFilesMarkedDND(kt::TorrentInterface* me);
+
+ /**
+ * A corrupted chunk has been found during upload.
+ * @param me The torrent which emitted the signal
+ */
+ void corruptedDataFound(kt::TorrentInterface* me);
+
+ /**
+ * Disk is running out of space.
+ * @param me The torrent which emitted the signal
+ * @param toStop should this torrent be stopped or not
+ */
+ void diskSpaceLow(kt::TorrentInterface* me, bool toStop);
+
+ /**
+ * Torrent has been stopped
+ * @param me The torrent which emitted the signal
+ */
+ void torrentStopped(kt::TorrentInterface* me);
+
+ protected:
+ TorrentStats stats;
+ };
+
+
+ /**
+ * Calculates the share ratio of a torrent.
+ * @param stats The stats of the torrent
+ * @return The share ratio
+ */
+ float ShareRatio(const TorrentStats & stats);
+
+}
+
+#endif
diff --git a/libktorrent/interfaces/trackerslist.cpp b/libktorrent/interfaces/trackerslist.cpp
new file mode 100644
index 0000000..c119625
--- /dev/null
+++ b/libktorrent/interfaces/trackerslist.cpp
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <torrent/torrent.h>
+#include "trackerslist.h"
+
+namespace kt
+{
+
+ TrackersList::TrackersList()
+ {
+ }
+
+
+ TrackersList::~TrackersList()
+ {
+ }
+
+ void TrackersList::merge(const bt::TrackerTier* first)
+ {
+ int tier = 1;
+ while (first)
+ {
+ KURL::List::const_iterator i = first->urls.begin();
+ while (i != first->urls.end())
+ {
+ addTracker(*i,true,tier);
+ i++;
+ }
+ tier++;
+ first = first->next;
+ }
+ }
+
+}
diff --git a/libktorrent/interfaces/trackerslist.h b/libktorrent/interfaces/trackerslist.h
new file mode 100644
index 0000000..55dc05e
--- /dev/null
+++ b/libktorrent/interfaces/trackerslist.h
@@ -0,0 +1,89 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Ivan Vasic *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTTRACKERSLIST_H
+#define KTTRACKERSLIST_H
+
+#include <kurl.h>
+
+namespace bt
+{
+ struct TrackerTier;
+}
+
+namespace kt
+{
+ /**
+ * @author Ivan Vasić <ivasic@gmail.com>
+ *
+ * This interface is used to provide access to AnnounceList object which holds a list of available trackers for a torrent.
+ */
+ class TrackersList
+ {
+ public:
+ TrackersList();
+ virtual ~TrackersList();
+
+ /**
+ * Get the current tracker URL.
+ */
+ virtual KURL getTrackerURL() const = 0;
+
+ /**
+ * Gets a list of available trackers.
+ */
+ virtual KURL::List getTrackerURLs() = 0;
+
+ /**
+ * Adds a tracker URL to the list.
+ * @param url The URL
+ * @param custom Is it a custom tracker
+ * @param tier Which tier (or priority) the tracker has, tier 1 are
+ * the main trackers, tier 2 are backups ...
+ */
+ virtual void addTracker(KURL url, bool custom = true,int tier = 1) = 0;
+
+ /**
+ * Removes the tracker from the list.
+ * @param url - Tracker url.
+ */
+ virtual bool removeTracker(KURL url) = 0;
+
+ /**
+ * Sets the current tracker and does the announce.
+ * @param url - Tracker url.
+ */
+ virtual void setTracker(KURL url) = 0;
+
+ /**
+ * Restores the default tracker and does the announce.
+ */
+ virtual void restoreDefault() = 0;
+
+ /**
+ * Merge an other tracker list.
+ * @param first The first TrackerTier
+ */
+ void merge(const bt::TrackerTier* first);
+
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/Makefile.am b/libktorrent/kademlia/Makefile.am
new file mode 100644
index 0000000..1b567b2
--- /dev/null
+++ b/libktorrent/kademlia/Makefile.am
@@ -0,0 +1,12 @@
+INCLUDES = -I$(srcdir)/.. $(all_includes)
+METASOURCES = AUTO
+libkademlia_la_LDFLAGS = $(all_libraries)
+noinst_LTLIBRARIES = libkademlia.la
+noinst_HEADERS = key.h node.h kbucket.h rpccall.h rpcserver.h database.h dht.h \
+ rpcmsg.h kclosestnodessearch.h nodelookup.h task.h pack.h \
+ taskmanager.h announcetask.h dhttrackerbackend.h dhtbase.h
+libkademlia_la_SOURCES = key.cpp node.cpp kbucket.cpp rpccall.cpp rpcserver.cpp \
+ database.cpp dht.cpp rpcmsg.cpp kclosestnodessearch.cpp nodelookup.cpp task.cpp \
+ pack.cpp taskmanager.cpp announcetask.cpp \
+ dhttrackerbackend.cpp dhtbase.cpp
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/kademlia/announcetask.cpp b/libktorrent/kademlia/announcetask.cpp
new file mode 100644
index 0000000..b7350a2
--- /dev/null
+++ b/libktorrent/kademlia/announcetask.cpp
@@ -0,0 +1,154 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <torrent/globals.h>
+#include "announcetask.h"
+#include "node.h"
+#include "pack.h"
+
+using namespace bt;
+
+namespace dht
+{
+
+ AnnounceTask::AnnounceTask(Database* db,RPCServer* rpc, Node* node,const dht::Key & info_hash,bt::Uint16 port)
+ : Task(rpc, node),info_hash(info_hash),port(port),db(db)
+ {}
+
+
+ AnnounceTask::~AnnounceTask()
+ {}
+
+
+ void AnnounceTask::callFinished(RPCCall* c, MsgBase* rsp)
+ {
+ // Out() << "AnnounceTask::callFinished" << endl;
+ // if we do not have a get peers response, return
+ // announce_peer's response are just empty anyway
+ if (c->getMsgMethod() != dht::GET_PEERS)
+ return;
+
+ // it is either a GetPeersNodesRsp or a GetPeersValuesRsp
+ GetPeersRsp* gpr = dynamic_cast<GetPeersRsp*>(rsp);
+ if (!gpr)
+ return;
+
+ if (gpr->containsNodes())
+ {
+ const QByteArray & n = gpr->getData();
+ Uint32 nval = n.size() / 26;
+ for (Uint32 i = 0;i < nval;i++)
+ {
+ // add node to todo list
+ KBucketEntry e = UnpackBucketEntry(n,i*26);
+ if (!todo.contains(e) && !visited.contains(e) &&
+ todo.count() < 100)
+ {
+ todo.append(e);
+ }
+ }
+ }
+ else
+ {
+ // store the items in the database
+ const DBItemList & items = gpr->getItemList();
+ for (DBItemList::const_iterator i = items.begin();i != items.end();i++)
+ {
+ db->store(info_hash,*i);
+ // also add the items to the returned_items list
+ returned_items.append(*i);
+ }
+
+ // add the peer who responded to the answered list, so we can do an announce
+ KBucketEntry e(rsp->getOrigin(),rsp->getID());
+ if (!answered.contains(KBucketEntryAndToken(e,gpr->getToken())) && !answered_visited.contains(e))
+ {
+ answered.append(KBucketEntryAndToken(e,gpr->getToken()));
+ }
+
+ emitDataReady();
+ }
+ }
+
+ void AnnounceTask::callTimeout(RPCCall* )
+ {
+ //Out() << "AnnounceTask::callTimeout " << endl;
+ }
+
+ void AnnounceTask::update()
+ {
+/* Out() << "AnnounceTask::update " << endl;
+ Out() << "todo " << todo.count() << " ; answered " << answered.count() << endl;
+ Out() << "visited " << visited.count() << " ; answered_visited " << answered_visited.count() << endl;
+ */
+ while (!answered.empty() && canDoRequest())
+ {
+ KBucketEntryAndToken & e = answered.first();
+ if (!answered_visited.contains(e))
+ {
+ AnnounceReq* anr = new AnnounceReq(node->getOurID(),info_hash,port,e.getToken());
+ anr->setOrigin(e.getAddress());
+ rpcCall(anr);
+ answered_visited.append(e);
+ }
+ answered.pop_front();
+ }
+
+ // go over the todo list and send get_peers requests
+ // until we have nothing left
+ while (!todo.empty() && canDoRequest())
+ {
+ KBucketEntry e = todo.first();
+ // onLy send a findNode if we haven't allrready visited the node
+ if (!visited.contains(e))
+ {
+ // send a findNode to the node
+ GetPeersReq* gpr = new GetPeersReq(node->getOurID(),info_hash);
+ gpr->setOrigin(e.getAddress());
+ rpcCall(gpr);
+ visited.append(e);
+ }
+ // remove the entry from the todo list
+ todo.pop_front();
+ }
+
+ if (todo.empty() && answered.empty() && getNumOutstandingRequests() == 0 && !isFinished())
+ {
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: AnnounceTask done" << endl;
+ done();
+ }
+ else if (answered_visited.count() >= dht::K)
+ {
+ // if K announces have occurred stop
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: AnnounceTask done" << endl;
+ done();
+ }
+ }
+
+ bool AnnounceTask::takeItem(DBItem & item)
+ {
+ if (returned_items.empty())
+ return false;
+
+ item = returned_items.first();
+ returned_items.pop_front();
+ return true;
+ }
+}
diff --git a/libktorrent/kademlia/announcetask.h b/libktorrent/kademlia/announcetask.h
new file mode 100644
index 0000000..d6bfa7c
--- /dev/null
+++ b/libktorrent/kademlia/announcetask.h
@@ -0,0 +1,74 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTANNOUNCETASK_H
+#define DHTANNOUNCETASK_H
+
+#include <task.h>
+#include "kbucket.h"
+
+namespace dht
+{
+ class Database;
+
+ class KBucketEntryAndToken : public KBucketEntry
+ {
+ Key token;
+ public:
+ KBucketEntryAndToken() {}
+ KBucketEntryAndToken(const KBucketEntry & e,const Key & token)
+ : KBucketEntry(e),token(token) {}
+ virtual ~KBucketEntryAndToken() {}
+
+ const Key & getToken() const {return token;}
+ };
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class AnnounceTask : public Task
+ {
+ public:
+ AnnounceTask(Database* db,RPCServer* rpc, Node* node,const dht::Key & info_hash,bt::Uint16 port);
+ virtual ~AnnounceTask();
+
+ virtual void callFinished(RPCCall* c, MsgBase* rsp);
+ virtual void callTimeout(RPCCall* c);
+ virtual void update();
+
+ /**
+ * Take one item from the returned values.
+ * Returns false if there is no item to take.
+ * @param item The item
+ * @return false if no item to take, true else
+ */
+ bool takeItem(DBItem & item);
+ private:
+ dht::Key info_hash;
+ bt::Uint16 port;
+ QValueList<KBucketEntryAndToken> answered; // nodes which have answered with values
+ QValueList<KBucketEntry> answered_visited; // nodes which have answered with values which have been visited
+ Database* db;
+ DBItemList returned_items;
+
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/database.cpp b/libktorrent/kademlia/database.cpp
new file mode 100644
index 0000000..447975f
--- /dev/null
+++ b/libktorrent/kademlia/database.cpp
@@ -0,0 +1,186 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/functions.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "database.h"
+
+using namespace bt;
+
+namespace dht
+{
+ DBItem::DBItem()
+ {
+ memset(item,0,9);
+ time_stamp = bt::GetCurrentTime();
+ }
+
+ DBItem::DBItem(const bt::Uint8* ip_port)
+ {
+ memcpy(item,ip_port,6);
+ time_stamp = bt::GetCurrentTime();
+ }
+
+ DBItem::DBItem(const DBItem & it)
+ {
+ memcpy(item,it.item,6);
+ time_stamp = it.time_stamp;
+ }
+
+ DBItem::~DBItem()
+ {}
+
+ bool DBItem::expired(bt::TimeStamp now) const
+ {
+ return (now - time_stamp >= MAX_ITEM_AGE);
+ }
+
+ DBItem & DBItem::operator = (const DBItem & it)
+ {
+ memcpy(item,it.item,6);
+ time_stamp = it.time_stamp;
+ return *this;
+ }
+
+ ///////////////////////////////////////////////
+
+ Database::Database()
+ {
+ items.setAutoDelete(true);
+ }
+
+
+ Database::~Database()
+ {}
+
+ void Database::store(const dht::Key & key,const DBItem & dbi)
+ {
+ DBItemList* dbl = items.find(key);
+ if (!dbl)
+ {
+ dbl = new DBItemList();
+ items.insert(key,dbl);
+ }
+ dbl->append(dbi);
+ }
+
+ void Database::sample(const dht::Key & key,DBItemList & tdbl,bt::Uint32 max_entries)
+ {
+ DBItemList* dbl = items.find(key);
+ if (!dbl)
+ return;
+
+ if (dbl->count() < max_entries)
+ {
+ DBItemList::iterator i = dbl->begin();
+ while (i != dbl->end())
+ {
+ tdbl.append(*i);
+ i++;
+ }
+ }
+ else
+ {
+ Uint32 num_added = 0;
+ DBItemList::iterator i = dbl->begin();
+ while (i != dbl->end() && num_added < max_entries)
+ {
+ tdbl.append(*i);
+ num_added++;
+ i++;
+ }
+ }
+ }
+
+ void Database::expire(bt::TimeStamp now)
+ {
+ bt::PtrMap<dht::Key,DBItemList>::iterator itr = items.begin();
+ while (itr != items.end())
+ {
+ DBItemList* dbl = itr->second;
+ // newer keys are inserted at the back
+ // so we can stop when we hit the first key which is not expired
+ while (dbl->count() > 0 && dbl->first().expired(now))
+ {
+ dbl->pop_front();
+ }
+ itr++;
+ }
+ }
+
+ dht::Key Database::genToken(Uint32 ip,Uint16 port)
+ {
+ Uint8 tdata[14];
+ TimeStamp now = bt::GetCurrentTime();
+ // generate a hash of the ip port and the current time
+ // should prevent anybody from crapping things up
+ bt::WriteUint32(tdata,0,ip);
+ bt::WriteUint16(tdata,4,port);
+ bt::WriteUint64(tdata,6,now);
+
+ dht::Key token = SHA1Hash::generate(tdata,14);
+ // keep track of the token, tokens will expire after a while
+ tokens.insert(token,now);
+ return token;
+ }
+
+ bool Database::checkToken(const dht::Key & token,Uint32 ip,Uint16 port)
+ {
+ // the token must be in the map
+ if (!tokens.contains(token))
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "Unknown token" << endl;
+ return false;
+ }
+
+ // in the map so now get the timestamp and regenerate the token
+ // using the IP and port of the sender
+ TimeStamp ts = tokens[token];
+ Uint8 tdata[14];
+ bt::WriteUint32(tdata,0,ip);
+ bt::WriteUint16(tdata,4,port);
+ bt::WriteUint64(tdata,6,ts);
+ dht::Key ct = SHA1Hash::generate(tdata,14);
+ // compare the generated token to the one received
+ if (token != ct) // not good, this peer didn't went through the proper channels
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "Invalid token" << endl;
+ return false;
+ }
+ // expire the token
+ tokens.erase(token);
+ return true;
+ }
+
+ bool Database::contains(const dht::Key & key) const
+ {
+ return items.find(key) != 0;
+ }
+
+ void Database::insert(const dht::Key & key)
+ {
+ DBItemList* dbl = items.find(key);
+ if (!dbl)
+ {
+ dbl = new DBItemList();
+ items.insert(key,dbl);
+ }
+ }
+}
diff --git a/libktorrent/kademlia/database.h b/libktorrent/kademlia/database.h
new file mode 100644
index 0000000..94e6b3f
--- /dev/null
+++ b/libktorrent/kademlia/database.h
@@ -0,0 +1,129 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTDATABASE_H
+#define DHTDATABASE_H
+
+#include <qmap.h>
+#include <qvaluelist.h>
+#include <util/ptrmap.h>
+#include <util/constants.h>
+#include <util/array.h>
+#include "key.h"
+
+
+namespace dht
+{
+ /// Each item may only exist for 30 minutes
+ const bt::Uint32 MAX_ITEM_AGE = 30 * 60 * 1000;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Item in the database, will keep track of an IP and port combination.
+ * As well as the time it was inserted.
+ */
+ class DBItem
+ {
+ bt::Uint8 item[6];
+ bt::TimeStamp time_stamp;
+ public:
+ DBItem();
+ DBItem(const bt::Uint8* ip_port);
+ DBItem(const DBItem & item);
+ virtual ~DBItem();
+
+ /// See if the item is expired
+ bool expired(bt::TimeStamp now) const;
+
+ /// Get the data of an item
+ const bt::Uint8* getData() const {return item;}
+
+ DBItem & operator = (const DBItem & item);
+ };
+
+ typedef QValueList<DBItem> DBItemList;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Class where all the key value paires get stored.
+ */
+ class Database
+ {
+ bt::PtrMap<dht::Key,DBItemList> items;
+ QMap<dht::Key,bt::TimeStamp> tokens;
+ public:
+ Database();
+ virtual ~Database();
+
+ /**
+ * Store an entry in the database
+ * @param key The key
+ * @param dbi The DBItem to store
+ */
+ void store(const dht::Key & key,const DBItem & dbi);
+
+ /**
+ * Get max_entries items from the database, which have
+ * the same key, items are taken randomly from the list.
+ * If the key is not present no items will be returned, if
+ * there are fewer then max_entries items for the key, all
+ * entries will be returned
+ * @param key The key to search for
+ * @param dbl The list to store the items in
+ * @param max_entries The maximum number entries
+ */
+ void sample(const dht::Key & key,DBItemList & dbl,bt::Uint32 max_entries);
+
+ /**
+ * Expire all items older then 30 minutes
+ * @param now The time it is now
+ * (we pass this along so we only have to calculate it once)
+ */
+ void expire(bt::TimeStamp now);
+
+ /**
+ * Generate a write token, which will give peers write access to
+ * the DB.
+ * @param ip The IP of the peer
+ * @param port The port of the peer
+ * @return A Key
+ */
+ dht::Key genToken(bt::Uint32 ip,bt::Uint16 port);
+
+ /**
+ * Check if a received token is OK.
+ * @param token The token received
+ * @param ip The ip of the sender
+ * @param port The port of the sender
+ * @return true if the token was given to this peer, false other wise
+ */
+ bool checkToken(const dht::Key & token,bt::Uint32 ip,bt::Uint16 port);
+
+ /// Test wether or not the DB contains a key
+ bool contains(const dht::Key & key) const;
+
+ /// Insert an empty item (only if it isn't already in the DB)
+ void insert(const dht::Key & key);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/dht.cpp b/libktorrent/kademlia/dht.cpp
new file mode 100644
index 0000000..1d00ab8
--- /dev/null
+++ b/libktorrent/kademlia/dht.cpp
@@ -0,0 +1,378 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qmap.h>
+#include <kresolver.h>
+#include <util/log.h>
+#include <util/array.h>
+#include <util/functions.h>
+#include <torrent/bnode.h>
+#include <torrent/globals.h>
+#include <ksocketaddress.h>
+#include "announcetask.h"
+#include "dht.h"
+#include "node.h"
+#include "rpcserver.h"
+#include "rpcmsg.h"
+#include "kclosestnodessearch.h"
+#include "database.h"
+#include "taskmanager.h"
+#include "nodelookup.h"
+
+
+using namespace bt;
+using namespace KNetwork;
+
+namespace dht
+{
+
+
+
+ DHT::DHT() : node(0),srv(0),db(0),tman(0)
+ {
+ connect(&update_timer,SIGNAL(timeout()),this,SLOT(update()));
+ }
+
+
+ DHT::~DHT()
+ {
+ if (running)
+ stop();
+ }
+
+ void DHT::start(const QString & table,const QString & key_file,bt::Uint16 port)
+ {
+ if (running)
+ return;
+
+ if (port == 0)
+ port = 6881;
+
+ table_file = table;
+ this->port = port;
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: Starting on port " << port << endl;
+ srv = new RPCServer(this,port);
+ node = new Node(srv,key_file);
+ db = new Database();
+ tman = new TaskManager();
+ expire_timer.update();
+ running = true;
+ srv->start();
+ node->loadTable(table);
+ update_timer.start(1000);
+ started();
+ }
+
+
+ void DHT::stop()
+ {
+ if (!running)
+ return;
+
+ update_timer.stop();
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: Stopping " << endl;
+ srv->stop();
+ node->saveTable(table_file);
+ running = false;
+ stopped();
+ delete tman; tman = 0;
+ delete db; db = 0;
+ delete node; node = 0;
+ delete srv; srv = 0;
+ }
+
+ void DHT::ping(PingReq* r)
+ {
+ if (!running)
+ return;
+
+ // ignore requests we get from ourself
+ if (r->getID() == node->getOurID())
+ return;
+
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: Sending ping response" << endl;
+ PingRsp rsp(r->getMTID(),node->getOurID());
+ rsp.setOrigin(r->getOrigin());
+ srv->sendMsg(&rsp);
+ node->recieved(this,r);
+ }
+
+
+
+ void DHT::findNode(FindNodeReq* r)
+ {
+ if (!running)
+ return;
+
+ // ignore requests we get from ourself
+ if (r->getID() == node->getOurID())
+ return;
+
+ Out(SYS_DHT|LOG_DEBUG) << "DHT: got findNode request" << endl;
+ node->recieved(this,r);
+ // find the K closest nodes and pack them
+ KClosestNodesSearch kns(r->getTarget(),K);
+
+ node->findKClosestNodes(kns);
+
+ Uint32 rs = kns.requiredSpace();
+ // create the data
+ QByteArray nodes(rs);
+ // pack the found nodes in a byte array
+ if (rs > 0)
+ kns.pack(nodes);
+
+ FindNodeRsp fnr(r->getMTID(),node->getOurID(),nodes);
+ fnr.setOrigin(r->getOrigin());
+ srv->sendMsg(&fnr);
+ }
+
+
+ void DHT::announce(AnnounceReq* r)
+ {
+ if (!running)
+ return;
+
+ // ignore requests we get from ourself
+ if (r->getID() == node->getOurID())
+ return;
+
+ Out(SYS_DHT|LOG_DEBUG) << "DHT: got announce request" << endl;
+ node->recieved(this,r);
+ // first check if the token is OK
+ dht::Key token = r->getToken();
+ if (!db->checkToken(token,r->getOrigin().ipAddress().IPv4Addr(),r->getOrigin().port()))
+ return;
+
+ // everything OK, so store the value
+ Uint8 tdata[6];
+ bt::WriteUint32(tdata,0,r->getOrigin().ipAddress().IPv4Addr());
+ bt::WriteUint16(tdata,4,r->getPort());
+ db->store(r->getInfoHash(),DBItem(tdata));
+ // send a proper response to indicate everything is OK
+ AnnounceRsp rsp(r->getMTID(),node->getOurID());
+ rsp.setOrigin(r->getOrigin());
+ srv->sendMsg(&rsp);
+ }
+
+
+
+ void DHT::getPeers(GetPeersReq* r)
+ {
+ if (!running)
+ return;
+
+ // ignore requests we get from ourself
+ if (r->getID() == node->getOurID())
+ return;
+
+ Out(SYS_DHT|LOG_DEBUG) << "DHT: got getPeers request" << endl;
+ node->recieved(this,r);
+ DBItemList dbl;
+ db->sample(r->getInfoHash(),dbl,50);
+
+ // generate a token
+ dht::Key token = db->genToken(r->getOrigin().ipAddress().IPv4Addr(),r->getOrigin().port());
+
+ if (dbl.count() == 0)
+ {
+ // if data is null do the same as when we have a findNode request
+ // find the K closest nodes and pack them
+ KClosestNodesSearch kns(r->getInfoHash(),K);
+ node->findKClosestNodes(kns);
+ Uint32 rs = kns.requiredSpace();
+ // create the data
+ QByteArray nodes(rs);
+ // pack the found nodes in a byte array
+ if (rs > 0)
+ kns.pack(nodes);
+
+ GetPeersRsp fnr(r->getMTID(),node->getOurID(),nodes,token);
+ fnr.setOrigin(r->getOrigin());
+ srv->sendMsg(&fnr);
+ }
+ else
+ {
+ // send a get peers response
+ GetPeersRsp fvr(r->getMTID(),node->getOurID(),dbl,token);
+ fvr.setOrigin(r->getOrigin());
+ srv->sendMsg(&fvr);
+ }
+ }
+
+ void DHT::response(MsgBase* r)
+ {
+ if (!running)
+ return;
+
+ node->recieved(this,r);
+ }
+
+ void DHT::error(ErrMsg* )
+ {}
+
+
+ void DHT::portRecieved(const QString & ip,bt::Uint16 port)
+ {
+ if (!running)
+ return;
+
+ Out(SYS_DHT|LOG_DEBUG) << "Sending ping request to " << ip << ":" << port << endl;
+ PingReq* r = new PingReq(node->getOurID());
+ r->setOrigin(KInetSocketAddress(ip,port));
+ srv->doCall(r);
+ }
+
+ bool DHT::canStartTask() const
+ {
+ // we can start a task if we have less then 7 runnning and
+ // there are at least 16 RPC slots available
+ if (tman->getNumTasks() >= 7)
+ return false;
+ else if (256 - srv->getNumActiveRPCCalls() <= 16)
+ return false;
+
+ return true;
+ }
+
+ AnnounceTask* DHT::announce(const bt::SHA1Hash & info_hash,bt::Uint16 port)
+ {
+ if (!running)
+ return 0;
+
+ KClosestNodesSearch kns(info_hash,K);
+ node->findKClosestNodes(kns);
+ if (kns.getNumEntries() > 0)
+ {
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: Doing announce " << endl;
+ AnnounceTask* at = new AnnounceTask(db,srv,node,info_hash,port);
+ at->start(kns,!canStartTask());
+ tman->addTask(at);
+ if (!db->contains(info_hash))
+ db->insert(info_hash);
+ return at;
+ }
+
+ return 0;
+ }
+
+ NodeLookup* DHT::refreshBucket(const dht::Key & id,KBucket & bucket)
+ {
+ if (!running)
+ return 0;
+
+ KClosestNodesSearch kns(id,K);
+ bucket.findKClosestNodes(kns);
+ bucket.updateRefreshTimer();
+ if (kns.getNumEntries() > 0)
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "DHT: refreshing bucket " << endl;
+ NodeLookup* nl = new NodeLookup(id,srv,node);
+ nl->start(kns,!canStartTask());
+ tman->addTask(nl);
+ return nl;
+ }
+
+ return 0;
+ }
+
+ NodeLookup* DHT::findNode(const dht::Key & id)
+ {
+ if (!running)
+ return 0;
+
+ KClosestNodesSearch kns(id,K);
+ node->findKClosestNodes(kns);
+ if (kns.getNumEntries() > 0)
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "DHT: finding node " << endl;
+ NodeLookup* at = new NodeLookup(id,srv,node);
+ at->start(kns,!canStartTask());
+ tman->addTask(at);
+ return at;
+ }
+
+ return 0;
+ }
+
+ void DHT::update()
+ {
+ if (!running)
+ return;
+
+ if (expire_timer.getElapsedSinceUpdate() > 5*60*1000)
+ {
+ db->expire(bt::GetCurrentTime());
+ expire_timer.update();
+ }
+
+ node->refreshBuckets(this);
+ tman->removeFinishedTasks(this);
+ stats.num_tasks = tman->getNumTasks() + tman->getNumQueuedTasks();
+ stats.num_peers = node->getNumEntriesInRoutingTable();
+ }
+
+ void DHT::timeout(const MsgBase* r)
+ {
+ node->onTimeout(r);
+ }
+
+ void DHT::addDHTNode(const QString & host,Uint16 hport)
+ {
+ if (!running)
+ return;
+
+ KResolverResults res = KResolver::resolve(host,QString::number(hport));
+ if (res.count() > 0)
+ {
+ srv->ping(node->getOurID(),res.front().address());
+ }
+ }
+
+ QMap<QString, int> DHT::getClosestGoodNodes(int maxNodes)
+ {
+ QMap<QString, int> map;
+
+ if(!node)
+ return map;
+
+ int max = 0;
+ KClosestNodesSearch kns(node->getOurID(), maxNodes*2);
+ node->findKClosestNodes(kns);
+
+ KClosestNodesSearch::Itr it;
+ for(it = kns.begin(); it != kns.end(); ++it)
+ {
+ KBucketEntry e = it->second;
+
+ if(!e.isGood())
+ continue;
+
+ KInetSocketAddress a = e.getAddress();
+
+ map.insert(a.ipAddress().toString(), a.port());
+ if(++max >= maxNodes)
+ break;
+ }
+
+ return map;
+ }
+}
+
+#include "dht.moc"
diff --git a/libktorrent/kademlia/dht.h b/libktorrent/kademlia/dht.h
new file mode 100644
index 0000000..8642836
--- /dev/null
+++ b/libktorrent/kademlia/dht.h
@@ -0,0 +1,136 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTDHT_H
+#define DHTDHT_H
+
+#include <qtimer.h>
+#include <qstring.h>
+#include <qmap.h>
+#include <util/constants.h>
+#include <util/timer.h>
+#include "key.h"
+#include "dhtbase.h"
+
+namespace bt
+{
+ class SHA1Hash;
+}
+
+namespace KNetwork
+{
+ class KInetSocketAddress;
+}
+
+namespace dht
+{
+ class Node;
+ class RPCServer;
+ class PingReq;
+ class FindNodeReq;
+ class FindValueReq;
+ class StoreValueReq;
+ class GetPeersReq;
+ class MsgBase;
+ class ErrMsg;
+ class MsgBase;
+ class AnnounceReq;
+ class Database;
+ class TaskManager;
+ class Task;
+ class AnnounceTask;
+ class NodeLookup;
+ class KBucket;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class DHT : public DHTBase
+ {
+ Q_OBJECT
+ public:
+ DHT();
+ virtual ~DHT();
+
+ void ping(PingReq* r);
+ void findNode(FindNodeReq* r);
+ void response(MsgBase* r);
+ void getPeers(GetPeersReq* r);
+ void announce(AnnounceReq* r);
+ void error(ErrMsg* r);
+ void timeout(const MsgBase* r);
+
+ /**
+ * A Peer has received a PORT message, and uses this function to alert the DHT of it.
+ * @param ip The IP of the peer
+ * @param port The port in the PORT message
+ */
+ void portRecieved(const QString & ip,bt::Uint16 port);
+
+ /**
+ * Do an announce on the DHT network
+ * @param info_hash The info_hash
+ * @param port The port
+ * @return The task which handles this
+ */
+ AnnounceTask* announce(const bt::SHA1Hash & info_hash,bt::Uint16 port);
+
+ /**
+ * Refresh a bucket using a find node task.
+ * @param id The id
+ * @param bucket The bucket to refresh
+ */
+ NodeLookup* refreshBucket(const dht::Key & id,KBucket & bucket);
+
+ /**
+ * Do a NodeLookup.
+ * @param id The id of the key to search
+ */
+ NodeLookup* findNode(const dht::Key & id);
+
+ /// See if it is possible to start a task
+ bool canStartTask() const;
+
+ void start(const QString & table,const QString & key_file,bt::Uint16 port);
+ void stop();
+ void addDHTNode(const QString & host,bt::Uint16 hport);
+
+ /**
+ * Returns maxNodes number of <IP address, port> nodes
+ * that are closest to ourselves and are good.
+ * @param maxNodes maximum nr of nodes in QMap to return.
+ */
+ QMap<QString, int> getClosestGoodNodes(int maxNodes);
+
+ private slots:
+ void update();
+
+ private:
+ Node* node;
+ RPCServer* srv;
+ Database* db;
+ TaskManager* tman;
+ bt::Timer expire_timer;
+ QString table_file;
+ QTimer update_timer;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/dhtbase.cpp b/libktorrent/kademlia/dhtbase.cpp
new file mode 100644
index 0000000..b0ff582
--- /dev/null
+++ b/libktorrent/kademlia/dhtbase.cpp
@@ -0,0 +1,37 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "dhtbase.h"
+
+namespace dht
+{
+
+ DHTBase::DHTBase() : running(false),port(0)
+ {
+ stats.num_peers = 0;
+ stats.num_tasks = 0;
+ }
+
+
+ DHTBase::~DHTBase()
+ {}
+}
+
+#include "dhtbase.moc"
+
diff --git a/libktorrent/kademlia/dhtbase.h b/libktorrent/kademlia/dhtbase.h
new file mode 100644
index 0000000..dfa880a
--- /dev/null
+++ b/libktorrent/kademlia/dhtbase.h
@@ -0,0 +1,129 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTDHTBASE_H
+#define DHTDHTBASE_H
+
+#include <qobject.h>
+#include <util/constants.h>
+
+class QString;
+
+namespace bt
+{
+ class SHA1Hash;
+}
+
+namespace dht
+{
+ class AnnounceTask;
+
+ struct Stats
+ {
+ /// number of peers in the routing table
+ bt::Uint32 num_peers;
+ /// Number of running tasks
+ bt::Uint32 num_tasks;
+ };
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Interface for DHT class, this is to keep other things separate from the inner workings
+ * of the DHT.
+ */
+ class DHTBase : public QObject
+ {
+ Q_OBJECT
+ public:
+ DHTBase();
+ virtual ~DHTBase();
+
+
+ /**
+ * Start the DHT
+ * @param table File where the save table is located
+ * @param key_file The file where the key is stored
+ * @param port The port to use
+ */
+ virtual void start(const QString & table,const QString & key_file,bt::Uint16 port) = 0;
+
+ /**
+ * Stop the DHT
+ */
+ virtual void stop() = 0;
+
+ /**
+ * Update the DHT
+ */
+ virtual void update() = 0;
+
+ /**
+ * A Peer has received a PORT message, and uses this function to alert the DHT of it.
+ * @param ip The IP of the peer
+ * @param port The port in the PORT message
+ */
+ virtual void portRecieved(const QString & ip,bt::Uint16 port) = 0;
+
+ /**
+ * Do an announce on the DHT network
+ * @param info_hash The info_hash
+ * @param port The port
+ * @return The task which handles this
+ */
+ virtual AnnounceTask* announce(const bt::SHA1Hash & info_hash,bt::Uint16 port) = 0;
+
+ /**
+ * See if the DHT is running.
+ */
+ bool isRunning() const {return running;}
+
+ /// Get the DHT port
+ bt::Uint16 getPort() const {return port;}
+
+ /// Get statistics about the DHT
+ const dht::Stats & getStats() const {return stats;}
+
+ /**
+ * Add a DHT node. This node shall be pinged immediately.
+ * @param host The hostname or ip
+ * @param hport The port of the host
+ */
+ virtual void addDHTNode(const QString & host,bt::Uint16 hport) = 0;
+
+ /**
+ * Returns maxNodes number of <IP address, port> nodes
+ * that are closest to ourselves and are good.
+ * @param maxNodes maximum nr of nodes in QMap to return.
+ */
+ virtual QMap<QString, int> getClosestGoodNodes(int maxNodes) = 0;
+
+ signals:
+ void started();
+ void stopped();
+
+ protected:
+ bool running;
+ bt::Uint16 port;
+ dht::Stats stats;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/dhttrackerbackend.cpp b/libktorrent/kademlia/dhttrackerbackend.cpp
new file mode 100644
index 0000000..c90e6f7
--- /dev/null
+++ b/libktorrent/kademlia/dhttrackerbackend.cpp
@@ -0,0 +1,154 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include <qhostaddress.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include <torrent/server.h>
+#include <torrent/peermanager.h>
+#include <interfaces/torrentinterface.h>
+#include "dhttrackerbackend.h"
+#include "dht.h"
+#include "announcetask.h"
+
+using namespace bt;
+
+namespace dht
+{
+
+ DHTTrackerBackend::DHTTrackerBackend(DHTBase & dh_table,kt::TorrentInterface* tor)
+ : dh_table(dh_table),curr_task(0),tor(tor)
+ {
+ connect(&timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
+ connect(&dh_table,SIGNAL(started()),this,SLOT(manualUpdate()));
+ connect(&dh_table,SIGNAL(stopped()),this,SLOT(dhtStopped()));
+ started = false;
+ }
+
+
+ DHTTrackerBackend::~DHTTrackerBackend()
+ {
+ if (curr_task)
+ curr_task->kill();
+ }
+
+ void DHTTrackerBackend::start()
+ {
+ started = true;
+ if (dh_table.isRunning())
+ doRequest();
+ }
+
+ void DHTTrackerBackend::dhtStopped()
+ {
+ stop(0);
+ curr_task = 0;
+ }
+
+ void DHTTrackerBackend::stop(bt::WaitJob*)
+ {
+ started = false;
+ if (curr_task)
+ {
+ curr_task->kill();
+ timer.stop();
+ }
+ }
+
+ void DHTTrackerBackend::manualUpdate()
+ {
+ if (dh_table.isRunning() && started)
+ doRequest();
+ }
+
+
+ bool DHTTrackerBackend::doRequest()
+ {
+ if (!dh_table.isRunning())
+ return false;
+
+ if (curr_task)
+ return true;
+
+ const SHA1Hash & info_hash = tor->getInfoHash();
+ Uint16 port = bt::Globals::instance().getServer().getPortInUse();
+ curr_task = dh_table.announce(info_hash,port);
+ if (curr_task)
+ {
+ for (Uint32 i = 0;i < tor->getNumDHTNodes();i++)
+ {
+ const kt::DHTNode & n = tor->getDHTNode(i);
+ curr_task->addDHTNode(n.ip,n.port);
+ }
+ connect(curr_task,SIGNAL(dataReady( Task* )),this,SLOT(onDataReady( Task* )));
+ connect(curr_task,SIGNAL(finished( Task* )),this,SLOT(onFinished( Task* )));
+
+ return true;
+ }
+
+ return false;
+ }
+
+ void DHTTrackerBackend::onFinished(Task* t)
+ {
+ if (curr_task == t)
+ {
+ onDataReady(curr_task);
+ curr_task = 0;
+ // do another announce in 5 minutes or so
+ timer.start(5 * 60 * 1000,true);
+ }
+ }
+
+ void DHTTrackerBackend::onDataReady(Task* t)
+ {
+ if (curr_task == t)
+ {
+ Uint32 cnt = 0;
+ DBItem item;
+ while (curr_task->takeItem(item))
+ {
+ Uint16 port = bt::ReadUint16(item.getData(),4);
+ QString ip = QHostAddress(ReadUint32(item.getData(),0)).toString();
+
+ addPeer(ip,port);
+ cnt++;
+ }
+
+ if (cnt)
+ {
+ Out(SYS_DHT|LOG_NOTICE) <<
+ QString("DHT: Got %1 potential peers for torrent %2")
+ .arg(cnt).arg(tor->getStats().torrent_name) << endl;
+ peersReady(this);
+ }
+ }
+ }
+
+ void DHTTrackerBackend::onTimeout()
+ {
+ if (dh_table.isRunning() && started)
+ doRequest();
+ }
+
+}
+
+#include "dhttrackerbackend.moc"
diff --git a/libktorrent/kademlia/dhttrackerbackend.h b/libktorrent/kademlia/dhttrackerbackend.h
new file mode 100644
index 0000000..355aab9
--- /dev/null
+++ b/libktorrent/kademlia/dhttrackerbackend.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTDHTTRACKERBACKEND_H
+#define DHTDHTTRACKERBACKEND_H
+
+#include <qtimer.h>
+#include <interfaces/peersource.h>
+#include "task.h"
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+namespace bt
+{
+ class WaitJob;
+}
+
+
+namespace dht
+{
+ class DHTBase;
+ class AnnounceTask;
+
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class DHTTrackerBackend : public kt::PeerSource
+ {
+ Q_OBJECT
+ public:
+ DHTTrackerBackend(DHTBase & dh_table,kt::TorrentInterface* tor);
+ virtual ~DHTTrackerBackend();
+
+ virtual void start();
+ virtual void stop(bt::WaitJob* wjob = 0);
+ virtual void manualUpdate();
+
+ private slots:
+ void onTimeout();
+ bool doRequest();
+ void onDataReady(Task* t);
+ void onFinished(Task* t);
+ void dhtStopped();
+
+ private:
+ DHTBase & dh_table;
+ AnnounceTask* curr_task;
+ kt::TorrentInterface* tor;
+ QTimer timer;
+ bool started;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/kbucket.cpp b/libktorrent/kademlia/kbucket.cpp
new file mode 100644
index 0000000..fb60d1b
--- /dev/null
+++ b/libktorrent/kademlia/kbucket.cpp
@@ -0,0 +1,355 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <ksocketaddress.h>
+#include <util/file.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <netinet/in.h>
+#include "kbucket.h"
+#include "kclosestnodessearch.h"
+#include "rpcserver.h"
+#include "node.h"
+
+using namespace KNetwork;
+using namespace bt;
+
+namespace dht
+{
+ KBucketEntry::KBucketEntry()
+ {
+ last_responded = bt::GetCurrentTime();
+ failed_queries = 0;
+ questionable_pings = 0;
+ }
+
+ KBucketEntry::KBucketEntry(const KInetSocketAddress & addr,const Key & id)
+ : addr(addr),node_id(id)
+ {
+ last_responded = bt::GetCurrentTime();
+ failed_queries = 0;
+ questionable_pings = 0;
+ }
+
+ KBucketEntry::KBucketEntry(const KBucketEntry & other)
+ : addr(other.addr),node_id(other.node_id),
+ last_responded(other.last_responded),failed_queries(other.failed_queries),questionable_pings(other.questionable_pings)
+ {}
+
+
+ KBucketEntry::~KBucketEntry()
+ {}
+
+ KBucketEntry & KBucketEntry::operator = (const KBucketEntry & other)
+ {
+ addr = other.addr;
+ node_id = other.node_id;
+ last_responded = other.last_responded;
+ failed_queries = other.failed_queries;
+ questionable_pings = other.questionable_pings;
+ return *this;
+ }
+
+ bool KBucketEntry::operator == (const KBucketEntry & entry) const
+ {
+ return addr == entry.addr && node_id == entry.node_id;
+ }
+
+ bool KBucketEntry::isGood() const
+ {
+ if (bt::GetCurrentTime() - last_responded > 15 * 60 * 1000)
+ return false;
+ else
+ return true;
+ }
+
+ bool KBucketEntry::isQuestionable() const
+ {
+ if (bt::GetCurrentTime() - last_responded > 15 * 60 * 1000)
+ return true;
+ else
+ return false;
+ }
+
+
+ bool KBucketEntry::isBad() const
+ {
+ if (isGood())
+ return false;
+
+ return failed_queries > 2 || questionable_pings > 2;
+ }
+
+ void KBucketEntry::hasResponded()
+ {
+ last_responded = bt::GetCurrentTime();
+ failed_queries = 0; // reset failed queries
+ questionable_pings = 0;
+ }
+
+
+ //////////////////////////////////////////////////////////
+
+ KBucket::KBucket(Uint32 idx,RPCServer* srv,Node* node)
+ : idx(idx),srv(srv),node(node)
+ {
+ last_modified = bt::GetCurrentTime();
+ refresh_task = 0;
+ }
+
+
+ KBucket::~KBucket()
+ {}
+
+ void KBucket::insert(const KBucketEntry & entry)
+ {
+ QValueList<KBucketEntry>::iterator i = entries.find(entry);
+
+ // If in the list, move it to the end
+ if (i != entries.end())
+ {
+ KBucketEntry & e = *i;
+ e.hasResponded();
+ last_modified = bt::GetCurrentTime();
+ entries.remove(i);
+ entries.append(entry);
+ return;
+ }
+
+ // insert if not already in the list and we still have room
+ if (i == entries.end() && entries.count() < dht::K)
+ {
+ entries.append(entry);
+ last_modified = bt::GetCurrentTime();
+ }
+ else if (!replaceBadEntry(entry))
+ {
+ // ping questionable nodes when replacing a bad one fails
+ pingQuestionable(entry);
+ }
+ }
+
+ void KBucket::onResponse(RPCCall* c,MsgBase* rsp)
+ {
+ last_modified = bt::GetCurrentTime();
+
+ if (!pending_entries_busy_pinging.contains(c))
+ return;
+
+ KBucketEntry entry = pending_entries_busy_pinging[c];
+ pending_entries_busy_pinging.erase(c); // call is done so erase it
+
+ // we have a response so try to find the next bad or questionable node
+ // if we do not have room see if we can get rid of some bad peers
+ if (!replaceBadEntry(entry)) // if no bad peers ping a questionable one
+ pingQuestionable(entry);
+
+ }
+
+
+
+ void KBucket::onTimeout(RPCCall* c)
+ {
+ if (!pending_entries_busy_pinging.contains(c))
+ return;
+
+ KBucketEntry entry = pending_entries_busy_pinging[c];
+
+ // replace the entry which timed out
+ QValueList<KBucketEntry>::iterator i;
+ for (i = entries.begin();i != entries.end();i++)
+ {
+ KBucketEntry & e = *i;
+ if (e.getAddress() == c->getRequest()->getOrigin())
+ {
+ last_modified = bt::GetCurrentTime();
+ entries.remove(i);
+ entries.append(entry);
+ break;
+ }
+ }
+ pending_entries_busy_pinging.erase(c); // call is done so erase it
+ // see if we can do another pending entry
+ if (pending_entries_busy_pinging.count() < 2 && pending_entries.count() > 0)
+ {
+ KBucketEntry pe = pending_entries.front();
+ pending_entries.pop_front();
+ if (!replaceBadEntry(pe)) // if no bad peers ping a questionable one
+ pingQuestionable(pe);
+ }
+ }
+
+ void KBucket::pingQuestionable(const KBucketEntry & replacement_entry)
+ {
+ if (pending_entries_busy_pinging.count() >= 2)
+ {
+ pending_entries.append(replacement_entry); // lets not have to many pending_entries calls going on
+ return;
+ }
+
+ QValueList<KBucketEntry>::iterator i;
+ // we haven't found any bad ones so try the questionable ones
+ for (i = entries.begin();i != entries.end();i++)
+ {
+ KBucketEntry & e = *i;
+ if (e.isQuestionable())
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "Pinging questionable node : " << e.getAddress().toString() << endl;
+ PingReq* p = new PingReq(node->getOurID());
+ p->setDestination(e.getAddress());
+ RPCCall* c = srv->doCall(p);
+ if (c)
+ {
+ e.onPingQuestionable();
+ c->addListener(this);
+ // add the pending entry
+ pending_entries_busy_pinging.insert(c,replacement_entry);
+ return;
+ }
+ }
+ }
+ }
+
+ bool KBucket::replaceBadEntry(const KBucketEntry & entry)
+ {
+ QValueList<KBucketEntry>::iterator i;
+ for (i = entries.begin();i != entries.end();i++)
+ {
+ KBucketEntry & e = *i;
+ if (e.isBad())
+ {
+ // bad one get rid of it
+ last_modified = bt::GetCurrentTime();
+ entries.remove(i);
+ entries.append(entry);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool KBucket::contains(const KBucketEntry & entry) const
+ {
+ return entries.contains(entry);
+ }
+
+ void KBucket::findKClosestNodes(KClosestNodesSearch & kns)
+ {
+ QValueList<KBucketEntry>::iterator i = entries.begin();
+ while (i != entries.end())
+ {
+ kns.tryInsert(*i);
+ i++;
+ }
+ }
+
+ bool KBucket::onTimeout(const KInetSocketAddress & addr)
+ {
+ QValueList<KBucketEntry>::iterator i;
+
+ for (i = entries.begin();i != entries.end();i++)
+ {
+ KBucketEntry & e = *i;
+ if (e.getAddress() == addr)
+ {
+ e.requestTimeout();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool KBucket::needsToBeRefreshed() const
+ {
+ bt::TimeStamp now = bt::GetCurrentTime();
+ if (last_modified > now)
+ {
+ last_modified = now;
+ return false;
+ }
+
+ return !refresh_task && entries.count() > 0 && (now - last_modified > BUCKET_REFRESH_INTERVAL);
+ }
+
+ void KBucket::updateRefreshTimer()
+ {
+ last_modified = bt::GetCurrentTime();
+ }
+
+
+
+ void KBucket::save(bt::File & fptr)
+ {
+ BucketHeader hdr;
+ hdr.magic = BUCKET_MAGIC_NUMBER;
+ hdr.index = idx;
+ hdr.num_entries = entries.count();
+
+ fptr.write(&hdr,sizeof(BucketHeader));
+ QValueList<KBucketEntry>::iterator i;
+ for (i = entries.begin();i != entries.end();i++)
+ {
+ KBucketEntry & e = *i;
+ const KIpAddress & ip = e.getAddress().ipAddress();
+ Uint8 tmp[26];
+ bt::WriteUint32(tmp,0,ip.IPv4Addr());
+ bt::WriteUint16(tmp,4,e.getAddress().port());
+ memcpy(tmp+6,e.getID().getData(),20);
+ fptr.write(tmp,26);
+ }
+ }
+
+ void KBucket::load(bt::File & fptr,const BucketHeader & hdr)
+ {
+ if (hdr.num_entries > K)
+ return;
+
+ for (Uint32 i = 0;i < hdr.num_entries;i++)
+ {
+ Uint8 tmp[26];
+ if (fptr.read(tmp,26) != 26)
+ return;
+
+ entries.append(KBucketEntry(
+ KInetSocketAddress(
+ KIpAddress(bt::ReadUint32(tmp,0)),
+ bt::ReadUint16(tmp,4)),
+ dht::Key(tmp+6)));
+ }
+ }
+
+ void KBucket::onFinished(Task* t)
+ {
+ if (t == refresh_task)
+ refresh_task = 0;
+ }
+
+ void KBucket::setRefreshTask(Task* t)
+ {
+ refresh_task = t;
+ if (refresh_task)
+ {
+ connect(refresh_task,SIGNAL(finished( Task* )),
+ this,SLOT(onFinished( Task* )));
+ }
+ }
+
+}
+
+#include "kbucket.moc"
diff --git a/libktorrent/kademlia/kbucket.h b/libktorrent/kademlia/kbucket.h
new file mode 100644
index 0000000..139ce10
--- /dev/null
+++ b/libktorrent/kademlia/kbucket.h
@@ -0,0 +1,212 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTKBUCKET_H
+#define DHTKBUCKET_H
+
+#include <qvaluelist.h>
+#include <util/constants.h>
+#include <ksocketaddress.h>
+#include "key.h"
+#include "rpccall.h"
+#include "task.h"
+
+using bt::Uint32;
+using bt::Uint16;
+using bt::Uint8;
+using KNetwork::KInetSocketAddress;
+
+namespace bt
+{
+ class File;
+}
+
+namespace dht
+{
+ class RPCServer;
+ class KClosestNodesSearch;
+ class Node;
+ class Task;
+
+ const Uint32 K = 8;
+ const Uint32 BUCKET_MAGIC_NUMBER = 0xB0C4B0C4;
+ const Uint32 BUCKET_REFRESH_INTERVAL = 15 * 60 * 1000;
+// const Uint32 BUCKET_REFRESH_INTERVAL = 120 * 1000;
+
+ struct BucketHeader
+ {
+ Uint32 magic;
+ Uint32 index;
+ Uint32 num_entries;
+ };
+
+ /**
+ * @author Joris Guisson
+ *
+ * Entry in a KBucket, it basically contains an ip_address of a node,
+ * the udp port of the node and a node_id.
+ */
+ class KBucketEntry
+ {
+ KInetSocketAddress addr;
+ Key node_id;
+ bt::TimeStamp last_responded;
+ Uint32 failed_queries;
+ Uint32 questionable_pings;
+ public:
+ /**
+ * Constructor, sets everything to 0.
+ * @return
+ */
+ KBucketEntry();
+
+ /**
+ * Constructor, set the ip, port and key
+ * @param addr socket address
+ * @param id ID of node
+ */
+ KBucketEntry(const KInetSocketAddress & addr,const Key & id);
+
+ /**
+ * Copy constructor.
+ * @param other KBucketEntry to copy
+ * @return
+ */
+ KBucketEntry(const KBucketEntry & other);
+
+ /// Destructor
+ virtual ~KBucketEntry();
+
+ /**
+ * Assignment operator.
+ * @param other Node to copy
+ * @return this KBucketEntry
+ */
+ KBucketEntry & operator = (const KBucketEntry & other);
+
+ /// Equality operator
+ bool operator == (const KBucketEntry & entry) const;
+
+ /// Get the socket address of the node
+ const KInetSocketAddress & getAddress() const {return addr;}
+
+ /// Get it's ID
+ const Key & getID() const {return node_id;}
+
+ /// Is this node a good node
+ bool isGood() const;
+
+ /// Is this node questionable (haven't heard from it in the last 15 minutes)
+ bool isQuestionable() const;
+
+ /// Is it a bad node. (Hasn't responded to a query
+ bool isBad() const;
+
+ /// Signal the entry that the peer has responded
+ void hasResponded();
+
+ /// A request timed out
+ void requestTimeout() {failed_queries++;}
+
+ /// The entry has been pinged because it is questionable
+ void onPingQuestionable() {questionable_pings++;}
+
+ /// The null entry
+ static KBucketEntry null;
+ };
+
+
+ /**
+ * @author Joris Guisson
+ *
+ * A KBucket is just a list of KBucketEntry objects.
+ * The list is sorted by time last seen :
+ * The first element is the least recently seen, the last
+ * the most recently seen.
+ */
+ class KBucket : public RPCCallListener
+ {
+ Q_OBJECT
+
+ Uint32 idx;
+ QValueList<KBucketEntry> entries,pending_entries;
+ RPCServer* srv;
+ Node* node;
+ QMap<RPCCall*,KBucketEntry> pending_entries_busy_pinging;
+ mutable bt::TimeStamp last_modified;
+ Task* refresh_task;
+ public:
+ KBucket(Uint32 idx,RPCServer* srv,Node* node);
+ virtual ~KBucket();
+
+ /**
+ * Inserts an entry into the bucket.
+ * @param entry The entry to insert
+ */
+ void insert(const KBucketEntry & entry);
+
+ /// Get the least recently seen node
+ const KBucketEntry & leastRecentlySeen() const {return entries[0];}
+
+ /// Get the number of entries
+ Uint32 getNumEntries() const {return entries.count();}
+
+ /// See if this bucket contains an entry
+ bool contains(const KBucketEntry & entry) const;
+
+ /**
+ * Find the K closest entries to a key and store them in the KClosestNodesSearch
+ * object.
+ * @param kns The object to storre the search results
+ */
+ void findKClosestNodes(KClosestNodesSearch & kns);
+
+ /**
+ * A peer failed to respond
+ * @param addr Address of the peer
+ */
+ bool onTimeout(const KInetSocketAddress & addr);
+
+ /// Check if the bucket needs to be refreshed
+ bool needsToBeRefreshed() const;
+
+ /// save the bucket to a file
+ void save(bt::File & fptr);
+
+ /// Load the bucket from a file
+ void load(bt::File & fptr,const BucketHeader & hdr);
+
+ /// Update the refresh timer of the bucket
+ void updateRefreshTimer();
+
+ /// Set the refresh task
+ void setRefreshTask(Task* t);
+
+ private:
+ virtual void onResponse(RPCCall* c,MsgBase* rsp);
+ virtual void onTimeout(RPCCall* c);
+ void pingQuestionable(const KBucketEntry & replacement_entry);
+ bool replaceBadEntry(const KBucketEntry & entry);
+
+ private slots:
+ void onFinished(Task* t);
+ };
+}
+
+#endif
diff --git a/libktorrent/kademlia/kclosestnodessearch.cpp b/libktorrent/kademlia/kclosestnodessearch.cpp
new file mode 100644
index 0000000..4a97c7f
--- /dev/null
+++ b/libktorrent/kademlia/kclosestnodessearch.cpp
@@ -0,0 +1,84 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/functions.h>
+#include "kclosestnodessearch.h"
+#include "pack.h"
+
+using namespace bt;
+using namespace KNetwork;
+
+namespace dht
+{
+ typedef std::map<dht::Key,KBucketEntry>::iterator KNSitr;
+
+ KClosestNodesSearch::KClosestNodesSearch(const dht::Key & key,Uint32 max_entries)
+ : key(key),max_entries(max_entries)
+ {}
+
+
+ KClosestNodesSearch::~KClosestNodesSearch()
+ {}
+
+
+ void KClosestNodesSearch::tryInsert(const KBucketEntry & e)
+ {
+ // calculate distance between key and e
+ dht::Key d = dht::Key::distance(key,e.getID());
+
+ if (emap.size() < max_entries)
+ {
+ // room in the map so just insert
+ emap.insert(std::make_pair(d,e));
+ }
+ else
+ {
+ // now find the max distance
+ // seeing that the last element of the map has also
+ // the biggest distance to key (std::map is sorted on the distance)
+ // we just take the last
+ const dht::Key & max = emap.rbegin()->first;
+ if (d < max)
+ {
+ // insert if d is smaller then max
+ emap.insert(std::make_pair(d,e));
+ // erase the old max value
+ emap.erase(max);
+ }
+ }
+
+ }
+
+ void KClosestNodesSearch::pack(QByteArray & ba)
+ {
+ // make sure we do not writ to much
+ Uint32 max_items = ba.size() / 26;
+ Uint32 j = 0;
+
+ KNSitr i = emap.begin();
+ while (i != emap.end() && j < max_items)
+ {
+ PackBucketEntry(i->second,ba,j*26);
+ i++;
+ j++;
+ i++;
+ }
+ }
+
+}
diff --git a/libktorrent/kademlia/kclosestnodessearch.h b/libktorrent/kademlia/kclosestnodessearch.h
new file mode 100644
index 0000000..e006a25
--- /dev/null
+++ b/libktorrent/kademlia/kclosestnodessearch.h
@@ -0,0 +1,90 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTKCLOSESTNODESSEARCH_H
+#define DHTKCLOSESTNODESSEARCH_H
+
+#include <map>
+#include "key.h"
+#include "kbucket.h"
+
+namespace dht
+{
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Class used to store the search results during a K closests nodes search
+ * Note: we use a std::map because of lack of functionality in QMap
+ */
+ class KClosestNodesSearch
+ {
+ dht::Key key;
+ std::map<dht::Key,KBucketEntry> emap;
+ Uint32 max_entries;
+ public:
+ /**
+ * Constructor sets the key to compare with
+ * @param key The key to compare with
+ * @param max_entries The maximum number of entries can be in the map
+ * @return
+ */
+ KClosestNodesSearch(const dht::Key & key,Uint32 max_entries);
+ virtual ~KClosestNodesSearch();
+
+ typedef std::map<dht::Key,KBucketEntry>::iterator Itr;
+ typedef std::map<dht::Key,KBucketEntry>::const_iterator CItr;
+
+ Itr begin() {return emap.begin();}
+ Itr end() {return emap.end();}
+
+ CItr begin() const {return emap.begin();}
+ CItr end() const {return emap.end();}
+
+ /// Get the target key of the search3
+ const dht::Key & getSearchTarget() const {return key;}
+
+ /// Get the number of entries.
+ bt::Uint32 getNumEntries() const {return emap.size();}
+
+ /**
+ * Try to insert an entry.
+ * @param e The entry
+ */
+ void tryInsert(const KBucketEntry & e);
+
+ /**
+ * Gets the required space in bytes to pack the nodes.
+ * This should be used to determin the size of the buffer
+ * passed to pack.
+ * @return 26 * number of entries
+ */
+ Uint32 requiredSpace() const {return emap.size()* 26;}
+
+ /**
+ * Pack the search results in a buffer, the buffer should have
+ * enough space to store requiredSpace() bytes.
+ * @param ba The buffer
+ */
+ void pack(QByteArray & ba);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/key.cpp b/libktorrent/kademlia/key.cpp
new file mode 100644
index 0000000..6e62ff6
--- /dev/null
+++ b/libktorrent/kademlia/key.cpp
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <time.h>
+#include <stdlib.h>
+#include <qcstring.h>
+#include <util/constants.h>
+#include "key.h"
+
+using namespace bt;
+
+namespace dht
+{
+
+ Key::Key()
+ {}
+
+ Key::Key(const bt::SHA1Hash & k) : bt::SHA1Hash(k)
+ {
+ }
+
+ Key::Key(const Uint8* d) : bt::SHA1Hash(d)
+ {
+ }
+
+ Key::Key(const QByteArray & ba)
+ {
+ for (Uint32 i = 0;i < 20 && i < ba.size();i++)
+ hash[i] = ba[i];
+ }
+
+ Key::~Key()
+ {}
+
+ bool Key::operator == (const Key & other) const
+ {
+ return bt::SHA1Hash::operator ==(other);
+ }
+
+ bool Key::operator != (const Key & other) const
+ {
+ return !operator == (other);
+ }
+
+ bool Key::operator < (const Key & other) const
+ {
+ for (int i = 0;i < 20;i++)
+ {
+ if (hash[i] < other.hash[i])
+ return true;
+ else if (hash[i] > other.hash[i])
+ return false;
+ }
+ return false;
+ }
+
+ bool Key::operator <= (const Key & other) const
+ {
+ return operator < (other) || operator == (other);
+ }
+
+ bool Key::operator > (const Key & other) const
+ {
+ for (int i = 0;i < 20;i++)
+ {
+ if (hash[i] < other.hash[i])
+ return false;
+ else if (hash[i] > other.hash[i])
+ return true;
+ }
+ return false;
+ }
+
+ bool Key::operator >= (const Key & other) const
+ {
+ return operator > (other) || operator == (other);
+ }
+
+ Key Key::distance(const Key & a,const Key & b)
+ {
+ return a ^ b;
+ }
+
+ Key Key::random()
+ {
+ srand(time(0));
+ Key k;
+ for (int i = 0;i < 20;i++)
+ {
+ k.hash[i] = (Uint8)rand() % 0xFF;
+ }
+ return k;
+ }
+}
diff --git a/libktorrent/kademlia/key.h b/libktorrent/kademlia/key.h
new file mode 100644
index 0000000..e818dc1
--- /dev/null
+++ b/libktorrent/kademlia/key.h
@@ -0,0 +1,129 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTKEY_H
+#define DHTKEY_H
+
+#include <qcstring.h>
+#include <util/sha1hash.h>
+
+
+
+namespace dht
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Key in the distributed hash table
+ *
+ * Key's in the distributed hash table are just SHA-1 hashes.
+ * Key provides all necesarry operators to be used as a value.
+ */
+ class Key : public bt::SHA1Hash
+ {
+ public:
+ /**
+ * Constructor, sets key to 0.
+ */
+ Key();
+
+ /**
+ * Copy constructor. Seeing that Key doesn't add any data
+ * we just pass a SHA1Hash, Key's are automatically covered by this
+ * @param k Hash to copy
+ */
+ Key(const bt::SHA1Hash & k);
+
+ /**
+ * Make a key out of a bytearray
+ * @param ba The QByteArray
+ */
+ Key(const QByteArray & ba);
+
+ /**
+ * Make a key out of a 20 byte array.
+ * @param d The array
+ */
+ Key(const bt::Uint8* d);
+
+ /// Destructor.
+ virtual ~Key();
+
+ /**
+ * Create a random key.
+ * @return A random Key
+ */
+ static Key random();
+
+ /**
+ * Equality operator.
+ * @param other The key to compare
+ * @return true if this key is equal to other
+ */
+ bool operator == (const Key & other) const;
+
+ /**
+ * Inequality operator.
+ * @param other The key to compare
+ * @return true if this key is not equal to other
+ */
+ bool operator != (const Key & other) const;
+
+ /**
+ * Smaller then operator.
+ * @param other The key to compare
+ * @return rue if this key is smaller then other
+ */
+ bool operator < (const Key & other) const;
+
+
+ /**
+ * Smaller then or equal operator.
+ * @param other The key to compare
+ * @return rue if this key is smaller then or equal to other
+ */
+ bool operator <= (const Key & other) const;
+
+
+ /**
+ * Greater then operator.
+ * @param other The key to compare
+ * @return rue if this key is greater then other
+ */
+ bool operator > (const Key & other) const;
+
+ /**
+ * Greater then or equal operator.
+ * @param other The key to compare
+ * @return rue if this key is greater then or equal to other
+ */
+ bool operator >= (const Key & other) const;
+
+ /**
+ * The distance of two keys is the keys xor together.
+ * @param a The first key
+ * @param b The second key
+ * @return a xor b
+ */
+ static Key distance(const Key & a,const Key & b);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/node.cpp b/libktorrent/kademlia/node.cpp
new file mode 100644
index 0000000..96c39a4
--- /dev/null
+++ b/libktorrent/kademlia/node.cpp
@@ -0,0 +1,287 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/file.h>
+#include <util/fileops.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include "node.h"
+#include "rpcmsg.h"
+#include "key.h"
+#include "rpccall.h"
+#include "rpcserver.h"
+#include "kclosestnodessearch.h"
+#include "dht.h"
+#include "nodelookup.h"
+
+using namespace bt;
+using namespace KNetwork;
+
+namespace dht
+{
+ static void SaveKey(const dht::Key & key,const QString & key_file)
+ {
+ bt::File fptr;
+ if (!fptr.open(key_file,"wb"))
+ {
+ Out(SYS_DHT|LOG_IMPORTANT) << "DHT: Cannot open file " << key_file << " : " << fptr.errorString() << endl;
+ return;
+ }
+
+ fptr.write(key.getData(),20);
+ fptr.close();
+ }
+
+ static dht::Key LoadKey(const QString & key_file,bool & new_key)
+ {
+ bt::File fptr;
+ if (!fptr.open(key_file,"rb"))
+ {
+ Out(SYS_DHT|LOG_IMPORTANT) << "DHT: Cannot open file " << key_file << " : " << fptr.errorString() << endl;
+ dht::Key r = dht::Key::random();
+ SaveKey(r,key_file);
+ new_key = true;
+ return r;
+ }
+
+ Uint8 data[20];
+ if (fptr.read(data,20) != 20)
+ {
+ dht::Key r = dht::Key::random();
+ SaveKey(r,key_file);
+ new_key = true;
+ return r;
+ }
+
+ new_key = false;
+ return dht::Key(data);
+ }
+
+ Node::Node(RPCServer* srv,const QString & key_file) : srv(srv)
+ {
+ num_receives = 0;
+ num_entries = 0;
+ delete_table = false;
+ our_id = LoadKey(key_file,delete_table);
+ for (int i = 0;i < 160;i++)
+ bucket[i] = 0;
+ }
+
+
+ Node::~Node()
+ {
+ for (int i = 0;i < 160;i++)
+ {
+ KBucket* b = bucket[i];
+ if (b)
+ delete b;
+ }
+ }
+
+ Uint8 Node::findBucket(const dht::Key & id)
+ {
+ // XOR our id and the sender's ID
+ dht::Key d = dht::Key::distance(id,our_id);
+ // now use the first on bit to determin which bucket it should go in
+
+ Uint8 bit_on = 0xFF;
+ for (Uint32 i = 0;i < 20;i++)
+ {
+ // get the byte
+ Uint8 b = *(d.getData() + i);
+ // no bit on in this byte so continue
+ if (b == 0x00)
+ continue;
+
+ for (Uint8 j = 0;j < 8;j++)
+ {
+ if (b & (0x80 >> j))
+ {
+ // we have found the bit
+ bit_on = (19 - i)*8 + (7 - j);
+ return bit_on;
+ }
+ }
+ }
+ return bit_on;
+ }
+
+ void Node::recieved(DHT* dh_table,const MsgBase* msg)
+ {
+ Uint8 bit_on = findBucket(msg->getID());
+
+ // return if bit_on is not good
+ if (bit_on >= 160)
+ return;
+
+ // make the bucket if it doesn't exist
+ if (!bucket[bit_on])
+ bucket[bit_on] = new KBucket(bit_on,srv,this);
+
+ // insert it into the bucket
+ KBucket* kb = bucket[bit_on];
+ kb->insert(KBucketEntry(msg->getOrigin(),msg->getID()));
+ num_receives++;
+ if (num_receives == 3)
+ {
+ // do a node lookup upon our own id
+ // when we insert the first entry in the table
+ dh_table->findNode(our_id);
+ }
+
+ num_entries = 0;
+ for (Uint32 i = 0;i < 160;i++)
+ if (bucket[i])
+ num_entries += bucket[i]->getNumEntries();
+ }
+
+ void Node::findKClosestNodes(KClosestNodesSearch & kns)
+ {
+ // go over all buckets until
+ for (Uint32 i = 0;i < 160;i++)
+ {
+ if (bucket[i])
+ {
+ bucket[i]->findKClosestNodes(kns);
+ }
+ }
+ }
+
+ void Node::onTimeout(const MsgBase* msg)
+ {
+ for (Uint32 i = 0;i < 160;i++)
+ {
+ if (bucket[i] && bucket[i]->onTimeout(msg->getDestination()))
+ {
+ return;
+ }
+ }
+ }
+
+ /// Generate a random key which lies in a certain bucket
+ Key RandomKeyInBucket(Uint32 b,const Key & our_id)
+ {
+ // first generate a random one
+ Key r = dht::Key::random();
+ Uint8* data = (Uint8*)r.getData();
+
+ // before we hit bit b, everything needs to be equal to our_id
+ Uint8 nb = b / 8;
+ for (Uint8 i = 0;i < nb;i++)
+ data[i] = *(our_id.getData() + i);
+
+
+ // copy all bits of ob, until we hit the bit which needs to be different
+ Uint8 ob = *(our_id.getData() + nb);
+ for (Uint8 j = 0;j < b % 8;j++)
+ {
+ if ((0x80 >> j) & ob)
+ data[nb] |= (0x80 >> j);
+ else
+ data[nb] &= ~(0x80 >> j);
+ }
+
+ // if the bit b is on turn it off else turn it on
+ if ((0x80 >> (b % 8)) & ob)
+ data[nb] &= ~(0x80 >> (b % 8));
+ else
+ data[nb] |= (0x80 >> (b % 8));
+
+ return Key(data);
+ }
+
+ void Node::refreshBuckets(DHT* dh_table)
+ {
+ for (Uint32 i = 0;i < 160;i++)
+ {
+ KBucket* b = bucket[i];
+ if (b && b->needsToBeRefreshed())
+ {
+ // the key needs to be the refreshed
+ NodeLookup* nl = dh_table->refreshBucket(RandomKeyInBucket(i,our_id),*b);
+ if (nl)
+ b->setRefreshTask(nl);
+ }
+ }
+ }
+
+
+ void Node::saveTable(const QString & file)
+ {
+ bt::File fptr;
+ if (!fptr.open(file,"wb"))
+ {
+ Out(SYS_DHT|LOG_IMPORTANT) << "DHT: Cannot open file " << file << " : " << fptr.errorString() << endl;
+ return;
+ }
+
+ for (Uint32 i = 0;i < 160;i++)
+ {
+ KBucket* b = bucket[i];
+ if (b)
+ {
+ b->save(fptr);
+ }
+ }
+ }
+
+ void Node::loadTable(const QString & file)
+ {
+ if (delete_table)
+ {
+ delete_table = false;
+ bt::Delete(file,true);
+ Out(SYS_DHT|LOG_IMPORTANT) << "DHT: new key, so removing table" << endl;
+ return;
+ }
+
+ bt::File fptr;
+ if (!fptr.open(file,"rb"))
+ {
+ Out(SYS_DHT|LOG_IMPORTANT) << "DHT: Cannot open file " << file << " : " << fptr.errorString() << endl;
+ return;
+ }
+
+ num_entries = 0;
+ while (!fptr.eof())
+ {
+ BucketHeader hdr;
+ if (fptr.read(&hdr,sizeof(BucketHeader)) != sizeof(BucketHeader))
+ return;
+
+ if (hdr.magic != dht::BUCKET_MAGIC_NUMBER || hdr.num_entries > dht::K || hdr.index > 160)
+ return;
+
+ if (hdr.num_entries == 0)
+ continue;
+
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: Loading bucket " << hdr.index << endl;
+ if (bucket[hdr.index])
+ delete bucket[hdr.index];
+
+ bucket[hdr.index] = new KBucket(hdr.index,srv,this);
+ bucket[hdr.index]->load(fptr,hdr);
+ num_entries += bucket[hdr.index]->getNumEntries();
+ }
+ }
+}
+
+#include "node.moc"
diff --git a/libktorrent/kademlia/node.h b/libktorrent/kademlia/node.h
new file mode 100644
index 0000000..56f41f1
--- /dev/null
+++ b/libktorrent/kademlia/node.h
@@ -0,0 +1,103 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTNODE_H
+#define DHTNODE_H
+
+#include <qobject.h>
+#include "key.h"
+#include "kbucket.h"
+
+
+using bt::Uint8;
+
+namespace dht
+{
+ class DHT;
+ class MsgBase;
+ class RPCServer;
+ class KClosestNodesSearch;
+
+ /**
+ * @author Joris Guisson
+ *
+ * A Node represents us in the kademlia network. It contains
+ * our id and 160 KBucket's.
+ * A KBucketEntry is in node i, when the difference between our id and
+ * the KBucketEntry's id is between 2 to the power i and 2 to the power i+1.
+ */
+ class Node : public QObject
+ {
+ Q_OBJECT
+ public:
+ Node(RPCServer* srv,const QString & key_file);
+ virtual ~Node();
+
+ /**
+ * An RPC message was received, the node must now update
+ * the right bucket.
+ * @param dh_table The DHT
+ * @param msg The message
+ * @param srv The RPCServer to send a ping if necessary
+ */
+ void recieved(DHT* dh_table,const MsgBase* msg);
+
+ /// Get our own ID
+ const dht::Key & getOurID() const {return our_id;}
+
+ /**
+ * Find the K closest entries to a key and store them in the KClosestNodesSearch
+ * object.
+ * @param kns The object to storre the search results
+ */
+ void findKClosestNodes(KClosestNodesSearch & kns);
+
+ /**
+ * Increase the failed queries count of the bucket entry we sent the message to
+ */
+ void onTimeout(const MsgBase* msg);
+
+ /// Check if a buckets needs to be refreshed, and refresh if necesarry
+ void refreshBuckets(DHT* dh_table);
+
+ /// Save the routing table to a file
+ void saveTable(const QString & file);
+
+ /// Load the routing table from a file
+ void loadTable(const QString & file);
+
+ /// Get the number of entries in the routing table
+ Uint32 getNumEntriesInRoutingTable() const {return num_entries;}
+ private:
+ Uint8 findBucket(const dht::Key & id);
+
+
+
+ private:
+ dht::Key our_id;
+ KBucket* bucket[160];
+ RPCServer* srv;
+ Uint32 num_receives;
+ Uint32 num_entries;
+ bool delete_table;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/nodelookup.cpp b/libktorrent/kademlia/nodelookup.cpp
new file mode 100644
index 0000000..9fa616c
--- /dev/null
+++ b/libktorrent/kademlia/nodelookup.cpp
@@ -0,0 +1,98 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <torrent/globals.h>
+#include "nodelookup.h"
+#include "rpcmsg.h"
+#include "node.h"
+#include "pack.h"
+
+using namespace bt;
+
+namespace dht
+{
+
+ NodeLookup::NodeLookup(const dht::Key & key,RPCServer* rpc,Node* node)
+ : Task(rpc,node),node_id(key),num_nodes_rsp(0)
+ {
+ }
+
+
+ NodeLookup::~NodeLookup()
+ {}
+
+
+ void NodeLookup::callFinished(RPCCall* ,MsgBase* rsp)
+ {
+ // Out() << "NodeLookup::callFinished" << endl;
+ if (isFinished())
+ return;
+
+ // check the response and see if it is a good one
+ if (rsp->getMethod() == dht::FIND_NODE && rsp->getType() == dht::RSP_MSG)
+ {
+ FindNodeRsp* fnr = (FindNodeRsp*)rsp;
+ const QByteArray & nodes = fnr->getNodes();
+ Uint32 nnodes = nodes.size() / 26;
+ for (Uint32 j = 0;j < nnodes;j++)
+ {
+ // unpack an entry and add it to the todo list
+ KBucketEntry e = UnpackBucketEntry(nodes,j*26);
+ // lets not talk to ourself
+ if (e.getID() != node->getOurID() && !todo.contains(e) && !visited.contains(e))
+ todo.append(e);
+ }
+ num_nodes_rsp++;
+ }
+ }
+
+ void NodeLookup::callTimeout(RPCCall*)
+ {
+ // Out() << "NodeLookup::callTimeout" << endl;
+ }
+
+ void NodeLookup::update()
+ {
+ // Out() << "NodeLookup::update" << endl;
+ // Out() << "todo = " << todo.count() << " ; visited = " << visited.count() << endl;
+ // go over the todo list and send find node calls
+ // until we have nothing left
+ while (!todo.empty() && canDoRequest())
+ {
+ KBucketEntry e = todo.first();
+ // only send a findNode if we haven't allrready visited the node
+ if (!visited.contains(e))
+ {
+ // send a findNode to the node
+ FindNodeReq* fnr = new FindNodeReq(node->getOurID(),node_id);
+ fnr->setOrigin(e.getAddress());
+ rpcCall(fnr);
+ visited.append(e);
+ }
+ // remove the entry from the todo list
+ todo.pop_front();
+ }
+
+ if (todo.empty() && getNumOutstandingRequests() == 0 && !isFinished())
+ done();
+ else if (num_nodes_rsp > 50)
+ done(); // quit after 50 nodes responses
+ }
+}
diff --git a/libktorrent/kademlia/nodelookup.h b/libktorrent/kademlia/nodelookup.h
new file mode 100644
index 0000000..ff19e92
--- /dev/null
+++ b/libktorrent/kademlia/nodelookup.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTNODELOOKUP_H
+#define DHTNODELOOKUP_H
+
+#include "key.h"
+#include "task.h"
+
+namespace dht
+{
+ class Node;
+ class RPCServer;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Task to do a node lookup.
+ */
+ class NodeLookup : public Task
+ {
+ public:
+ NodeLookup(const dht::Key & node_id,RPCServer* rpc,Node* node);
+ virtual ~NodeLookup();
+
+ virtual void update();
+ virtual void callFinished(RPCCall* c, MsgBase* rsp);
+ virtual void callTimeout(RPCCall* c);
+ private:
+ dht::Key node_id;
+ bt::Uint32 num_nodes_rsp;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/pack.cpp b/libktorrent/kademlia/pack.cpp
new file mode 100644
index 0000000..a5acafb
--- /dev/null
+++ b/libktorrent/kademlia/pack.cpp
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/error.h>
+#include <util/functions.h>
+#include "pack.h"
+
+using namespace bt;
+using namespace KNetwork;
+
+namespace dht
+{
+
+ void PackBucketEntry(const KBucketEntry & e,QByteArray & ba,Uint32 off)
+ {
+ // first check size
+ if (off + 26 > ba.size())
+ throw bt::Error("Not enough room in buffer");
+
+ Uint8* data = (Uint8*)ba.data();
+ Uint8* ptr = data + off;
+
+ const KInetSocketAddress & addr = e.getAddress();
+ // copy ID, IP address and port into the buffer
+ memcpy(ptr,e.getID().getData(),20);
+ bt::WriteUint32(ptr,20,addr.ipAddress().IPv4Addr());
+ bt::WriteUint16(ptr,24,addr.port());
+ }
+
+ KBucketEntry UnpackBucketEntry(const QByteArray & ba,Uint32 off)
+ {
+ if (off + 26 > ba.size())
+ throw bt::Error("Not enough room in buffer");
+
+ const Uint8* data = (Uint8*)ba.data();
+ const Uint8* ptr = data + off;
+
+ // get the port, ip and key);
+ Uint16 port = bt::ReadUint16(ptr,24);
+ Uint8 key[20];
+ memcpy(key,ptr,20);
+
+ return KBucketEntry(KInetSocketAddress(KIpAddress(ptr+20,4),port),dht::Key(key));
+ }
+
+}
diff --git a/libktorrent/kademlia/pack.h b/libktorrent/kademlia/pack.h
new file mode 100644
index 0000000..dab1523
--- /dev/null
+++ b/libktorrent/kademlia/pack.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTPACK_H
+#define DHTPACK_H
+
+#include "kbucket.h"
+
+namespace dht
+{
+
+ /**
+ * Pack a KBucketEntry into a byte array.
+ * If the array is not large enough, an error will be thrown
+ * @param e The entry
+ * @param ba The byte array
+ * @param off The offset into the array
+ */
+ void PackBucketEntry(const KBucketEntry & e,QByteArray & ba,Uint32 off);
+
+ /**
+ * Unpack a KBucketEntry from a byte array.
+ * If a full entry cannot be read an error will be thrown.
+ * @param ba The byte array
+ * @param off The offset
+ * @return The entry
+ */
+ KBucketEntry UnpackBucketEntry(const QByteArray & ba,Uint32 off);
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/rpccall.cpp b/libktorrent/kademlia/rpccall.cpp
new file mode 100644
index 0000000..b86e8f7
--- /dev/null
+++ b/libktorrent/kademlia/rpccall.cpp
@@ -0,0 +1,79 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "dht.h"
+#include "rpcmsg.h"
+#include "rpccall.h"
+#include "rpcserver.h"
+
+namespace dht
+{
+ RPCCallListener::RPCCallListener()
+ {}
+
+ RPCCallListener::~RPCCallListener()
+ {
+ }
+
+ RPCCall::RPCCall(RPCServer* rpc,MsgBase* msg,bool queued) : msg(msg),rpc(rpc),queued(queued)
+ {
+ connect(&timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
+ if (!queued)
+ timer.start(30*1000,true);
+ }
+
+
+ RPCCall::~RPCCall()
+ {
+ delete msg;
+ }
+
+ void RPCCall::start()
+ {
+ queued = false;
+ timer.start(30*1000,true);
+ }
+
+ void RPCCall::onTimeout()
+ {
+ onCallTimeout(this);
+ rpc->timedOut(msg->getMTID());
+ }
+
+ void RPCCall::response(MsgBase* rsp)
+ {
+ onCallResponse(this,rsp);
+ }
+
+ Method RPCCall::getMsgMethod() const
+ {
+ if (msg)
+ return msg->getMethod();
+ else
+ return dht::NONE;
+ }
+
+ void RPCCall::addListener(RPCCallListener* cl)
+ {
+ connect(this,SIGNAL(onCallResponse( RPCCall*, MsgBase* )),cl,SLOT(onResponse( RPCCall*, MsgBase* )));
+ connect(this,SIGNAL(onCallTimeout( RPCCall* )),cl,SLOT(onTimeout( RPCCall* )));
+ }
+
+}
+#include "rpccall.moc"
diff --git a/libktorrent/kademlia/rpccall.h b/libktorrent/kademlia/rpccall.h
new file mode 100644
index 0000000..6e54933
--- /dev/null
+++ b/libktorrent/kademlia/rpccall.h
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTRPCCALL_H
+#define DHTRPCCALL_H
+
+#include <qtimer.h>
+#include "key.h"
+#include "rpcmsg.h"
+
+namespace dht
+{
+ class RPCServer;
+ class RPCCall;
+
+ /**
+ * Class which objects should derive from, if they want to know the result of a call.
+ */
+ class RPCCallListener : public QObject
+ {
+ Q_OBJECT
+ public:
+ RPCCallListener();
+ virtual ~RPCCallListener();
+
+ public slots:
+ /**
+ * A response was received.
+ * @param c The call
+ * @param rsp The response
+ */
+ virtual void onResponse(RPCCall* c,MsgBase* rsp) = 0;
+
+ /**
+ * The call has timed out.
+ * @param c The call
+ */
+ virtual void onTimeout(RPCCall* c) = 0;
+
+ };
+
+ /**
+ * @author Joris Guisson
+ */
+ class RPCCall : public QObject
+ {
+ Q_OBJECT
+ public:
+ RPCCall(RPCServer* rpc,MsgBase* msg,bool queued);
+ virtual ~RPCCall();
+
+ /**
+ * Called when a queued call gets started. Starts the timeout timer.
+ */
+ void start();
+
+ /**
+ * Called by the server if a response is received.
+ * @param rsp
+ */
+ void response(MsgBase* rsp);
+
+ /**
+ * Add a listener for this call
+ * @param cl The listener
+ */
+ void addListener(RPCCallListener* cl);
+
+ /// Get the message type
+ Method getMsgMethod() const;
+
+ /// Get the request sent
+ const MsgBase* getRequest() const {return msg;}
+
+ /// Get the request sent
+ MsgBase* getRequest() {return msg;}
+
+ private slots:
+ void onTimeout();
+
+ signals:
+ void onCallResponse(RPCCall* c,MsgBase* rsp);
+ void onCallTimeout(RPCCall* c);
+
+ private:
+ MsgBase* msg;
+ QTimer timer;
+ RPCServer* rpc;
+ bool queued;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/rpcmsg.cpp b/libktorrent/kademlia/rpcmsg.cpp
new file mode 100644
index 0000000..97364e1
--- /dev/null
+++ b/libktorrent/kademlia/rpcmsg.cpp
@@ -0,0 +1,596 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <torrent/bnode.h>
+#include <torrent/globals.h>
+#include <torrent/bencoder.h>
+#include "rpcmsg.h"
+#include "rpccall.h"
+#include "rpcserver.h"
+#include "dht.h"
+
+using namespace bt;
+
+namespace dht
+{
+ const QString TID = "t";
+ const QString REQ = "q";
+ const QString RSP = "r";
+ const QString TYP = "y";
+ const QString ARG = "a";
+ // ERR apparently is defined as a macro on solaris in some header file,
+ // which causes things not to compile on it, so we have changed it to ERR_DHT
+ const QString ERR_DHT = "e";
+
+
+ MsgBase* MakeMsg(bt::BDictNode* dict);
+
+
+ MsgBase* ParseReq(bt::BDictNode* dict)
+ {
+ BValueNode* vn = dict->getValue(REQ);
+ BDictNode* args = dict->getDict(ARG);
+ if (!vn || !args)
+ return 0;
+
+ if (!args->getValue("id"))
+ return 0;
+
+ if (!dict->getValue(TID))
+ return 0;
+
+ Key id = Key(args->getValue("id")->data().toByteArray());
+ QByteArray mtid_d = dict->getValue(TID)->data().toByteArray();
+ if (mtid_d.size() == 0)
+ return 0;
+ Uint8 mtid = (Uint8)mtid_d.at(0);
+ MsgBase* msg = 0;
+
+ QString str = vn->data().toString();
+ if (str == "ping")
+ {
+ msg = new PingReq(id);
+ }
+ else if (str == "find_node")
+ {
+ if (args->getValue("target"))
+ msg = new FindNodeReq(id,Key(args->getValue("target")->data().toByteArray()));
+ }
+ else if (str == "get_peers")
+ {
+ if (args->getValue("info_hash"))
+ msg = new GetPeersReq(id,Key(args->getValue("info_hash")->data().toByteArray()));
+ }
+ else if (str == "announce_peer")
+ {
+ if (args->getValue("info_hash") && args->getValue("port") && args->getValue("token"))
+ {
+ msg = new AnnounceReq(id,
+ Key(args->getValue("info_hash")->data().toByteArray()),
+ args->getValue("port")->data().toInt(),
+ Key(args->getValue("token")->data().toByteArray()));
+ }
+ }
+
+ if (msg)
+ msg->setMTID(mtid);
+
+ return msg;
+ }
+
+ MsgBase* ParseRsp(bt::BDictNode* dict,dht::Method req_method,Uint8 mtid)
+ {
+ BDictNode* args = dict->getDict(RSP);
+ if (!args || !args->getValue("id"))
+ return 0;
+
+ Key id = Key(args->getValue("id")->data().toByteArray());
+
+ switch (req_method)
+ {
+ case PING :
+ return new PingRsp(mtid,id);
+ case FIND_NODE :
+ if (!args->getValue("nodes"))
+ return 0;
+ else
+ return new FindNodeRsp(mtid,id,args->getValue("nodes")->data().toByteArray());
+ case GET_PEERS :
+ if (args->getValue("token"))
+ {
+ Key token = args->getValue("token")->data().toByteArray();
+ QByteArray data;
+ BListNode* vals = args->getList("values");
+ DBItemList dbl;
+ if (vals)
+ {
+ for (Uint32 i = 0;i < vals->getNumChildren();i++)
+ {
+ BValueNode* vn = dynamic_cast<BValueNode*>(vals->getChild(i));
+ if (!vn)
+ continue;
+ dbl.append(DBItem((Uint8*)vn->data().toByteArray().data()));
+ }
+ return new GetPeersRsp(mtid,id,dbl,token);
+ }
+ else if (args->getValue("nodes"))
+ {
+ data = args->getValue("nodes")->data().toByteArray();
+ return new GetPeersRsp(mtid,id,data,token);
+ }
+ else
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "No nodes or values in get_peers response" << endl;
+ return 0;
+ }
+ }
+ else
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "No token in get_peers response" << endl;
+ }
+ case ANNOUNCE_PEER :
+ return new AnnounceRsp(mtid,id);
+ default:
+ return 0;
+ }
+ return 0;
+ }
+
+ MsgBase* ParseRsp(bt::BDictNode* dict,RPCServer* srv)
+ {
+ BDictNode* args = dict->getDict(RSP);
+ if (!args || !dict->getValue(TID))
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "ParseRsp : args || !args->getValue(id) || !dict->getValue(TID)" << endl;
+ return 0;
+ }
+
+
+ QByteArray ba = dict->getValue(TID)->data().toByteArray();
+ // check for empty byte arrays should prevent 144416
+ if (ba.size() == 0)
+ return 0;
+
+ Uint8 mtid = (Uint8)ba.at(0);
+ // find the call
+ const RPCCall* c = srv->findCall(mtid);
+ if (!c)
+ {
+ Out(SYS_DHT|LOG_DEBUG) << "Cannot find RPC call" << endl;
+ return 0;
+ }
+
+ return ParseRsp(dict,c->getMsgMethod(),mtid);
+ }
+
+ MsgBase* ParseErr(bt::BDictNode* dict)
+ {
+ BValueNode* vn = dict->getValue(RSP);
+ BDictNode* args = dict->getDict(ARG);
+ if (!vn || !args || !args->getValue("id") || !dict->getValue(TID))
+ return 0;
+
+ Key id = Key(args->getValue("id")->data().toByteArray());
+ QString mt_id = dict->getValue(TID)->data().toString();
+ if (mt_id.length() == 0)
+ return 0;
+
+ Uint8 mtid = (char)mt_id.at(0).latin1();
+ QString str = vn->data().toString();
+
+ return new ErrMsg(mtid,id,str);
+ }
+
+
+ MsgBase* MakeRPCMsg(bt::BDictNode* dict,RPCServer* srv)
+ {
+ BValueNode* vn = dict->getValue(TYP);
+ if (!vn)
+ return 0;
+
+ if (vn->data().toString() == REQ)
+ {
+ return ParseReq(dict);
+ }
+ else if (vn->data().toString() == RSP)
+ {
+ return ParseRsp(dict,srv);
+ }
+ else if (vn->data().toString() == ERR_DHT)
+ {
+ return ParseErr(dict);
+ }
+
+ return 0;
+ }
+
+ MsgBase* MakeRPCMsgTest(bt::BDictNode* dict,dht::Method req_method)
+ {
+ BValueNode* vn = dict->getValue(TYP);
+ if (!vn)
+ return 0;
+
+ if (vn->data().toString() == REQ)
+ {
+ return ParseReq(dict);
+ }
+ else if (vn->data().toString() == RSP)
+ {
+ return ParseRsp(dict,req_method,0);
+ }
+ else if (vn->data().toString() == ERR_DHT)
+ {
+ return ParseErr(dict);
+ }
+
+ return 0;
+ }
+
+ MsgBase::MsgBase(Uint8 mtid,Method m,Type type,const Key & id)
+ : mtid(mtid),method(m),type(type),id(id)
+ {}
+
+ MsgBase::~MsgBase()
+ {}
+
+ ////////////////////////////////
+
+ PingReq::PingReq(const Key & id) : MsgBase(0xFF,PING,REQ_MSG,id)
+ {
+ }
+
+ PingReq::~PingReq()
+ {}
+
+ void PingReq::apply(DHT* dh_table)
+ {
+ dh_table->ping(this);
+ }
+
+ void PingReq::print()
+ {
+ Out(SYS_DHT|LOG_DEBUG) << QString("REQ: %1 %2 : ping").arg(mtid).arg(id.toString()) << endl;
+ }
+
+ void PingReq::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(ARG); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ }
+ enc.end();
+ enc.write(REQ); enc.write("ping");
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(REQ);
+ }
+ enc.end();
+ }
+
+ ////////////////////////////////
+
+ FindNodeReq::FindNodeReq(const Key & id,const Key & target)
+ : MsgBase(0xFF,FIND_NODE,REQ_MSG,id),target(target)
+ {}
+
+ FindNodeReq::~FindNodeReq()
+ {}
+
+ void FindNodeReq::apply(DHT* dh_table)
+ {
+ dh_table->findNode(this);
+ }
+
+ void FindNodeReq::print()
+ {
+ Out(SYS_DHT|LOG_NOTICE) << QString("REQ: %1 %2 : find_node %3")
+ .arg(mtid).arg(id.toString()).arg(target.toString()) << endl;
+ }
+
+ void FindNodeReq::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(ARG); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ enc.write("target"); enc.write(target.getData(),20);
+ }
+ enc.end();
+ enc.write(REQ); enc.write("find_node");
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(REQ);
+ }
+ enc.end();
+ }
+
+ ////////////////////////////////
+
+ ////////////////////////////////
+ GetPeersReq::GetPeersReq(const Key & id,const Key & info_hash)
+ : MsgBase(0xFF,GET_PEERS,REQ_MSG,id),info_hash(info_hash)
+ {}
+
+ GetPeersReq::~GetPeersReq()
+ {}
+
+ void GetPeersReq::apply(DHT* dh_table)
+ {
+ dh_table->getPeers(this);
+ }
+
+ void GetPeersReq::print()
+ {
+ Out(SYS_DHT|LOG_DEBUG) << QString("REQ: %1 %2 : get_peers %3")
+ .arg(mtid).arg(id.toString()).arg(info_hash.toString()) << endl;
+ }
+
+ void GetPeersReq::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(ARG); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ enc.write("info_hash"); enc.write(info_hash.getData(),20);
+ }
+ enc.end();
+ enc.write(REQ); enc.write("get_peers");
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(REQ);
+ }
+ enc.end();
+ }
+
+ ////////////////////////////////
+
+ AnnounceReq::AnnounceReq(const Key & id,const Key & info_hash,Uint16 port,const Key & token)
+ : GetPeersReq(id,info_hash),port(port),token(token)
+ {
+ method = dht::ANNOUNCE_PEER;
+ }
+
+ AnnounceReq::~AnnounceReq() {}
+
+ void AnnounceReq::apply(DHT* dh_table)
+ {
+ dh_table->announce(this);
+ }
+
+ void AnnounceReq::print()
+ {
+ Out(SYS_DHT|LOG_DEBUG) << QString("REQ: %1 %2 : announce_peer %3 %4 %5")
+ .arg(mtid).arg(id.toString()).arg(info_hash.toString())
+ .arg(port).arg(token.toString()) << endl;
+ }
+
+ void AnnounceReq::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(ARG); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ enc.write("info_hash"); enc.write(info_hash.getData(),20);
+ enc.write("port"); enc.write((Uint32)port);
+ enc.write("token"); enc.write(token.getData(),20);
+ }
+ enc.end();
+ enc.write(REQ); enc.write("announce_peer");
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(REQ);
+ }
+ enc.end();
+ }
+
+ ////////////////////////////////
+
+ PingRsp::PingRsp(Uint8 mtid,const Key & id)
+ : MsgBase(mtid,PING,RSP_MSG,id)
+ {}
+
+ PingRsp::~PingRsp() {}
+
+ void PingRsp::apply(DHT* dh_table)
+ {
+ dh_table->response(this);
+ }
+
+ void PingRsp::print()
+ {
+ Out(SYS_DHT|LOG_DEBUG) << QString("RSP: %1 %2 : ping")
+ .arg(mtid).arg(id.toString()) << endl;
+ }
+
+ void PingRsp::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(RSP); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ }
+ enc.end();
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(RSP);
+ }
+ enc.end();
+ }
+
+ ////////////////////////////////
+
+ FindNodeRsp::FindNodeRsp(Uint8 mtid,const Key & id,const QByteArray & nodes)
+ : MsgBase(mtid,FIND_NODE,RSP_MSG,id),nodes(nodes)
+ {}
+
+ FindNodeRsp::~FindNodeRsp() {}
+
+ void FindNodeRsp::apply(DHT* dh_table)
+ {
+ dh_table->response(this);
+ }
+
+ void FindNodeRsp::print()
+ {
+ Out(SYS_DHT|LOG_DEBUG) << QString("RSP: %1 %2 : find_node")
+ .arg(mtid).arg(id.toString()) << endl;
+ }
+
+ void FindNodeRsp::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(RSP); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ enc.write("nodes"); enc.write(nodes);
+ }
+ enc.end();
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(RSP);
+ }
+ enc.end();
+ }
+
+ ////////////////////////////////
+
+ GetPeersRsp::GetPeersRsp(Uint8 mtid,const Key & id,const QByteArray & data,const Key & token)
+ : MsgBase(mtid,dht::GET_PEERS,dht::RSP_MSG,id),token(token),data(data)
+ {
+ this->data.detach();
+ }
+
+ GetPeersRsp::GetPeersRsp(Uint8 mtid,const Key & id,const DBItemList & values,const Key & token)
+ : MsgBase(mtid,dht::GET_PEERS,dht::RSP_MSG,id),token(token),items(values)
+ {}
+
+ GetPeersRsp::~GetPeersRsp()
+ {}
+
+ void GetPeersRsp::apply(DHT* dh_table)
+ {
+ dh_table->response(this);
+ }
+ void GetPeersRsp::print()
+ {
+ Out() << QString("RSP: %1 %2 : get_peers(%3)")
+ .arg(mtid).arg(id.toString()).arg(data.size() > 0 ? "nodes" : "values") << endl;
+ }
+
+ void GetPeersRsp::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(RSP); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ if (data.size() > 0)
+ {
+ enc.write("nodes"); enc.write(data);
+ enc.write("token"); enc.write(token.getData(),20);
+ }
+ else
+ {
+ enc.write("token"); enc.write(token.getData(),20);
+ enc.write("values"); enc.beginList();
+ DBItemList::iterator i = items.begin();
+ while (i != items.end())
+ {
+ const DBItem & item = *i;
+ enc.write(item.getData(),6);
+ i++;
+ }
+ enc.end();
+ }
+ }
+ enc.end();
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(RSP);
+ }
+ enc.end();
+ }
+
+
+ ////////////////////////////////
+ ////////////////////////////////
+
+ AnnounceRsp::AnnounceRsp(Uint8 mtid,const Key & id) : MsgBase(mtid,ANNOUNCE_PEER,RSP_MSG,id)
+ {}
+
+ AnnounceRsp::~AnnounceRsp(){}
+
+ void AnnounceRsp::apply(DHT* dh_table)
+ {
+ dh_table->response(this);
+ }
+
+ void AnnounceRsp::print()
+ {
+ Out() << QString("RSP: %1 %2 : announce_peer")
+ .arg(mtid).arg(id.toString()) << endl;
+ }
+
+ void AnnounceRsp::encode(QByteArray & arr)
+ {
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ {
+ enc.write(RSP); enc.beginDict();
+ {
+ enc.write("id"); enc.write(id.getData(),20);
+ }
+ enc.end();
+ enc.write(TID); enc.write(&mtid,1);
+ enc.write(TYP); enc.write(RSP);
+ }
+ enc.end();
+ }
+
+
+ ////////////////////////////////
+
+ ErrMsg::ErrMsg(Uint8 mtid,const Key & id,const QString & msg)
+ : MsgBase(mtid,NONE,ERR_MSG,id),msg(msg)
+ {}
+
+ ErrMsg::~ErrMsg()
+ {}
+
+ void ErrMsg::apply(DHT* dh_table)
+ {
+ dh_table->error(this);
+ }
+
+ void ErrMsg::print()
+ {
+ Out(SYS_DHT|LOG_NOTICE) << "ERR: " << mtid << " " << msg << endl;
+ }
+
+ void ErrMsg::encode(QByteArray & )
+ {}
+}
diff --git a/libktorrent/kademlia/rpcmsg.h b/libktorrent/kademlia/rpcmsg.h
new file mode 100644
index 0000000..4863ae2
--- /dev/null
+++ b/libktorrent/kademlia/rpcmsg.h
@@ -0,0 +1,269 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTRPCMSG_H
+#define DHTRPCMSG_H
+
+#include <ksocketaddress.h>
+#include <util/constants.h>
+#include "key.h"
+#include "database.h"
+
+namespace bt
+{
+ class BDictNode;
+}
+
+using bt::Uint8;
+using bt::Uint32;
+
+namespace dht
+{
+ class DHT;
+ class RPCServer;
+
+ enum Type
+ {
+ REQ_MSG,
+ RSP_MSG,
+ ERR_MSG,
+ INVALID
+ };
+
+ enum Method
+ {
+ PING,
+ FIND_NODE,
+ GET_PEERS,
+ ANNOUNCE_PEER,
+ NONE
+ };
+
+
+
+ /**
+ * Base class for all RPC messages.
+ */
+ class MsgBase
+ {
+ public:
+ MsgBase(Uint8 mtid,Method m,Type type,const Key & id);
+ virtual ~MsgBase();
+
+
+ /**
+ * When this message arrives this function will be called upon the DHT.
+ * The message should then call the appropriate DHT function (double dispatch)
+ * @param dh_table Pointer to DHT
+ */
+ virtual void apply(DHT* dh_table) = 0;
+
+ /**
+ * Print the message for debugging purposes.
+ */
+ virtual void print() = 0;
+
+ /**
+ * BEncode the message.
+ * @param arr Data array
+ */
+ virtual void encode(QByteArray & arr) = 0;
+
+ /// Set the origin (i.e. where the message came from)
+ void setOrigin(const KNetwork::KSocketAddress & o) {origin = o;}
+
+ /// Get the origin
+ const KNetwork::KInetSocketAddress & getOrigin() const {return origin;}
+
+ /// Set the origin (i.e. where the message came from)
+ void setDestination(const KNetwork::KSocketAddress & o) {origin = o;}
+
+ /// Get the origin
+ const KNetwork::KInetSocketAddress & getDestination() const {return origin;}
+
+ /// Get the MTID
+ Uint8 getMTID() const {return mtid;}
+
+ /// Set the MTID
+ void setMTID(Uint8 m) {mtid = m;}
+
+ /// Get the id of the sender
+ const Key & getID() const {return id;}
+
+ /// Get the type of the message
+ Type getType() const {return type;}
+
+ /// Get the message it's method
+ Method getMethod() const {return method;}
+
+ protected:
+ Uint8 mtid;
+ Method method;
+ Type type;
+ Key id;
+ KNetwork::KInetSocketAddress origin;
+ };
+
+ /**
+ * Creates a message out of a BDictNode.
+ * @param dict The BDictNode
+ * @param srv The RPCServer
+ * @return A newly created message or 0 upon error
+ */
+ MsgBase* MakeRPCMsg(bt::BDictNode* dict,RPCServer* srv);
+
+ MsgBase* MakeRPCMsgTest(bt::BDictNode* dict,dht::Method req_method);
+
+ class ErrMsg : public MsgBase
+ {
+ public:
+ ErrMsg(Uint8 mtid,const Key & id,const QString & msg);
+ virtual ~ErrMsg();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+ private:
+ QString msg;
+ };
+
+ class PingReq : public MsgBase
+ {
+ public:
+ PingReq(const Key & id);
+ virtual ~PingReq();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+ };
+
+ class FindNodeReq : public MsgBase
+ {
+ public:
+ FindNodeReq(const Key & id,const Key & target);
+ virtual ~FindNodeReq();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+
+ const Key & getTarget() const {return target;}
+
+ private:
+ Key target;
+ };
+
+ class GetPeersReq : public MsgBase
+ {
+ public:
+ GetPeersReq(const Key & id,const Key & info_hash);
+ virtual ~GetPeersReq();
+
+ const Key & getInfoHash() const {return info_hash;}
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+ protected:
+ Key info_hash;
+ };
+
+ class AnnounceReq : public GetPeersReq
+ {
+ public:
+ AnnounceReq(const Key & id,const Key & info_hash,bt::Uint16 port,const Key & token);
+ virtual ~AnnounceReq();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+
+ const Key & getToken() const {return token;}
+ bt::Uint16 getPort() const {return port;}
+ private:
+ bt::Uint16 port;
+ Key token;
+ };
+
+ class PingRsp : public MsgBase
+ {
+ public:
+ PingRsp(Uint8 mtid,const Key & id);
+ virtual ~PingRsp();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+ };
+
+
+
+ class FindNodeRsp : public MsgBase
+ {
+ public:
+ FindNodeRsp(Uint8 mtid,const Key & id,const QByteArray & nodes);
+ virtual ~FindNodeRsp();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+
+ const QByteArray & getNodes() const {return nodes;}
+ protected:
+ QByteArray nodes;
+ };
+
+ class GetPeersRsp : public MsgBase
+ {
+ public:
+ GetPeersRsp(Uint8 mtid,const Key & id,const QByteArray & data,const Key & token);
+ GetPeersRsp(Uint8 mtid,const Key & id,const DBItemList & values,const Key & token);
+ virtual ~GetPeersRsp();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+
+ const QByteArray & getData() const {return data;}
+ const DBItemList & getItemList() const {return items;}
+ const Key & getToken() const {return token;}
+ bool containsNodes() const {return data.size() > 0;}
+ bool containsValues() const {return data.size() == 0;}
+ private:
+ Key token;
+ QByteArray data;
+ DBItemList items;
+ };
+
+
+ class AnnounceRsp : public MsgBase
+ {
+ public:
+ AnnounceRsp(Uint8 mtid,const Key & id);
+ virtual ~AnnounceRsp();
+
+ virtual void apply(DHT* dh_table);
+ virtual void print();
+ virtual void encode(QByteArray & arr);
+ };
+
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/rpcserver.cpp b/libktorrent/kademlia/rpcserver.cpp
new file mode 100644
index 0000000..1242dae
--- /dev/null
+++ b/libktorrent/kademlia/rpcserver.cpp
@@ -0,0 +1,243 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <unistd.h>
+#include <string.h>
+#include <net/portlist.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <torrent/globals.h>
+#include <torrent/bnode.h>
+#include <torrent/bdecoder.h>
+#include <torrent/bencoder.h>
+#include <ksocketdevice.h>
+#include "rpcserver.h"
+#include "rpccall.h"
+#include "rpcmsg.h"
+#include "kbucket.h"
+#include "node.h"
+#include "dht.h"
+
+using namespace KNetwork;
+using namespace bt;
+
+namespace dht
+{
+
+
+
+ RPCServer::RPCServer(DHT* dh_table,Uint16 port,QObject *parent) : QObject(parent),dh_table(dh_table),next_mtid(0),port(port)
+ {
+ sock = new KDatagramSocket(this);
+ sock->setBlocking(false);
+ sock->setAddressReuseable(true);
+ }
+
+
+ RPCServer::~RPCServer()
+ {
+ bt::Globals::instance().getPortList().removePort(port,net::UDP);
+ sock->close();
+ calls.setAutoDelete(true);
+ calls.clear();
+ call_queue.setAutoDelete(true);
+ call_queue.clear();
+ }
+
+ void RPCServer::start()
+ {
+ sock->setBlocking(true);
+ if (!sock->bind(QString::null,QString::number(port)))
+ {
+ Out(SYS_DHT|LOG_IMPORTANT) << "DHT: Failed to bind to UDP port " << port << " for DHT" << endl;
+ }
+ else
+ {
+ bt::Globals::instance().getPortList().addNewPort(port,net::UDP,true);
+ }
+ sock->setBlocking(false);
+ connect(sock,SIGNAL(readyRead()),this,SLOT(readPacket()));
+ }
+
+ void RPCServer::stop()
+ {
+ bt::Globals::instance().getPortList().removePort(port,net::UDP);
+ sock->close();
+ }
+
+ static void PrintRawData(const QByteArray & data)
+ {
+ QString tmp;
+ for (Uint32 i = 0;i < data.size();i++)
+ {
+ char c = QChar(data[i]).latin1();
+ if (!QChar(data[i]).isPrint() || c == 0)
+ tmp += '#';
+ else
+ tmp += c;
+ }
+
+ Out(SYS_DHT|LOG_DEBUG) << tmp << endl;
+ }
+
+ void RPCServer::readPacket()
+ {
+ if (sock->bytesAvailable() == 0)
+ {
+ Out(SYS_DHT|LOG_NOTICE) << "0 byte UDP packet " << endl;
+ // KDatagramSocket wrongly handles UDP packets with no payload
+ // so we need to deal with it oursleves
+ int fd = sock->socketDevice()->socket();
+ char tmp;
+ read(fd,&tmp,1);
+ return;
+ }
+
+ KDatagramPacket pck = sock->receive();
+ /*
+ Out() << "RPCServer::readPacket" << endl;
+ PrintRawData(pck.data());
+ */
+ BNode* n = 0;
+ try
+ {
+ // read and decode the packet
+ BDecoder bdec(pck.data(),false);
+ n = bdec.decode();
+
+ if (!n || n->getType() != BNode::DICT)
+ {
+ delete n;
+ return;
+ }
+
+ // try to make a RPCMsg of it
+ MsgBase* msg = MakeRPCMsg((BDictNode*)n,this);
+ if (msg)
+ {
+ msg->setOrigin(pck.address());
+ msg->apply(dh_table);
+ // erase an existing call
+ if (msg->getType() == RSP_MSG && calls.contains(msg->getMTID()))
+ {
+ // delete the call, but first notify it off the response
+ RPCCall* c = calls.find(msg->getMTID());
+ c->response(msg);
+ calls.erase(msg->getMTID());
+ c->deleteLater();
+ doQueuedCalls();
+ }
+ delete msg;
+ }
+ }
+ catch (bt::Error & err)
+ {
+ Out(SYS_DHT|LOG_IMPORTANT) << "Error happened during parsing : " << err.toString() << endl;
+ }
+ delete n;
+
+ if (sock->bytesAvailable() > 0)
+ readPacket();
+ }
+
+
+ void RPCServer::send(const KNetwork::KSocketAddress & addr,const QByteArray & msg)
+ {
+ sock->send(KNetwork::KDatagramPacket(msg,addr));
+ }
+
+ RPCCall* RPCServer::doCall(MsgBase* msg)
+ {
+ Uint8 start = next_mtid;
+ while (calls.contains(next_mtid))
+ {
+ next_mtid++;
+ if (next_mtid == start) // if this happens we cannot do any calls
+ {
+ // so queue the call
+ RPCCall* c = new RPCCall(this,msg,true);
+ call_queue.append(c);
+ Out(SYS_DHT|LOG_NOTICE) << "Queueing RPC call, no slots available at the moment" << endl;
+ return c;
+ }
+ }
+
+ msg->setMTID(next_mtid++);
+ sendMsg(msg);
+ RPCCall* c = new RPCCall(this,msg,false);
+ calls.insert(msg->getMTID(),c);
+ return c;
+ }
+
+ void RPCServer::sendMsg(MsgBase* msg)
+ {
+ QByteArray data;
+ msg->encode(data);
+ send(msg->getDestination(),data);
+
+ // PrintRawData(data);
+ }
+
+ void RPCServer::timedOut(Uint8 mtid)
+ {
+ // delete the call
+ RPCCall* c = calls.find(mtid);
+ if (c)
+ {
+ dh_table->timeout(c->getRequest());
+ calls.erase(mtid);
+ c->deleteLater();
+ }
+ doQueuedCalls();
+ }
+
+ void RPCServer::doQueuedCalls()
+ {
+ while (call_queue.count() > 0 && calls.count() < 256)
+ {
+ RPCCall* c = call_queue.first();
+ call_queue.removeFirst();
+
+ while (calls.contains(next_mtid))
+ next_mtid++;
+
+ MsgBase* msg = c->getRequest();
+ msg->setMTID(next_mtid++);
+ sendMsg(msg);
+ calls.insert(msg->getMTID(),c);
+ c->start();
+ }
+ }
+
+ const RPCCall* RPCServer::findCall(Uint8 mtid) const
+ {
+ return calls.find(mtid);
+ }
+
+ void RPCServer::ping(const dht::Key & our_id,const KNetwork::KSocketAddress & addr)
+ {
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: pinging " << addr.nodeName() << endl;
+ PingReq* pr = new PingReq(our_id);
+ pr->setOrigin(addr);
+ doCall(pr);
+ }
+
+
+}
+#include "rpcserver.moc"
diff --git a/libktorrent/kademlia/rpcserver.h b/libktorrent/kademlia/rpcserver.h
new file mode 100644
index 0000000..4e54076
--- /dev/null
+++ b/libktorrent/kademlia/rpcserver.h
@@ -0,0 +1,122 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTRPCSERVER_H
+#define DHTRPCSERVER_H
+
+#include <qptrlist.h>
+#include <kdatagramsocket.h>
+#include <util/constants.h>
+#include <util/array.h>
+#include <util/ptrmap.h>
+
+
+using KNetwork::KDatagramSocket;
+using bt::Uint32;
+using bt::Uint16;
+using bt::Uint8;
+
+namespace bt
+{
+ class BDictNode;
+}
+
+namespace dht
+{
+ class Key;
+ class KBucketEntry;
+ class RPCCall;
+ class RPCMsg;
+ class Node;
+ class DHT;
+ class MsgBase;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Class to handle incoming and outgoing RPC messages.
+ */
+ class RPCServer : public QObject
+ {
+ Q_OBJECT
+ public:
+ RPCServer(DHT* dh_table,Uint16 port,QObject *parent = 0);
+ virtual ~RPCServer();
+
+ /// Start the server
+ void start();
+
+ /// Stop the server
+ void stop();
+
+ /**
+ * Do a RPC call.
+ * @param msg The message to send
+ * @return The call object
+ */
+ RPCCall* doCall(MsgBase* msg);
+
+ /**
+ * Send a message, this only sends the message, it does not keep any call
+ * information. This should be used for replies.
+ * @param msg The message to send
+ */
+ void sendMsg(MsgBase* msg);
+
+
+ /**
+ * A call was timed out.
+ * @param mtid mtid of call
+ */
+ void timedOut(Uint8 mtid);
+
+ /**
+ * Ping a node, we don't care about the MTID.
+ * @param addr The address
+ */
+ void ping(const dht::Key & our_id,const KNetwork::KSocketAddress & addr);
+
+ /**
+ * Find a RPC call, based on the mtid
+ * @param mtid The mtid
+ * @return The call
+ */
+ const RPCCall* findCall(Uint8 mtid) const;
+
+ /// Get the number of active calls
+ Uint32 getNumActiveRPCCalls() const {return calls.count();}
+ private slots:
+ void readPacket();
+
+ private:
+ void send(const KNetwork::KSocketAddress & addr,const QByteArray & msg);
+ void doQueuedCalls();
+
+ private:
+ KDatagramSocket* sock;
+ DHT* dh_table;
+ bt::PtrMap<bt::Uint8,RPCCall> calls;
+ QPtrList<RPCCall> call_queue;
+ bt::Uint8 next_mtid;
+ bt::Uint16 port;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/task.cpp b/libktorrent/kademlia/task.cpp
new file mode 100644
index 0000000..877a698
--- /dev/null
+++ b/libktorrent/kademlia/task.cpp
@@ -0,0 +1,134 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kresolver.h>
+#include "task.h"
+#include "kclosestnodessearch.h"
+#include "rpcserver.h"
+#include "kbucket.h"
+
+using namespace KNetwork;
+
+namespace dht
+{
+
+ Task::Task(RPCServer* rpc,Node* node)
+ : node(node),rpc(rpc),outstanding_reqs(0),task_finished(false),queued(queued)
+ {
+
+ }
+
+
+ Task::~Task()
+ {
+ }
+
+ void Task::start(const KClosestNodesSearch & kns,bool queued)
+ {
+ // fill the todo list
+ for (KClosestNodesSearch::CItr i = kns.begin(); i != kns.end();i++)
+ todo.append(i->second);
+ this->queued = queued;
+ if (!queued)
+ update();
+ }
+
+ void Task::start()
+ {
+ if (queued)
+ {
+ queued = false;
+ update();
+ }
+ }
+
+
+ void Task::onResponse(RPCCall* c, MsgBase* rsp)
+ {
+ if (outstanding_reqs > 0)
+ outstanding_reqs--;
+
+ if (!isFinished())
+ {
+ callFinished(c,rsp);
+
+ if (canDoRequest() && !isFinished())
+ update();
+ }
+ }
+
+ void Task::onTimeout(RPCCall* c)
+ {
+ if (outstanding_reqs > 0)
+ outstanding_reqs--;
+
+ if (!isFinished())
+ {
+ callTimeout(c);
+
+ if (canDoRequest() && !isFinished())
+ update();
+ }
+ }
+
+ bool Task::rpcCall(MsgBase* req)
+ {
+ if (!canDoRequest())
+ return false;
+
+ RPCCall* c = rpc->doCall(req);
+ c->addListener(this);
+ outstanding_reqs++;
+ return true;
+ }
+
+ void Task::done()
+ {
+ task_finished = true;
+ finished(this);
+ }
+
+ void Task::emitDataReady()
+ {
+ dataReady(this);
+ }
+
+ void Task::kill()
+ {
+ task_finished = true;
+ finished(this);
+ }
+
+ void Task::addDHTNode(const QString & ip,bt::Uint16 port)
+ {
+ KResolver::resolveAsync(this,SLOT(onResolverResults(KResolverResults )),
+ ip,QString::number(port));
+ }
+
+ void Task::onResolverResults(KResolverResults res)
+ {
+ if (res.count() == 0)
+ return;
+
+ todo.append(KBucketEntry(res.front().address(),dht::Key()));
+ }
+
+}
+
+#include "task.moc"
diff --git a/libktorrent/kademlia/task.h b/libktorrent/kademlia/task.h
new file mode 100644
index 0000000..5a33ac0
--- /dev/null
+++ b/libktorrent/kademlia/task.h
@@ -0,0 +1,174 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTTASK_H
+#define DHTTASK_H
+
+#include <qvaluelist.h>
+#include "rpccall.h"
+//#include "kbucket.h"
+
+namespace KNetwork
+{
+ class KResolverResults;
+}
+
+namespace dht
+{
+ class Node;
+ class Task;
+ class KClosestNodesSearch;
+ class KBucketEntry;
+
+ const Uint32 MAX_CONCURRENT_REQS = 16;
+
+ using KNetwork::KResolverResults;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Performs a task on K nodes provided by a KClosestNodesSearch.
+ * This is a base class for all tasks.
+ */
+ class Task : public RPCCallListener
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Create a task.
+ * @param rpc The RPC server to do RPC calls
+ * @param node The node
+ */
+ Task(RPCServer* rpc,Node* node);
+ virtual ~Task();
+
+ /**
+ * This will copy the results from the KClosestNodesSearch
+ * object into the todo list. And call update if the task is not queued.
+ * @param kns The KClosestNodesSearch object
+ * @param queued Is the task queued
+ */
+ void start(const KClosestNodesSearch & kns,bool queued);
+
+
+ /**
+ * Start the task, to be used when a task is queued.
+ */
+ void start();
+
+ /// Decrements the outstanding_reqs
+ virtual void onResponse(RPCCall* c, MsgBase* rsp);
+
+ /// Decrements the outstanding_reqs
+ virtual void onTimeout(RPCCall* c);
+
+ /**
+ * Will continue the task, this will be called every time we have
+ * rpc slots available for this task. Should be implemented by derived classes.
+ */
+ virtual void update() = 0;
+
+ /**
+ * A call is finished and a response was received.
+ * @param c The call
+ * @param rsp The response
+ */
+ virtual void callFinished(RPCCall* c, MsgBase* rsp) = 0;
+
+ /**
+ * A call timedout
+ * @param c The call
+ */
+ virtual void callTimeout(RPCCall* c) = 0;
+
+ /**
+ * Do a call to the rpc server, increments the outstanding_reqs variable.
+ * @param req THe request to send
+ * @return true if call was made, false if not
+ */
+ bool rpcCall(MsgBase* req);
+
+ /// See if we can do a request
+ bool canDoRequest() const {return outstanding_reqs < MAX_CONCURRENT_REQS;}
+
+ /// Is the task finished
+ bool isFinished() const {return task_finished;}
+
+ /// Set the task ID
+ void setTaskID(bt::Uint32 tid) {task_id = tid;}
+
+ /// Get the task ID
+ bt::Uint32 getTaskID() const {return task_id;}
+
+ /// Get the number of outstanding requests
+ bt::Uint32 getNumOutstandingRequests() const {return outstanding_reqs;}
+
+ bool isQueued() const {return queued;}
+
+ /**
+ * Tell listeners data is ready.
+ */
+ void emitDataReady();
+
+ /// Kills the task
+ void kill();
+
+ /**
+ * Add a node to the todo list
+ * @param ip The ip or hostname of the node
+ * @param port The port
+ */
+ void addDHTNode(const QString & ip,bt::Uint16 port);
+
+ signals:
+ /**
+ * The task is finsihed.
+ * @param t The Task
+ */
+ void finished(Task* t);
+
+ /**
+ * Called by the task when data is ready.
+ * Can be overrided if wanted.
+ * @param t The Task
+ */
+ void dataReady(Task* t);
+
+ protected:
+ void done();
+
+ protected slots:
+ void onResolverResults(KResolverResults res);
+
+ protected:
+ QValueList<KBucketEntry> visited; // nodes visited
+ QValueList<KBucketEntry> todo; // nodes todo
+ Node* node;
+
+ private:
+ RPCServer* rpc;
+ bt::Uint32 outstanding_reqs;
+ bt::Uint32 task_id;
+ bool task_finished;
+ bool queued;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/kademlia/taskmanager.cpp b/libktorrent/kademlia/taskmanager.cpp
new file mode 100644
index 0000000..f71fc0d
--- /dev/null
+++ b/libktorrent/kademlia/taskmanager.cpp
@@ -0,0 +1,79 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <torrent/globals.h>
+#include "taskmanager.h"
+#include "nodelookup.h"
+#include "dht.h"
+
+using namespace bt;
+
+namespace dht
+{
+ typedef bt::PtrMap<Uint32,Task>::iterator TaskItr;
+
+ TaskManager::TaskManager() : next_id(0)
+ {
+ tasks.setAutoDelete(true);
+ }
+
+
+ TaskManager::~TaskManager()
+ {
+ queued.setAutoDelete(true);
+ tasks.clear();
+ }
+
+
+ void TaskManager::addTask(Task* task)
+ {
+ Uint32 id = next_id++;
+ task->setTaskID(id);
+ if (task->isQueued())
+ queued.append(task);
+ else
+ tasks.insert(id,task);
+ }
+
+ void TaskManager::removeFinishedTasks(const DHT* dh_table)
+ {
+ QValueList<Uint32> rm;
+ for (TaskItr i = tasks.begin();i != tasks.end();i++)
+ {
+ if (i->second->isFinished())
+ rm.append(i->first);
+ }
+
+ for (QValueList<Uint32>::iterator i = rm.begin();i != rm.end();i++)
+ {
+ tasks.erase(*i);
+ }
+
+ while (dh_table->canStartTask() && queued.count() > 0)
+ {
+ Task* t = queued.first();
+ queued.removeFirst();
+ Out(SYS_DHT|LOG_NOTICE) << "DHT: starting queued task" << endl;
+ t->start();
+ tasks.insert(t->getTaskID(),t);
+ }
+ }
+
+}
diff --git a/libktorrent/kademlia/taskmanager.h b/libktorrent/kademlia/taskmanager.h
new file mode 100644
index 0000000..3df52b6
--- /dev/null
+++ b/libktorrent/kademlia/taskmanager.h
@@ -0,0 +1,69 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DHTTASKMANAGER_H
+#define DHTTASKMANAGER_H
+
+#include <qptrlist.h>
+#include <util/ptrmap.h>
+#include <util/constants.h>
+#include "task.h"
+
+namespace dht
+{
+ class DHT;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Manages all dht tasks.
+ */
+ class TaskManager
+ {
+ public:
+ TaskManager();
+ virtual ~TaskManager();
+
+ /**
+ * Add a task to manage.
+ * @param task
+ */
+ void addTask(Task* task);
+
+ /**
+ * Remove all finished tasks.
+ * @param dh_table Needed to ask permission to start a task
+ */
+ void removeFinishedTasks(const DHT* dh_table);
+
+ /// Get the number of running tasks
+ bt::Uint32 getNumTasks() const {return tasks.count();}
+
+ /// Get the number of queued tasks
+ bt::Uint32 getNumQueuedTasks() const {return queued.count();}
+
+ private:
+ bt::PtrMap<Uint32,Task> tasks;
+ QPtrList<Task> queued;
+ bt::Uint32 next_id;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/ktorrent.kcfg b/libktorrent/ktorrent.kcfg
new file mode 100644
index 0000000..7d451b3
--- /dev/null
+++ b/libktorrent/ktorrent.kcfg
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktorrentrc"/>
+ <group name="downloads">
+ <entry name="maxDownloads" type="Int">
+ <label>Maximum number of downloads (0 = no limit)</label>
+ <default>0</default>
+ <min>0</min>
+ </entry>
+ <entry name="maxSeeds" type="Int">
+ <label>Maximum number of seeds (0 = no limit)</label>
+ <default>0</default>
+ <min>0</min>
+ </entry>
+ <entry name="startDownloadsOnLowDiskSpace" type="Int">
+ <label>Start downloads on low disk space?</label>
+ <default>0</default>
+ </entry>
+ <entry name="maxConnections" type="Int">
+ <label>Maximum number of connections per torrent (0 = no limit)</label>
+ <default>120</default>
+ <min>0</min>
+ </entry>
+ <entry name="maxTotalConnections" type="Int">
+ <label>Maximum number of connections for all torrents (0 = no limit) </label>
+ <default>800</default>
+ <min>0</min>
+ </entry>
+ <entry name="maxUploadRate" type="Int">
+ <label>Maximum upload speed in KB/sec (0 = no limit)</label>
+ <default>0</default>
+ <min>0</min>
+ </entry>
+ <entry name="maxDownloadRate" type="Int">
+ <label>Maximum download speed in KB/sec (0 = no limit)</label>
+ <default>0</default>
+ <min>0</min>
+ </entry>
+ <entry name="maxRatio" type="Double">
+ <label>Maximum share ratio(0 = no limit)</label>
+ <default>0</default>
+ <min>0</min>
+ </entry>
+ <entry name="maxSeedTime" type="Double">
+ <label>Maximum seed time in hours (0 = no limit)</label>
+ <default>0</default>
+ <min>0</min>
+ </entry>
+ <entry name="port" type="Int">
+ <label>Port</label>
+ <default>6881</default>
+ <min>0</min>
+ <max>65535</max>
+ </entry>
+ <entry name="udpTrackerPort" type="Int">
+ <label>Port</label>
+ <default>4444</default>
+ <min>0</min>
+ <max>65535</max>
+ </entry>
+ <entry name="showSystemTrayIcon" type="Bool">
+ <label>Show a system tray icon</label>
+ <default>true</default>
+ </entry>
+ <entry name="showSpeedBarInTrayIcon" type="Bool">
+ <label>Show speed bar in tray icon</label>
+ <default>false</default>
+ </entry>
+ <entry name="downloadBandwidth" type="Int">
+ <label>Download bandwidth (in kb/s):</label>
+ <default>500</default>
+ <min>0</min>
+ <max>1000000</max>
+ </entry>
+ <entry name="uploadBandwidth" type="Int">
+ <label>Upload bandwidth (in kb/s):</label>
+ <default>500</default>
+ <min>0</min>
+ <max>1000000</max>
+ </entry>
+ <entry name="showPopups" type="Bool">
+ <label>Show popup messages when torrent is finished.</label>
+ <default>true</default>
+ </entry>
+ <entry name="keepSeeding" type="Bool">
+ <label>Keep seeding after download has finished</label>
+ <default>true</default>
+ </entry>
+ <entry name="tempDir" type="String">
+ <label>Folder to store temporary files</label>
+ <default code="true">QString::null</default>
+ </entry>
+ <entry name="useSaveDir" type="Bool">
+ <label>Whether to automatically save downloads to saveDir</label>
+ <default>false</default>
+ </entry>
+ <entry name="saveDir" type="String">
+ <label>Folder to store downloaded files</label>
+ <default code="true">QString::null</default>
+ </entry>
+ <entry name="useCompletedDir" type="Bool">
+ <label>Whether to automatically move completed downloads to completedDir</label>
+ <default>false</default>
+ </entry>
+ <entry name="completedDir" type="String">
+ <label>Folder to move completed downloaded files to</label>
+ <default code="true">QString::null</default>
+ </entry>
+ <entry name="useTorrentCopyDir" type="Bool">
+ <label>Whether to automatically copy .torrent files to torrentCopyDir</label>
+ <default>false</default>
+ </entry>
+ <entry name="torrentCopyDir" type="String">
+ <label>Folder to copy .torrent files to</label>
+ <default code="true">QString::null</default>
+ </entry>
+ <entry name="useExternalIP" type="Bool">
+ <label>Whether to use a custom IP to pass to the tracker</label>
+ <default>false</default>
+ </entry>
+ <entry name="lastSaveDir" type="String">
+ <label>Directory which was used as the last save directory</label>
+ <default code="true">QString::null</default>
+ </entry>
+ <entry name="externalIP" type="String">
+ <label>IP to pass to the tracker</label>
+ <default code="true">QString::null</default>
+ </entry>
+ <entry name="memoryUsage" type="Int">
+ <label>Memory usage</label>
+ <default>0</default>
+ </entry>
+ <entry name="guiUpdateInterval" type="Int">
+ <label>GUI update interval</label>
+ <default>0</default>
+ </entry>
+ <entry name="dhtSupport" type="Bool">
+ <label>Support for DHT</label>
+ <default>false</default>
+ </entry>
+ <entry name="dhtPort" type="Int">
+ <label>DHT port</label>
+ <default>6881</default>
+ <min>0</min>
+ <max>65535</max>
+ </entry>
+ <entry name="numUploadSlots" type="Int">
+ <label>Number of upload slots</label>
+ <default>2</default>
+ <min>2</min>
+ <max>100</max>
+ </entry>
+ <entry name="useEncryption" type="Bool">
+ <label>Use protocol encryption</label>
+ <default>false</default>
+ </entry>
+ <entry name="allowUnencryptedConnections" type="Bool">
+ <label>Allow unencrypted connections</label>
+ <default>true</default>
+ </entry>
+ <entry name="allwaysDoUploadDataCheck" type="Bool">
+ <default>true</default>
+ </entry>
+ <entry name="maxSizeForUploadDataCheck" type="Int">
+ <default>512</default>
+ <min>128</min>
+ <max>8192</max>
+ </entry>
+ <entry name="typeOfService" type="Int">
+ <default>8</default>
+ <min>0</min>
+ <max>255</max>
+ </entry>
+ <entry name="DSCP" type="Int">
+ <default>0</default>
+ <min>0</min>
+ <max>63</max>
+ </entry>
+ <entry name="maxConnectingSockets" type="Int">
+ <default>50</default>
+ <min>10</min>
+ <max>500</max>
+ </entry>
+ <entry name="autoRecheck" type="Bool">
+ <default>true</default>
+ </entry>
+ <entry name="maxCorruptedBeforeRecheck" type="Int">
+ <default>3</default>
+ <min>1</min>
+ </entry>
+ <entry name="shownColumns" type="IntList">
+ <label>Columns shown in KTorrentView</label>
+ </entry>
+ <entry name="doNotUseKDEProxy" type="Bool">
+ <default>false</default>
+ </entry>
+ <entry name="httpTrackerProxy" type="String">
+ <default code="true">QString::null</default>
+ </entry>
+ <entry name="eta" type="Int">
+ <label>ET algorithm</label>
+ <default>0</default>
+ </entry>
+ <entry name="diskPrealloc" type="Bool">
+ <default>true</default>
+ </entry>
+
+ <entry name="fullDiskPrealloc" type="Bool">
+ <default>false</default>
+ </entry>
+
+ <entry name="fullDiskPreallocMethod" type="Int">
+ <default>0</default>
+ </entry>
+
+ <entry name="cpuUsage" type="Int">
+ <default>25</default>
+ <min>1</min>
+ <max>50</max>
+ </entry>
+
+ <entry name="minDiskSpace" type="Int">
+ <label>When there's no space left to complete download and free diskspace is less than minDiskSpace, torrent will be stopped.</label>
+ <default>100</default>
+ <min>10</min>
+ <max>10000</max>
+ </entry>
+ </group>
+</kcfg>
diff --git a/libktorrent/ktversion.h b/libktorrent/ktversion.h
new file mode 100644
index 0000000..ffe3dbe
--- /dev/null
+++ b/libktorrent/ktversion.h
@@ -0,0 +1,36 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTVERSION_HH
+#define KTVERSION_HH
+
+
+#include "util/constants.h"
+
+namespace kt
+{
+ const bt::Uint32 MAJOR = 2;
+ const bt::Uint32 MINOR = 2;
+ const char VERSION_STRING[] = "2.2.6";
+ const char PEER_ID[] = "-KT2260-";
+}
+
+#define KT_VERSION_MACRO "2.2.6"
+
+#endif
diff --git a/libktorrent/labelview.cpp b/libktorrent/labelview.cpp
new file mode 100644
index 0000000..10c46d5
--- /dev/null
+++ b/libktorrent/labelview.cpp
@@ -0,0 +1,257 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <algorithm>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <kiconloader.h>
+#include <kglobalsettings.h>
+#include <util/log.h>
+#include "labelview.h"
+
+using namespace bt;
+
+namespace kt
+{
+ LabelViewItem::LabelViewItem(const QString & icon,const QString & title,const QString & description,LabelView* view)
+ : LabelViewItemBase(view),odd(false),selected(false)
+ {
+ icon_lbl->setPixmap(DesktopIcon(icon));
+ title_lbl->setText(title);
+ description_lbl->setText(description);
+ setOdd(false);
+ }
+
+ LabelViewItem::~LabelViewItem()
+ {
+ }
+
+ void LabelViewItem::setTitle(const QString & title)
+ {
+ title_lbl->setText(title);
+ }
+
+ void LabelViewItem::setDescription(const QString & d)
+ {
+ description_lbl->setText(d);
+ }
+
+ void LabelViewItem::setIcon(const QString & icon)
+ {
+ icon_lbl->setPixmap(DesktopIcon(icon));
+ }
+
+ void LabelViewItem::setOdd(bool o)
+ {
+ odd = o;
+ setSelected(selected);
+ }
+
+ void LabelViewItem::setSelected(bool sel)
+ {
+ selected = sel;
+
+ if (selected)
+ {
+ setPaletteBackgroundColor(KGlobalSettings::highlightColor());
+ setPaletteForegroundColor(KGlobalSettings::highlightedTextColor());
+ }
+ else if (odd)
+ {
+ setPaletteBackgroundColor(KGlobalSettings::baseColor());
+ setPaletteForegroundColor(KGlobalSettings::textColor());
+ }
+ else
+ {
+ setPaletteBackgroundColor(KGlobalSettings::alternateBackgroundColor());
+ setPaletteForegroundColor(KGlobalSettings::textColor());
+ }
+ }
+
+ bool LabelViewItem::operator < (const LabelViewItem & item)
+ {
+ return title_lbl->text() < item.title_lbl->text();
+ }
+
+ void LabelViewItem::mousePressEvent(QMouseEvent *e)
+ {
+ if (e->button() == QMouseEvent::LeftButton)
+ {
+ clicked(this);
+ }
+
+ setFocus();
+ QWidget::mousePressEvent(e);
+ }
+
+ typedef std::list<LabelViewItem*>::iterator LabelViewItr;
+ typedef std::list<LabelViewItem*>::const_iterator LabelViewCItr;
+
+ class LabelViewBox : public QWidget
+ {
+ QVBoxLayout* layout;
+ public:
+ LabelViewBox(QWidget* parent) : QWidget(parent)
+ {
+ setPaletteBackgroundColor(KGlobalSettings::baseColor());
+ layout = new QVBoxLayout(this);
+ layout->setMargin(0);
+ }
+
+ virtual ~LabelViewBox()
+ {}
+
+ void add(LabelViewItem* item)
+ {
+ item->reparent(this,QPoint(0,0));
+ layout->add(item);
+ item->show();
+ }
+
+ void remove(LabelViewItem* item)
+ {
+ item->hide();
+ layout->remove(item);
+ item->reparent(0,QPoint(0,0));
+ }
+
+ void sorted(const std::list<LabelViewItem*> items)
+ {
+ for (LabelViewCItr i = items.begin();i != items.end();i++)
+ layout->remove(*i);
+
+ for (LabelViewCItr i = items.begin();i != items.end();i++)
+ layout->add(*i);
+ }
+ };
+
+
+
+ ///////////////////////////////////////
+
+ LabelView::LabelView ( QWidget *parent, const char *name )
+ : QScrollView ( parent, name ),selected(0)
+ {
+ item_box = new LabelViewBox(this->viewport());
+ setResizePolicy(QScrollView::AutoOneFit);
+
+ addChild(item_box, 0, 0);
+ item_box->show();
+ }
+
+
+ LabelView::~LabelView()
+ {}
+
+ void LabelView::addItem(LabelViewItem* item)
+ {
+ item_box->add(item);
+ items.push_back(item);
+ item->setOdd(items.size() % 2 == 1);
+
+ connect(item, SIGNAL(clicked(LabelViewItem*)),
+ this, SLOT(onItemClicked(LabelViewItem*)));
+ }
+
+ void LabelView::removeItem(LabelViewItem* item)
+ {
+ LabelViewItr i = std::find(items.begin(),items.end(),item);
+ if (i != items.end())
+ {
+ item_box->remove(item);
+ items.erase(i);
+ disconnect(item, SIGNAL(clicked(LabelViewItem*)),
+ this, SLOT(onItemClicked(LabelViewItem*)));
+
+ // check for selected being equal to item
+ if (item == selected)
+ selected = 0;
+
+ // update odd status of each item
+ updateOddStatus();
+ }
+ }
+
+ void LabelView::updateOddStatus()
+ {
+ bool odd = true;
+ LabelViewItr i = items.begin();
+ while (i != items.end())
+ {
+ LabelViewItem* item = *i;
+ item->setOdd(odd);
+ odd = !odd;
+ i++;
+ }
+ }
+
+ void LabelView::onItemClicked(LabelViewItem* it)
+ {
+ if (selected == it)
+ return;
+
+ if (selected)
+ selected->setSelected(false);
+
+ selected = it;
+ selected->setSelected(true);
+ currentChanged(selected);
+ }
+
+ void LabelView::clear()
+ {
+ LabelViewItr i = items.begin();
+ while (i != items.end())
+ {
+ LabelViewItem* item = *i;
+ item_box->remove(item);
+ i = items.erase(i);
+ delete item;
+ }
+ selected = 0;
+ }
+
+ void LabelView::update()
+ {
+ LabelViewItr i = items.begin();
+ while (i != items.end())
+ {
+ LabelViewItem* item = *i;
+ item->update();
+ i++;
+ }
+ }
+
+ struct LabelViewItemCmp
+ {
+ bool operator() (LabelViewItem* a,LabelViewItem* b)
+ {
+ return *a < *b;
+ }
+ };
+
+ void LabelView::sort()
+ {
+ items.sort(LabelViewItemCmp());
+ item_box->sorted(items);
+ updateOddStatus();
+ }
+
+}
+#include "labelview.moc"
diff --git a/libktorrent/labelview.h b/libktorrent/labelview.h
new file mode 100644
index 0000000..5e83213
--- /dev/null
+++ b/libktorrent/labelview.h
@@ -0,0 +1,125 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTLABELVIEW_H
+#define KTLABELVIEW_H
+
+#include <list>
+#include <qscrollview.h>
+#include "labelviewitembase.h"
+
+class QLabel;
+class QHBoxLayout;
+class QVBoxLayout;
+
+namespace kt
+{
+ class LabelView;
+
+ /**
+ Item in a LabelView
+ */
+ class LabelViewItem : public LabelViewItemBase
+ {
+ Q_OBJECT
+ public:
+ LabelViewItem(const QString & icon,const QString & title,const QString & description,LabelView* view);
+ virtual ~LabelViewItem();
+
+ /// Set the title of the item
+ void setTitle(const QString & title);
+
+ /// Set the description
+ void setDescription(const QString & d);
+
+ /// Set the name of the icon
+ void setIcon(const QString & icon);
+
+ /// Set if this is an odd item (they have a different background color)
+ void setOdd(bool odd);
+
+ /// Set if this item is selected
+ void setSelected(bool sel);
+
+ /// Can be reimplemented to update the GUI of the item by base classes
+ virtual void update() {}
+
+ /// Smaller then operator for sorting (by default we sort on title)
+ virtual bool operator < (const LabelViewItem & item);
+
+ private:
+ virtual void mousePressEvent(QMouseEvent *e);
+
+ signals:
+ void clicked(LabelViewItem* item);
+
+ private:
+ bool odd;
+ bool selected;
+ };
+
+ class LabelViewBox;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class LabelView : public QScrollView
+ {
+ Q_OBJECT
+ public:
+ LabelView(QWidget *parent = 0, const char *name = 0);
+ virtual ~LabelView();
+
+ /// Add an item to the label view
+ void addItem(LabelViewItem* item);
+
+ /// Remove an item from the label view
+ void removeItem(LabelViewItem* item);
+
+ /// Get the current selected item (0 if none is selected)
+ LabelViewItem* selectedItem() {return selected;}
+
+ /// Clear the view
+ void clear();
+
+ /// Update all items in the view
+ void update();
+
+ /// Sort the items using the operator <
+ void sort();
+
+ private slots:
+ void onItemClicked(LabelViewItem* it);
+
+ private:
+ void updateOddStatus();
+
+ signals:
+ /// The current item has changed
+ void currentChanged(LabelViewItem* item);
+
+ private:
+ LabelViewBox* item_box;
+ std::list<LabelViewItem*> items;
+ LabelViewItem* selected;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/labelviewitembase.ui b/libktorrent/labelviewitembase.ui
new file mode 100644
index 0000000..174803f
--- /dev/null
+++ b/libktorrent/labelviewitembase.ui
@@ -0,0 +1,73 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>LabelViewItemBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>LabelViewItemBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>100</height>
+ </rect>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>icon_lbl</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>64</width>
+ <height>64</height>
+ </size>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>title_lbl</cstring>
+ </property>
+ <property name="text">
+ <string>textLabel2</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>description_lbl</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>textLabel3</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/libktorrent/migrate/Makefile.am b/libktorrent/migrate/Makefile.am
new file mode 100644
index 0000000..9bb5528
--- /dev/null
+++ b/libktorrent/migrate/Makefile.am
@@ -0,0 +1,7 @@
+INCLUDES = -I$(srcdir)/.. $(all_includes)
+METASOURCES = AUTO
+libmigrate_la_LDFLAGS = $(all_libraries)
+noinst_LTLIBRARIES = libmigrate.la
+noinst_HEADERS = migrate.h ccmigrate.h cachemigrate.h
+libmigrate_la_SOURCES = migrate.cpp ccmigrate.cpp cachemigrate.cpp
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/migrate/cachemigrate.cpp b/libktorrent/migrate/cachemigrate.cpp
new file mode 100644
index 0000000..f9b203c
--- /dev/null
+++ b/libktorrent/migrate/cachemigrate.cpp
@@ -0,0 +1,120 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qstringlist.h>
+#include <qfileinfo.h>
+#include <util/log.h>
+#include <util/fileops.h>
+#include <util/functions.h>
+#include <torrent/torrent.h>
+#include <torrent/globals.h>
+#include "cachemigrate.h"
+
+
+namespace bt
+{
+
+ bool IsCacheMigrateNeeded(const Torrent & tor,const QString & cache)
+ {
+ // mutli files always need to be migrated
+ if (tor.isMultiFile())
+ return true;
+
+ // a single file and a symlink do not need to be migrated
+ QFileInfo finfo(cache);
+ if (finfo.isSymLink())
+ return false;
+
+ return true;
+ }
+
+ static void MigrateSingleCache(const Torrent & tor,const QString & cache,const QString & output_dir)
+ {
+ Out() << "Migrating single cache " << cache << " to " << output_dir << endl;
+
+ bt::Move(cache,output_dir + tor.getNameSuggestion());
+ bt::SymLink(output_dir + tor.getNameSuggestion(),cache);
+ }
+
+ static void MakePath(const QString & startdir,const QString & path)
+ {
+ QStringList sl = QStringList::split(bt::DirSeparator(),path);
+
+ // create all necessary subdirs
+ QString ctmp = startdir;
+
+ for (Uint32 i = 0;i < sl.count() - 1;i++)
+ {
+ ctmp += sl[i];
+ // we need to make the same directory structure in the cache
+ // as the output dir
+ if (!bt::Exists(ctmp))
+ MakeDir(ctmp);
+
+ ctmp += bt::DirSeparator();
+ }
+ }
+
+ static void MigrateMultiCache(const Torrent & tor,const QString & cache,const QString & output_dir)
+ {
+ Out() << "Migrating multi cache " << cache << " to " << output_dir << endl;
+ // if the cache dir is a symlink, everything is OK
+ if (QFileInfo(cache).isSymLink())
+ return;
+
+ QString cache_dir = cache;
+
+
+ // make the output dir if it does not exists
+ if (!bt::Exists(output_dir + tor.getNameSuggestion()))
+ bt::MakeDir(output_dir + tor.getNameSuggestion());
+
+ QString odir = output_dir + tor.getNameSuggestion() + bt::DirSeparator();
+ QString cdir = cache;
+ if (!cdir.endsWith(bt::DirSeparator()))
+ cdir += bt::DirSeparator();
+
+ // loop over all files in the cache and see if they are symlinks
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ const TorrentFile & tf = tor.getFile(i);
+ QFileInfo fi(cdir + tf.getPath());
+ // symlinks are OK
+ if (fi.isSymLink())
+ continue;
+ // make the path if necessary
+ MakePath(odir,tf.getPath());
+ // no symlink so move to output_dir
+ bt::Move(cdir + tf.getPath(),odir + tf.getPath());
+ bt::SymLink(odir + tf.getPath(),cdir + tf.getPath());
+ }
+ }
+
+ void MigrateCache(const Torrent & tor,const QString & cache,const QString & output_dir)
+ {
+ QString odir = output_dir;
+ if (!odir.endsWith(bt::DirSeparator()))
+ odir += bt::DirSeparator();
+
+ if (!tor.isMultiFile())
+ MigrateSingleCache(tor,cache,odir);
+ else
+ MigrateMultiCache(tor,cache,odir);
+ }
+}
diff --git a/libktorrent/migrate/cachemigrate.h b/libktorrent/migrate/cachemigrate.h
new file mode 100644
index 0000000..3eea231
--- /dev/null
+++ b/libktorrent/migrate/cachemigrate.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCACHEMIGRATE_H
+#define BTCACHEMIGRATE_H
+
+namespace bt
+{
+ class Torrent;
+
+ /// See if a cache migrate is needed
+ bool IsCacheMigrateNeeded(const Torrent & tor,const QString & cache);
+
+ /// Migrate the cache
+ void MigrateCache(const Torrent & tor,const QString & cache,const QString & output_dir);
+}
+
+#endif
diff --git a/libktorrent/migrate/ccmigrate.cpp b/libktorrent/migrate/ccmigrate.cpp
new file mode 100644
index 0000000..80153bf
--- /dev/null
+++ b/libktorrent/migrate/ccmigrate.cpp
@@ -0,0 +1,167 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <util/log.h>
+#include <util/file.h>
+#include <util/error.h>
+#include <util/array.h>
+#include <util/bitset.h>
+#include <util/fileops.h>
+#include <torrent/downloader.h>
+#include <torrent/torrent.h>
+#include <torrent/globals.h>
+#include <torrent/chunkdownload.h>
+#include <ktversion.h>
+#include "ccmigrate.h"
+
+namespace bt
+{
+ bool IsPreMMap(const QString & current_chunks)
+ {
+ File fptr;
+ if (!fptr.open(current_chunks,"rb"))
+ return false;
+
+ CurrentChunksHeader chdr;
+ fptr.read(&chdr,sizeof(CurrentChunksHeader));
+ if (chdr.magic != CURRENT_CHUNK_MAGIC)
+ {
+ // magic number not good, so pre
+ return true;
+ }
+
+ if (chdr.major >= 2 || (chdr.major == 1 && chdr.minor >= 2))
+ {
+ // version number is 1.2 or greater
+ return false;
+ }
+
+ return false;
+ }
+
+ static bool MigrateChunk(const Torrent & tor,File & new_cc,File & old_cc)
+ {
+ Uint32 ch = 0;
+ old_cc.read(&ch,sizeof(Uint32));
+
+ Out() << "Migrating chunk " << ch << endl;
+ if (ch >= tor.getNumChunks())
+ return false;
+
+ // calculate the size
+ Uint32 csize = 0;
+ if (ch == tor.getNumChunks() - 1)
+ {
+ // ch is the last chunk, so it might have a different size
+ csize = tor.getFileLength() % tor.getChunkSize();
+ if (ch == 0)
+ csize = tor.getChunkSize();
+ }
+ else
+ {
+ csize = tor.getChunkSize();
+ }
+
+ // calculate the number of pieces
+ Uint32 num_pieces = csize / MAX_PIECE_LEN;
+ if (csize % MAX_PIECE_LEN > 0)
+ num_pieces++;
+
+ // load the pieces array
+ Array<bool> pieces(num_pieces);
+ old_cc.read(pieces,sizeof(bool)*num_pieces);
+
+ // convert bool array to bitset
+ BitSet pieces_bs(num_pieces);
+ for (Uint32 i = 0;i < num_pieces;i++)
+ pieces_bs.set(i,pieces[i]);
+
+ // load the actual data
+ Array<Uint8> data(csize);
+ old_cc.read(data,csize);
+
+ // write to the new file
+ ChunkDownloadHeader hdr;
+ hdr.index = ch;
+ hdr.num_bits = num_pieces;
+ hdr.buffered = 1; // by default we will use buffered chunks
+ // save the chunk header
+ new_cc.write(&hdr,sizeof(ChunkDownloadHeader));
+ // save the bitset
+ new_cc.write(pieces_bs.getData(),pieces_bs.getNumBytes());
+ new_cc.write(data,csize);
+ return true;
+ }
+
+ static void MigrateCC(const Torrent & tor,const QString & current_chunks)
+ {
+ Out() << "Migrating current_chunks file " << current_chunks << endl;
+ // open the old current_chunks file
+ File old_cc;
+ if (!old_cc.open(current_chunks,"rb"))
+ throw Error(i18n("Cannot open file %1 : %2").arg(current_chunks).arg(old_cc.errorString()));
+
+ // open a new file in the /tmp dir
+ File new_cc;
+ QString tmp = current_chunks + ".tmp";
+ if (!new_cc.open(tmp,"wb"))
+ throw Error(i18n("Cannot open file %1 : %2").arg(tmp).arg(old_cc.errorString()));
+
+ // read the number of chunks
+ Uint32 num = 0;
+ old_cc.read(&num,sizeof(Uint32));
+ Out() << "Found " << num << " chunks" << endl;
+
+ // write the new current_chunks header
+ CurrentChunksHeader hdr;
+ hdr.magic = CURRENT_CHUNK_MAGIC;
+ hdr.major = kt::MAJOR;
+ hdr.minor = kt::MINOR;
+ hdr.num_chunks = num;
+ new_cc.write(&hdr,sizeof(CurrentChunksHeader));
+
+ for (Uint32 i = 0;i < num;i++)
+ {
+ if (!MigrateChunk(tor,new_cc,old_cc))
+ break;
+ }
+
+ // migrate done, close both files and move new_cc to old_cc
+ new_cc.close();
+ old_cc.close();
+ bt::Delete(current_chunks);
+ bt::Move(tmp,current_chunks);
+ }
+
+ void MigrateCurrentChunks(const Torrent & tor,const QString & current_chunks)
+ {
+ try
+ {
+ MigrateCC(tor,current_chunks);
+ }
+ catch (...)
+ {
+ // cleanup tmp files upon error
+ bt::Delete("/tmp/kt_current_chunks",true);
+ throw;
+ }
+ }
+
+}
diff --git a/libktorrent/migrate/ccmigrate.h b/libktorrent/migrate/ccmigrate.h
new file mode 100644
index 0000000..890bdfa
--- /dev/null
+++ b/libktorrent/migrate/ccmigrate.h
@@ -0,0 +1,36 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCCMIGRATE_H
+#define BTCCMIGRATE_H
+
+namespace bt
+{
+ class Torrent;
+
+ /// Migrates the current_chunks file to the post-mmap era.
+ void MigrateCurrentChunks(const Torrent & tor,const QString & current_chunks);
+
+
+ /// Test if a current_chunks file is from the pre-mmap period
+ bool IsPreMMap(const QString & current_chunks);
+
+}
+
+#endif
diff --git a/libktorrent/migrate/migrate.cpp b/libktorrent/migrate/migrate.cpp
new file mode 100644
index 0000000..eddde83
--- /dev/null
+++ b/libktorrent/migrate/migrate.cpp
@@ -0,0 +1,75 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include <klocale.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <util/fileops.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include "migrate.h"
+#include "ccmigrate.h"
+#include "cachemigrate.h"
+
+namespace bt
+{
+
+ Migrate::Migrate()
+ {}
+
+
+ Migrate::~Migrate()
+ {}
+
+ void Migrate::migrate(const Torrent & tor,const QString & tor_dir,const QString & sdir)
+ {
+ // check if directory exists
+ if (!bt::Exists(tor_dir))
+ throw Error(i18n("The directory %1 does not exist").arg(tor_dir));
+
+ // make sure it ends with a /
+ QString tdir = tor_dir;
+ if (!tdir.endsWith(bt::DirSeparator()))
+ tdir += bt::DirSeparator();
+
+ // see if the current_chunks file exists
+ if (bt::Exists(tdir + "current_chunks"))
+ {
+ // first see if it isn't a download started by a post-mmap version
+ if (!IsPreMMap(tdir + "current_chunks"))
+ {
+ // it's not pre, so it must be post, so just return
+ Out() << "No migrate needed" << endl;
+ return;
+ }
+
+ MigrateCurrentChunks(tor,tdir + "current_chunks");
+ }
+
+ // now we need to migrate t
+ if (IsCacheMigrateNeeded(tor,tdir + "cache" + bt::DirSeparator()))
+ {
+ MigrateCache(tor,tdir + "cache" + bt::DirSeparator(),sdir);
+ }
+ }
+
+
+
+}
diff --git a/libktorrent/migrate/migrate.h b/libktorrent/migrate/migrate.h
new file mode 100644
index 0000000..ef862ec
--- /dev/null
+++ b/libktorrent/migrate/migrate.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTMIGRATE_H
+#define BTMIGRATE_H
+
+namespace bt
+{
+ class Torrent;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Class to migrate old pre-mmap downloads to new ones
+ */
+ class Migrate
+ {
+ public:
+ Migrate();
+ virtual ~Migrate();
+
+ /**
+ * Migrate a download to the new format.
+ * @param tor The torrent
+ * @param tor_dir TorX directory
+ * @param sdir The save directory
+ * @throw Error if something goes wrong
+ */
+ void migrate(const Torrent & tor,const QString & tor_dir,const QString & sdir);
+ private:
+ bool preMMap(const QString & current_chunks);
+ void migrateCurrentChunks(const QString & current_chunks);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/mse/Makefile.am b/libktorrent/mse/Makefile.am
new file mode 100644
index 0000000..d6a8ac5
--- /dev/null
+++ b/libktorrent/mse/Makefile.am
@@ -0,0 +1,9 @@
+INCLUDES = -I$(srcdir)/.. $(all_includes)
+METASOURCES = AUTO
+libmse_la_LDFLAGS = -lgmp $(all_libraries)
+noinst_LTLIBRARIES = libmse.la
+noinst_HEADERS = bigint.h rc4encryptor.h streamsocket.h encryptedauthenticate.h \
+ encryptedserverauthenticate.h functions.h
+libmse_la_SOURCES = bigint.cpp rc4encryptor.cpp streamsocket.cpp \
+ encryptedauthenticate.cpp encryptedserverauthenticate.cpp functions.cpp
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/mse/bigint.cpp b/libktorrent/mse/bigint.cpp
new file mode 100644
index 0000000..90c6d9e
--- /dev/null
+++ b/libktorrent/mse/bigint.cpp
@@ -0,0 +1,100 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <time.h>
+#include <string.h>
+#include <stdlib.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include "bigint.h"
+
+using namespace bt;
+
+namespace mse
+{
+
+
+ BigInt::BigInt(Uint32 num_bits)
+ {
+ mpz_init2(val,num_bits);
+ }
+
+ BigInt::BigInt(const QString & value)
+ {
+ mpz_init2(val,(value.length() - 2)*4);
+ mpz_set_str(val,value.ascii(),0);
+ }
+
+ BigInt::BigInt(const BigInt & bi)
+ {
+ mpz_set(val,bi.val);
+ }
+
+ BigInt::~BigInt()
+ {
+ mpz_clear(val);
+ }
+
+
+ BigInt & BigInt::operator = (const BigInt & bi)
+ {
+ mpz_set(val,bi.val);
+ return *this;
+ }
+
+ BigInt BigInt::powerMod(const BigInt & x,const BigInt & e,const BigInt & d)
+ {
+ BigInt r;
+ mpz_powm(r.val,x.val,e.val,d.val);
+ return r;
+ }
+
+ BigInt BigInt::random()
+ {
+ static Uint32 rnd = 0;
+ if (rnd % 10 == 0)
+ {
+ TimeStamp now = bt::GetCurrentTime();
+ srand(now);
+ rnd = 0;
+ }
+ rnd++;
+ Uint8 tmp[20];
+ for (Uint32 i = 0;i < 20;i++)
+ tmp[i] = (Uint8)rand() % 0x100;
+
+ return BigInt::fromBuffer(tmp,20);
+ }
+
+ Uint32 BigInt::toBuffer(Uint8* buf,Uint32 max_size) const
+ {
+ size_t foo;
+ mpz_export(buf,&foo,1,1,1,0,val);
+ return foo;
+ }
+
+ BigInt BigInt::fromBuffer(const Uint8* buf,Uint32 size)
+ {
+ BigInt r(size*8);
+ mpz_import(r.val,size,1,1,1,0,buf);
+ return r;
+ }
+
+}
diff --git a/libktorrent/mse/bigint.h b/libktorrent/mse/bigint.h
new file mode 100644
index 0000000..ad94d20
--- /dev/null
+++ b/libktorrent/mse/bigint.h
@@ -0,0 +1,98 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 MSEBIGINT_H
+#define MSEBIGINT_H
+
+#include <qstring.h>
+#include <util/constants.h>
+#include <stdio.h>
+#include <gmp.h>
+
+using bt::Uint8;
+using bt::Uint16;
+using bt::Uint32;
+using bt::Uint64;
+
+namespace mse
+{
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Class which can hold an arbitrary large integer. This will be a very important part of our
+ * MSE implementation.
+ */
+ class BigInt
+ {
+ public:
+ /**
+ * Create a big integer, with num_bits bits.
+ * All bits will be set to 0.
+ * @param num_bits The number of bits
+ */
+ BigInt(Uint32 num_bits = 0);
+
+ /**
+ * Create a big integer of a string. The string must be
+ * a hexadecimal representation of an integer. For example :
+ * 12AFFE123488BBBE123
+ *
+ * Letters can be upper or lower case. Invalid chars will create an invalid number.
+ * @param value The hexadecimal representation of the number
+ */
+ BigInt(const QString & value);
+
+ /**
+ * Copy constructor.
+ * @param bi BigInt to copy
+ */
+ BigInt(const BigInt & bi);
+ virtual ~BigInt();
+
+ /**
+ * Assignment operator.
+ * @param bi The BigInt to copy
+ * @return *this
+ */
+ BigInt & operator = (const BigInt & bi);
+
+ /**
+ * Calculates
+ * (x ^ e) mod d
+ * ^ is power
+ */
+ static BigInt powerMod(const BigInt & x,const BigInt & e,const BigInt & d);
+
+ /// Make a random BigInt
+ static BigInt random();
+
+ /// Export the bigint ot a buffer
+ Uint32 toBuffer(Uint8* buf,Uint32 max_size) const;
+
+ /// Make a BigInt out of a buffer
+ static BigInt fromBuffer(const Uint8* buf,Uint32 size);
+
+ private:
+ mpz_t val;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/mse/encryptedauthenticate.cpp b/libktorrent/mse/encryptedauthenticate.cpp
new file mode 100644
index 0000000..644ba7b
--- /dev/null
+++ b/libktorrent/mse/encryptedauthenticate.cpp
@@ -0,0 +1,302 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <algorithm>
+#include <util/functions.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <torrent/server.h>
+#include "encryptedauthenticate.h"
+#include "rc4encryptor.h"
+#include "streamsocket.h"
+#include "functions.h"
+
+using namespace bt;
+
+namespace mse
+{
+
+
+
+ EncryptedAuthenticate::EncryptedAuthenticate(
+ const QString& ip,
+ Uint16 port,
+ const SHA1Hash& info_hash,
+ const PeerID& peer_id,
+ PeerManager* pman)
+ : Authenticate(ip, port, info_hash, peer_id, pman)
+ {
+ mse::GeneratePublicPrivateKey(xa,ya);
+ state = NOT_CONNECTED;
+ buf_size = 0;
+ our_rc4 = 0;
+ vc_off = 0;
+ dec_bytes = 0;
+ crypto_select = 0;
+ pad_D_len = 0;
+ end_of_crypto_handshake = 0;
+ //Out(SYS_CON|LOG_DEBUG) << "EncryptedAuthenticate : " << ip << ":" << port << endl;
+ }
+
+
+ EncryptedAuthenticate::~EncryptedAuthenticate()
+ {
+ delete our_rc4;
+ }
+
+
+
+ void EncryptedAuthenticate::connected()
+ {
+ // we are connected so send ya and some padding
+ Uint8 tmp[608];
+ ya.toBuffer(tmp,96);
+ sock->sendData(tmp,96 + rand() % 512);
+ state = SENT_YA;
+ }
+
+ /*
+ 1 A->B: Diffie Hellman Ya, PadA
+ 2 B->A: Diffie Hellman Yb, PadB
+ 3 A->B: HASH('req1', S), HASH('req2', SKEY) xor HASH('req3', S), ENCRYPT(VC, crypto_provide, len(PadC), PadC, len(IA)), ENCRYPT(IA)
+ 4 B->A: ENCRYPT(VC, crypto_select, len(padD), padD), ENCRYPT2(Payload Stream)
+ 5 A->B: ENCRYPT2(Payload Stream)
+ */
+
+
+
+ void EncryptedAuthenticate::handleYB()
+ {
+ // if you can't sent 96 bytes you are not worth the effort
+ if (buf_size < 96)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Not enough data received, encrypted authentication failed" << endl;
+ onFinish(false);
+ return;
+ }
+
+ // read Yb
+ yb = BigInt::fromBuffer(buf,96);
+
+ // calculate s
+ s = mse::DHSecret(xa,yb);
+
+ state = GOT_YB;
+ // now we must send line 3
+ Uint8 tmp_buf[120]; // temporary buffer
+ bt::SHA1Hash h1,h2; // temporary hash
+
+ // generate and send the first hash
+ memcpy(tmp_buf,"req1",4);
+ s.toBuffer(tmp_buf + 4,96);
+ h1 = SHA1Hash::generate(tmp_buf,100);
+ sock->sendData(h1.getData(),20);
+
+ // generate second and third hash and xor them
+ memcpy(tmp_buf,"req2",4);
+ memcpy(tmp_buf+4,info_hash.getData(),20);
+ h1 = SHA1Hash::generate(tmp_buf,24);
+
+ memcpy(tmp_buf,"req3",4);
+ s.toBuffer(tmp_buf + 4,96);
+ h2 = SHA1Hash::generate(tmp_buf,100);
+ sock->sendData((h1 ^ h2).getData(),20);
+
+ // now we enter encrypted mode the keys are :
+ // HASH('keyA', S, SKEY) for the encryption key
+ // HASH('keyB', S, SKEY) for the decryption key
+ enc = mse::EncryptionKey(true,s,info_hash);
+ dec = mse::EncryptionKey(false,s,info_hash);
+
+ our_rc4 = new RC4Encryptor(dec,enc);
+
+ // now we must send ENCRYPT(VC, crypto_provide, len(PadC), PadC, len(IA))
+ memset(tmp_buf,0,16); // VC are 8 0x00's
+ if (Globals::instance().getServer().unencryptedConnectionsAllowed())
+ tmp_buf[11] = 0x03; // we support both plain text and rc4
+ else
+ tmp_buf[11] = 0x02;
+ WriteUint16(tmp_buf,12,0x0000); // no padC
+ WriteUint16(tmp_buf,14,68); // length of IA, which will be the bittorrent handshake
+ // send IA which is the handshake
+ makeHandshake(tmp_buf+16,info_hash,our_peer_id);
+ sock->sendData(our_rc4->encrypt(tmp_buf,84),84);
+
+ // search for the encrypted VC in the data
+ findVC();
+ }
+
+ void EncryptedAuthenticate::findVC()
+ {
+ Uint8 vc[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+
+ RC4Encryptor rc4(enc,dec);
+ memcpy(vc,rc4.encrypt(vc,8),8);
+
+ Uint32 max_i = buf_size - 8;
+ for (Uint32 i = 96;i < max_i;i++)
+ {
+ if (vc[0] == buf[i] && memcmp(buf+i,vc,8) == 0)
+ {
+ state = FOUND_VC;
+ vc_off = i;
+ handleCryptoSelect();
+ return;
+ }
+ }
+
+ // we haven't found it in the first 616 bytes (96 + max 512 padding + 8 bytes VC)
+ if (buf_size >= 616)
+ {
+ onFinish(false);
+ }
+ }
+
+ void EncryptedAuthenticate::handleCryptoSelect()
+ {
+ // not enough data available so lets come back later
+ if (vc_off + 14 >= buf_size)
+ return;
+
+ // now decrypt the first 14 bytes
+ our_rc4->decrypt(buf + vc_off,14);
+ // check the VC
+ for (Uint32 i = vc_off;i < vc_off + 8;i++)
+ {
+ if (buf[i])
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Invalid VC " << endl;
+ onFinish(false);
+ return;
+ }
+ }
+
+ crypto_select = ReadUint32(buf,vc_off + 8);
+ pad_D_len = ReadUint16(buf,vc_off + 12);
+ if (pad_D_len > 512)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Invalid pad D length" << endl;
+ onFinish(false);
+ return;
+ }
+
+ end_of_crypto_handshake = vc_off + 14 + pad_D_len;
+ if (!(vc_off + 14 + pad_D_len < buf_size))
+ {
+ // padD is not complete, wait for that
+ state = WAIT_FOR_PAD_D;
+ return;
+ }
+
+ handlePadD();
+ }
+
+ void EncryptedAuthenticate::handlePadD()
+ {
+ // decrypt the padding
+ our_rc4->decrypt(buf + (vc_off + 14),pad_D_len);
+
+ bool rc4 = false;
+ if (crypto_select & 0x00000001) // plain_text selected
+ {
+ delete our_rc4;
+ our_rc4 = 0;
+ }
+ else if (crypto_select & 0x00000002) // now it must be rc4 if not exit
+ {
+ sock->setRC4Encryptor(our_rc4);
+ our_rc4 = 0;
+ rc4 = true;
+ }
+ else // we don't support anything else so error out
+ {
+ onFinish(false);
+ return;
+ }
+
+ // noz we wait for the normal handshake
+ state = NORMAL_HANDSHAKE;
+ // if we have read more then the crypto handshake, reinsert it
+ if (buf_size > vc_off + 14 + pad_D_len)
+ {
+ Uint32 off = vc_off + 14 + pad_D_len;
+ sock->reinsert(buf + off,buf_size - off);
+ Authenticate::onReadyRead();
+ }
+ }
+
+ void EncryptedAuthenticate::onReadyRead()
+ {
+ if (finished)
+ return;
+
+
+ Uint32 ba = sock->bytesAvailable();
+ if (ba == 0)
+ {
+ onFinish(false);
+ return;
+ }
+
+ if (state != NORMAL_HANDSHAKE)
+ {
+ if (buf_size + ba > MAX_EA_BUF_SIZE)
+ ba = MAX_EA_BUF_SIZE - buf_size;
+
+ // do not read past the end of padD
+ if (pad_D_len > 0 && buf_size + ba > vc_off + 14 + pad_D_len)
+ ba = (vc_off + 14 + pad_D_len) - buf_size;
+ // read data
+ buf_size += sock->readData(buf + buf_size,ba);
+
+ }
+
+ switch (state)
+ {
+ case SENT_YA:
+ if (ba > 608)
+ {
+ onFinish(false);
+ }
+ else
+ {
+ handleYB();
+ }
+ break;
+ case GOT_YB:
+ findVC();
+ break;
+ case FOUND_VC:
+ handleCryptoSelect();
+ break;
+ case WAIT_FOR_PAD_D:
+ handlePadD();
+ break;
+ case NORMAL_HANDSHAKE:
+ // let AuthenticateBase deal with the data
+ AuthenticateBase::onReadyRead();
+ break;
+ };
+ }
+
+
+}
+
+#include "encryptedauthenticate.moc"
diff --git a/libktorrent/mse/encryptedauthenticate.h b/libktorrent/mse/encryptedauthenticate.h
new file mode 100644
index 0000000..74ccc1b
--- /dev/null
+++ b/libktorrent/mse/encryptedauthenticate.h
@@ -0,0 +1,82 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 MSEENCRYPTEDAUTHENTICATE_H
+#define MSEENCRYPTEDAUTHENTICATE_H
+
+#include <util/sha1hash.h>
+#include <torrent/authenticate.h>
+#include "bigint.h"
+
+
+namespace mse
+{
+ class RC4Encryptor;
+
+ const Uint32 MAX_EA_BUF_SIZE = 622 + 512;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Encrypted version of the Authenticate class
+ */
+ class EncryptedAuthenticate : public bt::Authenticate
+ {
+ Q_OBJECT
+ public:
+ EncryptedAuthenticate(const QString& ip, Uint16 port, const bt::SHA1Hash& info_hash, const bt::PeerID& peer_id, bt::PeerManager* pman);
+ virtual ~EncryptedAuthenticate();
+
+ private slots:
+ virtual void connected();
+ virtual void onReadyRead();
+
+ private:
+ void handleYB();
+ void handleCryptoSelect();
+ void findVC();
+ void handlePadD();
+
+ private:
+ enum State
+ {
+ NOT_CONNECTED,
+ SENT_YA,
+ GOT_YB,
+ FOUND_VC,
+ WAIT_FOR_PAD_D,
+ NORMAL_HANDSHAKE
+ };
+
+ BigInt xa,ya,s,skey,yb;
+ State state;
+ RC4Encryptor* our_rc4;
+ Uint8 buf[MAX_EA_BUF_SIZE];
+ Uint32 buf_size;
+ Uint32 vc_off;
+ Uint32 dec_bytes;
+ bt::SHA1Hash enc,dec;
+ Uint32 crypto_select;
+ Uint16 pad_D_len;
+ Uint32 end_of_crypto_handshake;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/mse/encryptedserverauthenticate.cpp b/libktorrent/mse/encryptedserverauthenticate.cpp
new file mode 100644
index 0000000..40353ad
--- /dev/null
+++ b/libktorrent/mse/encryptedserverauthenticate.cpp
@@ -0,0 +1,354 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include <torrent/server.h>
+#include <torrent/globals.h>
+#include "encryptedserverauthenticate.h"
+#include "functions.h"
+#include "streamsocket.h"
+#include "rc4encryptor.h"
+
+using namespace bt;
+
+namespace mse
+{
+ EncryptedServerAuthenticate::EncryptedServerAuthenticate(mse::StreamSocket* sock, bt::Server* server): bt::ServerAuthenticate(sock, server)
+ {
+ mse::GeneratePublicPrivateKey(xb,yb);
+ state = WAITING_FOR_YA;
+ buf_size = 0;
+ req1_off = 0;
+ our_rc4 = 0;
+ pad_C_len = 0;
+ crypto_provide = crypto_select = 0;
+ }
+
+
+ EncryptedServerAuthenticate::~EncryptedServerAuthenticate()
+ {
+ delete our_rc4;
+ }
+
+ void EncryptedServerAuthenticate::sendYB()
+ {
+ Uint8 tmp[608];
+ yb.toBuffer(tmp,96);
+ // DumpBigInt("Xb",xb);
+ // DumpBigInt("Yb",yb);
+ sock->sendData(tmp,96 + rand() % 512);
+ //Out() << "Sent YB" << endl;
+ }
+
+
+ void EncryptedServerAuthenticate::handleYA()
+ {
+ sendYB();
+
+ ya = BigInt::fromBuffer(buf,96);
+ // DumpBigInt("Ya",ya);
+ // now calculate secret
+ s = mse::DHSecret(xb,ya);
+ // DumpBigInt("S",s);
+ state = WAITING_FOR_REQ1;
+ // see if we can find req1
+ findReq1();
+ }
+
+ void EncryptedServerAuthenticate::findReq1()
+ {
+ if (buf_size < 116) // safety check
+ return;
+
+ // Out() << "Find Req1" << endl;
+ Uint8 tmp[100];
+ memcpy(tmp,"req1",4);
+ s.toBuffer(tmp + 4,96);
+ SHA1Hash req1 = SHA1Hash::generate(tmp,100);
+ for (Uint32 i = 96;i < buf_size - 20;i++)
+ {
+ if (buf[i] == req1.getData()[0] && memcmp(buf+i,req1.getData(),20) == 0)
+ {
+ state = FOUND_REQ1;
+ req1_off = i;
+ calculateSKey();
+ return;
+ }
+ }
+
+ if (buf_size > 608)
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Couldn't find req1" << endl;
+ onFinish(false);
+ }
+ }
+
+ void EncryptedServerAuthenticate::calculateSKey()
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Calculate SKEY" << endl;
+ // not enough data return
+ if (req1_off + 40 > buf_size)
+ return;
+
+ Uint8 tmp[100];
+ memcpy(tmp,"req3",4);
+ s.toBuffer(tmp+4,96);
+ SHA1Hash r3 = SHA1Hash::generate(tmp,100);
+ SHA1Hash r(buf + req1_off + 20);
+
+ // r = HASH('req2', SKEY) xor HASH('req3', S)
+ SHA1Hash r2 = r ^ r3; // now calculate HASH('req2', SKEY)
+ if (!server->findInfoHash(r2,info_hash))
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Unknown info_hash" << endl;
+ onFinish(false);
+ return;
+ }
+ // we have found the info_hash, now process VC and the rest
+ state = FOUND_INFO_HASH;
+ processVC();
+ }
+
+ void EncryptedServerAuthenticate::processVC()
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Process VC" << endl;
+ if (!our_rc4)
+ {
+ // calculate the keys
+ SHA1Hash enc = mse::EncryptionKey(false,s,info_hash);
+ SHA1Hash dec = mse::EncryptionKey(true,s,info_hash);
+ //Out() << "enc = " << enc.toString() << endl;
+ //Out() << "dec = " << dec.toString() << endl;
+ our_rc4 = new RC4Encryptor(dec,enc);
+ }
+
+ // if we do not have everything return
+ if (buf_size < req1_off + 40 + 14)
+ return;
+
+
+ Uint32 off = req1_off + 40;
+ // now decrypt the vc and crypto_provide and the length of pad_C
+ our_rc4->decrypt(buf + off,14);
+
+ // check the VC
+ for (Uint32 i = 0;i < 8;i++)
+ {
+ if (buf[off + i])
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Illegal VC" << endl;
+ onFinish(false);
+ return;
+ }
+ }
+ // get crypto_provide and the length of pad_C
+ crypto_provide = bt::ReadUint32(buf,off + 8);
+ pad_C_len = bt::ReadUint16(buf,off + 12);
+ if (pad_C_len > 512)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Illegal pad C length" << endl;
+ onFinish(false);
+ return;
+ }
+
+ // now we have crypto_provide we can send
+ // ENCRYPT(VC, crypto_select, len(padD), padD)
+ Uint8 tmp[14];
+ memset(tmp,0,14); // VC
+ if (crypto_provide & 0x0000002) // RC4
+ {
+ WriteUint32(tmp,8,0x0000002);
+ crypto_select = 0x0000002;
+ }
+ else
+ {
+ WriteUint32(tmp,8,0x0000001);
+ crypto_select = 0x0000001;
+ }
+ bt::WriteUint16(tmp,12,0); // no pad D
+
+ sock->sendData(our_rc4->encrypt(tmp,14),14);
+
+ // handle pad C
+ if (buf_size < req1_off + 14 + pad_C_len)
+ {
+ // we do not have the full padC
+ state = WAIT_FOR_PAD_C;
+ return;
+ }
+
+ handlePadC();
+ }
+
+ void EncryptedServerAuthenticate::handlePadC()
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Handle PAD C" << endl;
+ // not enough data, so return, we need padC and the length of IA
+ if (buf_size < req1_off + 54 + pad_C_len + 2)
+ return;
+
+ // we have decrypted everything up to pad_C_len
+ Uint32 off = req1_off + 54;
+ our_rc4->decrypt(buf + off,pad_C_len + 2);
+ ia_len = bt::ReadUint16(buf,off + pad_C_len);
+ if (buf_size < off + ia_len)
+ {
+ // we do not have the IA, so wait for it
+ state = WAIT_FOR_IA;
+ return;
+ }
+ handleIA();
+ }
+
+ void EncryptedServerAuthenticate::handleIA()
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Handle IA" << endl;
+ // not enough data, so return, we need padC and the length of IA
+ if (buf_size < req1_off + 54 + pad_C_len + 2 + ia_len)
+ return;
+
+ // decrypt the initial argument
+ if (ia_len > 0)
+ {
+ Uint32 off = req1_off + 54 + pad_C_len + 2;
+ // reinsert everything so that the normal authentication can handle it
+ sock->reinsert(buf + off,buf_size - off);
+ }
+
+ bool allow_unenc = Globals::instance().getServer().unencryptedConnectionsAllowed();
+
+ if (crypto_select & 0x0000002)
+ {
+ sock->setRC4Encryptor(our_rc4);
+ our_rc4 = 0;
+ }
+ else if (!allow_unenc && crypto_select & 0x00000001)
+ {
+ // if no encrypted connections
+ Out(SYS_CON|LOG_DEBUG) << "Unencrypted connections not allowed" << endl;
+ onFinish(false);
+ return;
+ }
+ else
+ {
+ delete our_rc4;
+ our_rc4 = 0;
+ }
+
+ // hand it over to ServerAuthenticate
+ state = NON_ENCRYPTED_HANDSHAKE;
+ ServerAuthenticate::onReadyRead();
+ }
+
+ void EncryptedServerAuthenticate::onReadyRead()
+ {
+ if (!sock)
+ return;
+
+ Uint32 ba = sock->bytesAvailable();
+ if (!ba)
+ {
+ onFinish(false);
+ return;
+ }
+
+ // make sure we don't write past the end of the buffer
+ if (buf_size + ba > MAX_SEA_BUF_SIZE)
+ ba = MAX_SEA_BUF_SIZE - buf_size;
+
+ switch (state)
+ {
+ case WAITING_FOR_YA:
+ if (ba <= 68 && Globals::instance().getServer().unencryptedConnectionsAllowed())
+ {
+ // this is most likely an unencrypted handshake, so if we can find a peer manager
+ // for the info hash in it, add it to the list of potential peers of that peer manager
+ // so it will be contacted later on
+ /* buf_size += sock->readData(buf + buf_size,ba);
+ if (buf_size >= 48)
+ {
+ SHA1Hash rh(buf+28);
+ PeerManager* pman = server->findPeerManager(rh);
+ if (pman)
+ {
+ PotentialPeer pp;
+ pp.ip = sock->getRemoteIPAddress();
+ pp.port = sock->getRemotePort();
+ pman->addPotentialPeer(pp);
+ }
+ }
+ onFinish(false);
+ */
+ Out(SYS_CON|LOG_DEBUG) << "Switching back to normal server authenticate" << endl;
+ state = NON_ENCRYPTED_HANDSHAKE;
+ ServerAuthenticate::onReadyRead();
+ }
+ else
+ {
+ buf_size += sock->readData(buf + buf_size,ba);
+ if (buf_size >= 96)
+ handleYA();
+ }
+ break;
+ case WAITING_FOR_REQ1:
+ if (buf_size + ba > MAX_SEA_BUF_SIZE)
+ ba = MAX_SEA_BUF_SIZE - buf_size;
+
+ buf_size += sock->readData(buf + buf_size,ba);
+ findReq1();
+ break;
+ case FOUND_REQ1:
+ if (buf_size + ba > MAX_SEA_BUF_SIZE)
+ ba = MAX_SEA_BUF_SIZE - buf_size;
+
+ buf_size += sock->readData(buf + buf_size,ba);
+ calculateSKey();
+ break;
+ case FOUND_INFO_HASH:
+ if (buf_size + ba > MAX_SEA_BUF_SIZE)
+ ba = MAX_SEA_BUF_SIZE - buf_size;
+
+ buf_size += sock->readData(buf + buf_size,ba);
+ processVC();
+ break;
+ case WAIT_FOR_PAD_C:
+ if (buf_size + ba > MAX_SEA_BUF_SIZE)
+ ba = MAX_SEA_BUF_SIZE - buf_size;
+
+ buf_size += sock->readData(buf + buf_size,ba);
+ handlePadC();
+ break;
+ case WAIT_FOR_IA:
+ if (buf_size + ba > MAX_SEA_BUF_SIZE)
+ ba = MAX_SEA_BUF_SIZE - buf_size;
+
+ buf_size += sock->readData(buf + buf_size,ba);
+ handleIA();
+ break;
+ case NON_ENCRYPTED_HANDSHAKE:
+ ServerAuthenticate::onReadyRead();
+ break;
+ }
+ }
+
+
+}
+#include "encryptedserverauthenticate.moc"
diff --git a/libktorrent/mse/encryptedserverauthenticate.h b/libktorrent/mse/encryptedserverauthenticate.h
new file mode 100644
index 0000000..3c358cd
--- /dev/null
+++ b/libktorrent/mse/encryptedserverauthenticate.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 MSEENCRYPTEDSERVERAUTHENTICATE_H
+#define MSEENCRYPTEDSERVERAUTHENTICATE_H
+
+#include <util/sha1hash.h>
+#include <torrent/serverauthenticate.h>
+#include "bigint.h"
+
+namespace mse
+{
+ class RC4Encryptor;
+
+
+ const Uint32 MAX_SEA_BUF_SIZE = 608 + 20 + 20 + 8 + 4 + 2 + 512 + 2 + 68;
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class EncryptedServerAuthenticate : public bt::ServerAuthenticate
+ {
+ Q_OBJECT
+ public:
+ EncryptedServerAuthenticate(mse::StreamSocket* sock, bt::Server* server);
+ virtual ~EncryptedServerAuthenticate();
+
+ private slots:
+ virtual void onReadyRead();
+
+ private:
+ void handleYA();
+ void sendYB();
+ void findReq1();
+ void calculateSKey();
+ void processVC();
+ void handlePadC();
+ void handleIA();
+
+ private:
+ enum State
+ {
+ WAITING_FOR_YA,
+ WAITING_FOR_REQ1,
+ FOUND_REQ1,
+ FOUND_INFO_HASH,
+ WAIT_FOR_PAD_C,
+ WAIT_FOR_IA,
+ NON_ENCRYPTED_HANDSHAKE
+ };
+ BigInt xb,yb,s,ya;
+ bt::SHA1Hash skey,info_hash;
+ State state;
+ Uint8 buf[MAX_SEA_BUF_SIZE];
+ Uint32 buf_size;
+ Uint32 req1_off;
+ Uint32 crypto_provide,crypto_select;
+ Uint16 pad_C_len;
+ Uint16 ia_len;
+ RC4Encryptor* our_rc4;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/mse/functions.cpp b/libktorrent/mse/functions.cpp
new file mode 100644
index 0000000..bb19b93
--- /dev/null
+++ b/libktorrent/mse/functions.cpp
@@ -0,0 +1,74 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <torrent/globals.h>
+#include <util/sha1hash.h>
+#include "functions.h"
+#include "bigint.h"
+
+using namespace bt;
+
+namespace mse
+{
+ /*
+ static const BigInt P = BigInt(
+ "0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD"
+ "129024E088A67CC74020BBEA63B139B22514A08798E3404"
+ "DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C"
+ "245E485B576625E7EC6F44C42E9A63A36210000000000090563");
+ */
+ static const BigInt P = BigInt("0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A63A36210000000000090563");
+
+ void GeneratePublicPrivateKey(BigInt & priv,BigInt & pub)
+ {
+ BigInt G = BigInt("0x02");
+ priv = BigInt::random();
+ pub = BigInt::powerMod(G,priv,P);
+ }
+
+ BigInt DHSecret(const BigInt & our_priv,const BigInt & peer_pub)
+ {
+ return BigInt::powerMod(peer_pub,our_priv,P);
+ }
+
+ bt::SHA1Hash EncryptionKey(bool a,const BigInt & s,const bt::SHA1Hash & skey)
+ {
+ Uint8 buf[120];
+ memcpy(buf,"key",3);
+ buf[3] = (Uint8)(a ? 'A' : 'B');
+ s.toBuffer(buf + 4,96);
+ memcpy(buf + 100,skey.getData(),20);
+ return bt::SHA1Hash::generate(buf,120);
+ }
+
+ void DumpBigInt(const QString & name,const BigInt & bi)
+ {
+ static Uint8 buf[512];
+ Uint32 nb = bi.toBuffer(buf,512);
+ bt::Log & lg = Out();
+ lg << name << " (" << nb << ") = ";
+ for (Uint32 i = 0;i < nb;i++)
+ {
+ lg << QString("0x%1 ").arg(buf[i],0,16);
+ }
+ lg << endl;
+ }
+
+}
diff --git a/libktorrent/mse/functions.h b/libktorrent/mse/functions.h
new file mode 100644
index 0000000..4be1667
--- /dev/null
+++ b/libktorrent/mse/functions.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 MSEFUNCTIONS_H
+#define MSEFUNCTIONS_H
+
+namespace bt
+{
+ class SHA1Hash;
+}
+
+namespace mse
+{
+ class BigInt;
+
+ void GeneratePublicPrivateKey(BigInt & pub,BigInt & priv);
+ BigInt DHSecret(const BigInt & our_priv,const BigInt & peer_pub);
+ bt::SHA1Hash EncryptionKey(bool a,const BigInt & s,const bt::SHA1Hash & skey);
+
+ void DumpBigInt(const QString & name,const BigInt & bi);
+}
+
+#endif
diff --git a/libktorrent/mse/rc4encryptor.cpp b/libktorrent/mse/rc4encryptor.cpp
new file mode 100644
index 0000000..422fe5d
--- /dev/null
+++ b/libktorrent/mse/rc4encryptor.cpp
@@ -0,0 +1,100 @@
+ /***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "rc4encryptor.h"
+
+namespace mse
+{
+ static void swap(Uint8 & a,Uint8 & b)
+ {
+ Uint8 tmp = a;
+ a = b;
+ b = tmp;
+ }
+
+ static Uint8 rc4_enc_buffer[bt::MAX_MSGLEN];
+
+ RC4::RC4(const Uint8* key,Uint32 size) : i(0),j(0)
+ {
+ // initialize state
+ for (Uint32 t = 0;t < 256;t++)
+ s[t] = t;
+
+ j = 0;
+ for (Uint32 t=0;t < 256;t++)
+ {
+ j = (j + s[t] + key[t % size]) & 0xff;
+ swap(s[t],s[j]);
+ }
+
+ i = j = 0;
+ }
+
+ RC4::~RC4()
+ {
+ }
+
+ void RC4::process(const Uint8* in,Uint8* out,Uint32 size)
+ {
+ for (Uint32 k = 0;k < size;k++)
+ {
+ out[k] = process(in[k]);
+ }
+ }
+
+ Uint8 RC4::process(Uint8 b)
+ {
+ i = (i + 1) & 0xff;
+ j = (j + s[i]) & 0xff;
+ swap(s[i],s[j]);
+ Uint8 tmp = s[ (s[i] + s[j]) & 0xff];
+ return tmp ^ b;
+ }
+
+
+ RC4Encryptor::RC4Encryptor(const bt::SHA1Hash & dk,const bt::SHA1Hash & ek)
+ : enc(ek.getData(),20),dec(dk.getData(),20)
+ {
+ Uint8 tmp[1024];
+ enc.process(tmp,tmp,1024);
+ dec.process(tmp,tmp,1024);
+ }
+
+
+ RC4Encryptor::~RC4Encryptor()
+ {}
+
+
+ void RC4Encryptor::decrypt(Uint8* data,Uint32 len)
+ {
+ dec.process(data,data,len);
+ }
+
+ const Uint8* RC4Encryptor::encrypt(const Uint8* data,Uint32 len)
+ {
+ enc.process(data,rc4_enc_buffer,len);
+ return rc4_enc_buffer;
+ }
+
+ void RC4Encryptor::encryptReplace(Uint8* data,Uint32 len)
+ {
+ enc.process(data,data,len);
+ }
+
+}
diff --git a/libktorrent/mse/rc4encryptor.h b/libktorrent/mse/rc4encryptor.h
new file mode 100644
index 0000000..650b54e
--- /dev/null
+++ b/libktorrent/mse/rc4encryptor.h
@@ -0,0 +1,96 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 MSERC4ENCRYPTOR_H
+#define MSERC4ENCRYPTOR_H
+
+#include <util/sha1hash.h>
+#include <util/constants.h>
+
+using bt::Uint8;
+using bt::Uint32;
+
+namespace mse
+{
+ /**
+ * Helper class to do the actual encryption / decryption
+ */
+ class RC4
+ {
+ Uint8 i,j;
+ Uint8 s[256];
+ public:
+ RC4(const Uint8* key,Uint32 size);
+ virtual ~RC4();
+
+ void process(const Uint8* in,Uint8* out,Uint32 size);
+ Uint8 process(Uint8 b);
+ };
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * RC4 encryptor. Uses the RC4 algorithm to encrypt and decrypt data.
+ * This class has a static encryption buffer, which makes it not thread safe
+ * because the buffer is not protected by mutexes.
+ */
+ class RC4Encryptor
+ {
+ RC4 enc,dec;
+ public:
+ RC4Encryptor(const bt::SHA1Hash & dkey,const bt::SHA1Hash & ekey);
+ virtual ~RC4Encryptor();
+
+ /**
+ * Decrypt some data, decryption happens in place (original data gets overwritten)
+ * @param data The data
+ * @param len Size of the data
+ */
+ void decrypt(Uint8* data,Uint32 len);
+
+ /**
+ * Encrypt the data. Encryption happens into the static buffer.
+ * So that the data passed to this function is never overwritten.
+ * If we send pieces we point directly to the mmap region of data,
+ * this cannot be overwritten, hence the static buffer.
+ * @param data The data
+ * @param len The length of the data
+ * @return Pointer to the static buffer
+ */
+ const Uint8* encrypt(const Uint8* data,Uint32 len);
+
+ /**
+ * Encrypt data, encryption will happen in the same buffer. So data will
+ * be changed replaced by it's encrypted version.
+ * @param data The data to encrypt
+ * @param len The length of the data
+ */
+ void encryptReplace(Uint8* data,Uint32 len);
+
+ /**
+ * Encrypts one byte.
+ * @param b The byte to encrypt
+ * @return The encrypted byte
+ */
+ Uint8 encrypt(Uint8 b) {return enc.process(b);}
+ };
+
+}
+
+#endif
diff --git a/libktorrent/mse/streamsocket.cpp b/libktorrent/mse/streamsocket.cpp
new file mode 100644
index 0000000..19a0a2e
--- /dev/null
+++ b/libktorrent/mse/streamsocket.cpp
@@ -0,0 +1,326 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <errno.h>
+#include <qsocket.h>
+#include <qsocketdevice.h>
+#include <util/sha1hash.h>
+#include <util/log.h>
+#include <torrent/peer.h>
+#include <torrent/globals.h>
+#include <torrent/authenticatebase.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#include <net/socketmonitor.h>
+#include "streamsocket.h"
+#include "rc4encryptor.h"
+
+using namespace bt;
+using namespace net;
+
+namespace mse
+{
+
+ Uint8 StreamSocket::tos = IPTOS_THROUGHPUT;
+ Uint32 StreamSocket::num_connecting = 0;
+ Uint32 StreamSocket::max_connecting = 50;
+
+ StreamSocket::StreamSocket() : sock(0),enc(0),monitored(false)
+ {
+ sock = new BufferedSocket(true);
+ sock->setNonBlocking();
+ reinserted_data = 0;
+ reinserted_data_size = 0;
+ reinserted_data_read = 0;
+
+ }
+
+ StreamSocket::StreamSocket(int fd) : sock(0),enc(0),monitored(false)
+ {
+ sock = new BufferedSocket(fd);
+ sock->setNonBlocking();
+ reinserted_data = 0;
+ reinserted_data_size = 0;
+ reinserted_data_read = 0;
+ sock->setTOS(tos);
+ }
+
+ StreamSocket::~StreamSocket()
+ {
+ // make sure the number of connecting sockets is updated
+ if (connecting() && num_connecting > 0)
+ num_connecting--;
+
+ SocketMonitor::instance().remove(sock);
+ delete [] reinserted_data;
+ delete enc;
+ delete sock;
+ }
+
+ void StreamSocket::startMonitoring(net::SocketReader* rdr,net::SocketWriter* wrt)
+ {
+ this->rdr = rdr;
+ this->wrt = wrt;
+ sock->setReader(this);
+ sock->setWriter(this);
+ SocketMonitor::instance().add(sock);
+ monitored = true;
+ if (reinserted_data)
+ {
+ if (enc)
+ enc->decrypt(reinserted_data + reinserted_data_read,
+ reinserted_data_size - reinserted_data_read);
+
+ rdr->onDataReady(reinserted_data + reinserted_data_read,
+ reinserted_data_size - reinserted_data_read);
+ delete [] reinserted_data;
+ reinserted_data = 0;
+ reinserted_data_size = 0;
+ }
+ }
+
+
+ Uint32 StreamSocket::sendData(const Uint8* data,Uint32 len)
+ {
+ if (enc)
+ {
+ // we need to make sure all data is sent because of the encryption
+ Uint32 ds = 0;
+ const Uint8* ed = enc->encrypt(data,len);
+ while (sock->ok() && ds < len)
+ {
+ Uint32 ret = sock->send(ed + ds,len - ds);
+ ds += ret;
+ if (ret == 0)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "ret = 0" << endl;
+ }
+ }
+ if (ds != len)
+ Out() << "ds != len" << endl;
+ return ds;
+ }
+ else
+ {
+ Uint32 ret = sock->send(data,len);
+ if (ret != len)
+ Out() << "ret != len" << endl;
+ return ret;
+ }
+ }
+
+ Uint32 StreamSocket::readData(Uint8* buf,Uint32 len)
+ {
+ Uint32 ret2 = 0;
+ if (reinserted_data)
+ {
+ Uint32 tr = reinserted_data_size - reinserted_data_read;
+ if (tr < len)
+ {
+ memcpy(buf,reinserted_data + reinserted_data_read,tr);
+ delete [] reinserted_data;
+ reinserted_data = 0;
+ reinserted_data_size = reinserted_data_read = 0;
+ ret2 = tr;
+ if (enc)
+ enc->decrypt(buf,tr);
+ }
+ else
+ {
+ tr = len;
+ memcpy(buf,reinserted_data + reinserted_data_read,tr);
+ reinserted_data_read += tr;
+ if (enc)
+ enc->decrypt(buf,tr);
+ return tr;
+ }
+ }
+
+ if (len == ret2)
+ return ret2;
+
+ Uint32 ret = sock->recv(buf + ret2,len - ret2);
+ if (ret + ret2 > 0 && enc)
+ enc->decrypt(buf,ret + ret2);
+
+ return ret;
+ }
+
+ Uint32 StreamSocket::bytesAvailable() const
+ {
+ Uint32 ba = sock->bytesAvailable();
+ if (reinserted_data_size - reinserted_data_read > 0)
+ return ba + (reinserted_data_size - reinserted_data_read);
+ else
+ return ba;
+ }
+
+ void StreamSocket::close()
+ {
+ sock->close();
+ }
+
+ bool StreamSocket::connectTo(const QString & ip,Uint16 port)
+ {
+ // do a safety check
+ if (ip.isNull() || ip.length() == 0)
+ return false;
+
+ // we don't wanna block the current thread so set non blocking
+ sock->setNonBlocking();
+ if (sock->connectTo(Address(ip,port)))
+ {
+ sock->setTOS(tos);
+ return true;
+ }
+ else if (connecting())
+ {
+ num_connecting++;
+ }
+
+ return false;
+ }
+
+ void StreamSocket::initCrypt(const bt::SHA1Hash & dkey,const bt::SHA1Hash & ekey)
+ {
+ if (enc)
+ delete enc;
+
+ enc = new RC4Encryptor(dkey,ekey);
+ }
+
+ void StreamSocket::disableCrypt()
+ {
+ delete enc;
+ enc = 0;
+ }
+
+ bool StreamSocket::ok() const
+ {
+ return sock->ok();
+ }
+
+ QString StreamSocket::getRemoteIPAddress() const
+ {
+ return sock->getPeerName().toString();
+ }
+
+ bt::Uint16 StreamSocket::getRemotePort() const
+ {
+ return sock->getPeerName().port();
+ }
+
+ net::Address StreamSocket::getRemoteAddress() const
+ {
+ return sock->getPeerName();
+ }
+
+ void StreamSocket::setRC4Encryptor(RC4Encryptor* e)
+ {
+ if (enc)
+ delete enc;
+
+ enc = e;
+ }
+
+ void StreamSocket::reinsert(const Uint8* d,Uint32 size)
+ {
+// Out() << "Reinsert : " << size << endl;
+ Uint32 off = 0;
+ if (reinserted_data)
+ {
+ off = reinserted_data_size;
+ reinserted_data = (Uint8*)realloc(reinserted_data,reinserted_data_size + size);
+ reinserted_data_size += size;
+ }
+ else
+ {
+ reinserted_data = new Uint8[size];
+ reinserted_data_size = size;
+ }
+ memcpy(reinserted_data + off,d,size);
+ }
+
+ bool StreamSocket::connecting() const
+ {
+ return sock->state() == net::Socket::CONNECTING;
+ }
+
+ void StreamSocket::onDataReady(Uint8* buf,Uint32 size)
+ {
+ if (enc)
+ enc->decrypt(buf,size);
+
+ if (rdr)
+ rdr->onDataReady(buf,size);
+ }
+
+ Uint32 StreamSocket::onReadyToWrite(Uint8* data,Uint32 max_to_write)
+ {
+ if (!wrt)
+ return 0;
+
+ Uint32 ret = wrt->onReadyToWrite(data,max_to_write);
+ if (enc && ret > 0) // do encryption if necessary
+ enc->encryptReplace(data,ret);
+
+
+ return ret;
+ }
+
+ bool StreamSocket::hasBytesToWrite() const
+ {
+ return wrt ? wrt->hasBytesToWrite() : false;
+ }
+
+ float StreamSocket::getDownloadRate() const
+ {
+ return sock ? sock->getDownloadRate() : 0.0f;
+ }
+
+ float StreamSocket::getUploadRate() const
+ {
+ return sock ? sock->getUploadRate() : 0.0f;
+ }
+
+ bool StreamSocket::connectSuccesFull() const
+ {
+ bool ret = sock->connectSuccesFull();
+ if (ret)
+ sock->setTOS(tos);
+
+ if (num_connecting > 0)
+ num_connecting--;
+
+ return ret;
+ }
+
+ void StreamSocket::setGroupIDs(Uint32 up,Uint32 down)
+ {
+ sock->setGroupID(up,true);
+ sock->setGroupID(down,false);
+ }
+}
+
+#include "streamsocket.moc"
diff --git a/libktorrent/mse/streamsocket.h b/libktorrent/mse/streamsocket.h
new file mode 100644
index 0000000..5006a7b
--- /dev/null
+++ b/libktorrent/mse/streamsocket.h
@@ -0,0 +1,185 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 MSESTREAMSOCKET_H
+#define MSESTREAMSOCKET_H
+
+#include <qobject.h>
+#include <util/constants.h>
+#include <net/bufferedsocket.h>
+
+class QString;
+
+using bt::Uint8;
+using bt::Uint16;
+using bt::Uint32;
+
+namespace bt
+{
+ class SHA1Hash;
+ class Peer;
+ class AuthenticateBase;
+}
+
+namespace mse
+{
+ class RC4Encryptor;
+
+
+
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Wrapper around a TCP socket which handles RC4 encryption.
+ * Once authentication is done, the sendData and readData interfaces should
+ * not be used anymore, a SocketReader and SocketWriter should be provided,
+ * so that reading and writing is controlled from the monitor thread.
+ */
+ class StreamSocket : public QObject,public net::SocketReader,public net::SocketWriter
+ {
+ Q_OBJECT
+ public:
+ StreamSocket();
+ StreamSocket(int fd);
+ virtual ~StreamSocket();
+
+ /**
+ * Send a chunk of data. (Does not encrypt the data)
+ * @param data The data
+ * @param len The length
+ * @return Number of bytes written
+ */
+ Uint32 sendData(const Uint8* data,Uint32 len);
+
+ /**
+ * Reads data from the peer.
+ * @param buf The buffer to store the data
+ * @param len The maximum number of bytes to read
+ * @return The number of bytes read
+ */
+ Uint32 readData(Uint8* buf,Uint32 len);
+
+ /// Get the number of bytes available to read.
+ Uint32 bytesAvailable() const;
+
+ /// Are we using encryption
+ bool encrypted() const {return enc != 0;}
+
+ /**
+ * Initialize the RC4 encryption algorithm.
+ * @param dkey
+ * @param ekey
+ */
+ void initCrypt(const bt::SHA1Hash & dkey,const bt::SHA1Hash & ekey);
+
+ /// Set the encryptor
+ void setRC4Encryptor(RC4Encryptor* enc);
+
+ /// Disables encryption. All data will be sent over as plain text.
+ void disableCrypt();
+
+ /// Close the socket
+ void close();
+
+ /// Connect the socket to a remote host
+ bool connectTo(const QString & ip,Uint16 port);
+
+ /// Get the IP address of the remote peer
+ QString getRemoteIPAddress() const;
+
+ /// Get the port of the remote peer
+ bt::Uint16 getRemotePort() const;
+
+ /// Get the full address
+ net::Address getRemoteAddress() const;
+
+ /**
+ * Reinsert data, this is needed when we read to much during the crypto handshake.
+ * This data will be the first to read out. The data will be copied to a temporary buffer
+ * which will be destroyed when the reinserted data has been read.
+ */
+ void reinsert(const Uint8* d,Uint32 size);
+
+ /// see if the socket is still OK
+ bool ok() const;
+
+ /// Get the file descriptor
+ int fd() const {return sock->fd();}
+
+ /// Start monitoring of this socket by the monitor thread
+ void startMonitoring(net::SocketReader* rdr,net::SocketWriter* wrt);
+
+ /// Is this socket connecting to a remote host
+ bool connecting() const;
+
+ /// See if a connect was success full
+ bool connectSuccesFull() const;
+
+ /// Get the current download rate
+ float getDownloadRate() const;
+
+ /// Get the current download rate
+ float getUploadRate() const;
+
+ /**
+ * Set the TOS byte for new sockets.
+ * @param t TOS value
+ */
+ static void setTOS(Uint8 t) {tos = t;}
+
+ /**
+ * Set the download and upload group ID's
+ * @param up Upload group ID
+ * @param down Download group ID
+ */
+ void setGroupIDs(Uint32 up,Uint32 down);
+
+ /**
+ * Check if we are allowed to initiate another outgoing connection.
+ */
+ static bool canInitiateNewConnection() {return num_connecting < max_connecting;}
+
+ /**
+ * Set the maximum number of connecting sockets we are allowed to have.
+ */
+ static void setMaxConnecting(Uint32 mc) {max_connecting = mc;}
+ private:
+ virtual void onDataReady(Uint8* buf,Uint32 size);
+ virtual Uint32 onReadyToWrite(Uint8* data,Uint32 max_to_write);
+ virtual bool hasBytesToWrite() const;
+
+ private:
+ net::BufferedSocket* sock;
+ RC4Encryptor* enc;
+ Uint8* reinserted_data;
+ Uint32 reinserted_data_size;
+ Uint32 reinserted_data_read;
+ bool monitored;
+ net::SocketReader* rdr;
+ net::SocketWriter* wrt;
+
+ static Uint8 tos;
+ static Uint32 num_connecting; // the number of connections we have in SYN_SENT state
+ static Uint32 max_connecting;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/Makefile.am b/libktorrent/net/Makefile.am
new file mode 100644
index 0000000..e67354c
--- /dev/null
+++ b/libktorrent/net/Makefile.am
@@ -0,0 +1,10 @@
+INCLUDES = -I$(srcdir)/.. -I$(srcdir)/. $(all_includes)
+METASOURCES = AUTO
+libnet_la_LDFLAGS = $(all_libraries)
+noinst_LTLIBRARIES = libnet.la
+noinst_HEADERS = address.h bufferedsocket.h circularbuffer.h downloadthread.h \
+ networkthread.h portlist.h socket.h socketmonitor.h speed.h uploadthread.h
+libnet_la_SOURCES = address.cpp bufferedsocket.cpp circularbuffer.cpp \
+ downloadthread.cpp networkthread.cpp portlist.cpp socket.cpp socketgroup.cpp \
+ socketmonitor.cpp speed.cpp uploadthread.cpp
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/net/address.cpp b/libktorrent/net/address.cpp
new file mode 100644
index 0000000..4a4da3c
--- /dev/null
+++ b/libktorrent/net/address.cpp
@@ -0,0 +1,67 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include "address.h"
+
+namespace net
+{
+
+ Address::Address() : m_ip(0),m_port(0) {}
+
+ Address::Address(const QString & host,Uint16 port) : m_ip(0),m_port(port)
+ {
+ struct in_addr a;
+ if (inet_aton(host.ascii(),&a))
+ m_ip = ntohl(a.s_addr);
+ }
+
+ Address::Address(const Address & addr) : m_ip(addr.ip()),m_port(addr.port())
+ {
+ }
+
+ Address:: ~Address()
+ {}
+
+
+ Address & Address::operator = (const Address & a)
+ {
+ m_ip = a.ip();
+ m_port = a.port();
+ return *this;
+ }
+
+
+ bool Address::operator == (const Address & a)
+ {
+ return m_ip == a.ip() && m_port == a.port();
+ }
+
+ QString Address::toString() const
+ {
+ return QString("%1.%2.%3.%4")
+ .arg((m_ip & 0xFF000000) >> 24)
+ .arg((m_ip & 0x00FF0000) >> 16)
+ .arg((m_ip & 0x0000FF00) >> 8)
+ .arg(m_ip & 0x000000FF);
+ }
+
+}
diff --git a/libktorrent/net/address.h b/libktorrent/net/address.h
new file mode 100644
index 0000000..28c4e2c
--- /dev/null
+++ b/libktorrent/net/address.h
@@ -0,0 +1,60 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETADDRESS_H
+#define NETADDRESS_H
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace net
+{
+ using bt::Uint32;
+ using bt::Uint16;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class Address
+ {
+ Uint32 m_ip;
+ Uint16 m_port;
+ public:
+ Address();
+ Address(const QString & host,Uint16 port);
+ Address(const Address & addr);
+ virtual ~Address();
+
+
+ Address & operator = (const Address & a);
+ bool operator == (const Address & a);
+
+ Uint32 ip() const {return m_ip;}
+ void setIP(Uint32 ip) {m_ip = ip;}
+
+ Uint16 port() const {return m_port;}
+ void setPort(Uint16 p) {m_port = p;}
+
+ QString toString() const;
+
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/bufferedsocket.cpp b/libktorrent/net/bufferedsocket.cpp
new file mode 100644
index 0000000..2165f70
--- /dev/null
+++ b/libktorrent/net/bufferedsocket.cpp
@@ -0,0 +1,217 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <torrent/globals.h>
+#include "bufferedsocket.h"
+#include "circularbuffer.h"
+#include "speed.h"
+
+using namespace bt;
+
+namespace net
+{
+#define OUTPUT_BUFFER_SIZE 16393
+
+ BufferedSocket::BufferedSocket(int fd) : Socket(fd),rdr(0),wrt(0),up_gid(0),down_gid(0)
+ {
+ bytes_in_output_buffer = 0;
+ bytes_sent = 0;
+ down_speed = new Speed();
+ up_speed = new Speed();
+ output_buffer = new Uint8[OUTPUT_BUFFER_SIZE];
+ poll_index = -1;
+ }
+
+ BufferedSocket::BufferedSocket(bool tcp) : Socket(tcp),rdr(0),wrt(0),up_gid(0),down_gid(0)
+ {
+ bytes_in_output_buffer = 0;
+ bytes_sent = 0;
+ down_speed = new Speed();
+ up_speed = new Speed();
+ output_buffer = new Uint8[OUTPUT_BUFFER_SIZE];
+ poll_index = -1;
+ }
+
+
+ BufferedSocket::~BufferedSocket()
+ {
+ delete [] output_buffer;
+ delete up_speed;
+ delete down_speed;
+ }
+
+ void BufferedSocket::setGroupID(Uint32 gid,bool upload)
+ {
+ if (upload)
+ up_gid = gid;
+ else
+ down_gid = gid;
+ }
+
+ float BufferedSocket::getDownloadRate() const
+ {
+ mutex.lock();
+ float ret = down_speed->getRate();
+ mutex.unlock();
+ return ret;
+ }
+
+ float BufferedSocket::getUploadRate() const
+ {
+ mutex.lock();
+ float ret = up_speed->getRate();
+ mutex.unlock();
+ return ret;
+ }
+
+ static Uint8 input_buffer[OUTPUT_BUFFER_SIZE];
+
+ Uint32 BufferedSocket::readBuffered(Uint32 max_bytes_to_read,bt::TimeStamp now)
+ {
+ Uint32 br = 0;
+ bool no_limit = (max_bytes_to_read == 0);
+
+ if (bytesAvailable() == 0)
+ {
+ close();
+ return 0;
+ }
+
+ while ((br < max_bytes_to_read || no_limit) && bytesAvailable() > 0)
+ {
+ Uint32 tr = bytesAvailable();
+ if (tr > OUTPUT_BUFFER_SIZE)
+ tr = OUTPUT_BUFFER_SIZE;
+ if (!no_limit && tr + br > max_bytes_to_read)
+ tr = max_bytes_to_read - br;
+
+ int ret = Socket::recv(input_buffer,tr);
+ if (ret != 0)
+ {
+ mutex.lock();
+ down_speed->onData(ret,now);
+ mutex.unlock();
+ if (rdr)
+ rdr->onDataReady(input_buffer,ret);
+ br += ret;
+ }
+ else
+ {
+ // connection closed, so just return the number of bytes read
+ return br;
+ }
+ }
+ return br;
+ }
+
+ Uint32 BufferedSocket::sendOutputBuffer(Uint32 max,bt::TimeStamp now)
+ {
+ if (bytes_in_output_buffer == 0)
+ return 0;
+
+ if (max == 0 || bytes_in_output_buffer <= max)
+ {
+ // try to send everything
+ Uint32 bw = bytes_in_output_buffer;
+ Uint32 off = bytes_sent;
+ Uint32 ret = Socket::send(output_buffer + off,bw);
+ if (ret > 0)
+ {
+ mutex.lock();
+ up_speed->onData(ret,now);
+ mutex.unlock();
+ bytes_in_output_buffer -= ret;
+ bytes_sent += ret;
+ if (bytes_sent == bytes_in_output_buffer)
+ bytes_in_output_buffer = bytes_sent = 0;
+ return ret;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ Uint32 bw = max;
+ Uint32 off = bytes_sent;
+ Uint32 ret = Socket::send(output_buffer + off,bw);
+ if (ret > 0)
+ {
+ mutex.lock();
+ up_speed->onData(ret,now);
+ mutex.unlock();
+ bytes_in_output_buffer -= ret;
+ bytes_sent += ret;
+ return ret;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+
+ Uint32 BufferedSocket::writeBuffered(Uint32 max,bt::TimeStamp now)
+ {
+ if (!wrt)
+ return 0;
+
+ Uint32 bw = 0;
+ bool no_limit = max == 0;
+ if (bytes_in_output_buffer > 0)
+ {
+ Uint32 ret = sendOutputBuffer(max,now);
+ if (bytes_in_output_buffer > 0)
+ {
+ // haven't sent it fully so return
+ return ret;
+ }
+
+ bw += ret;
+ }
+
+ // run as long as we do not hit the limit and we can send everything
+ while ((no_limit || bw < max) && bytes_in_output_buffer == 0)
+ {
+ // fill output buffer
+ bytes_in_output_buffer = wrt->onReadyToWrite(output_buffer,OUTPUT_BUFFER_SIZE);
+ bytes_sent = 0;
+ if (bytes_in_output_buffer > 0)
+ {
+ // try to send
+ bw += sendOutputBuffer(max - bw,now);
+ }
+ else
+ {
+ // no bytes available in output buffer so break
+ break;
+ }
+ }
+
+ return bw;
+ }
+
+ void BufferedSocket::updateSpeeds(bt::TimeStamp now)
+ {
+ up_speed->update(now);
+ down_speed->update(now);
+ }
+}
diff --git a/libktorrent/net/bufferedsocket.h b/libktorrent/net/bufferedsocket.h
new file mode 100644
index 0000000..2c0c3ec
--- /dev/null
+++ b/libktorrent/net/bufferedsocket.h
@@ -0,0 +1,150 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETBUFFEREDSOCKET_H
+#define NETBUFFEREDSOCKET_H
+
+#include <qmutex.h>
+#include <net/socket.h>
+
+namespace net
+{
+ using bt::Uint8;
+ using bt::Uint32;
+
+ class Speed;
+
+ class SocketReader
+ {
+ public:
+ SocketReader() {}
+ virtual ~SocketReader() {}
+
+ /**
+ * Function which will be called whenever data has been read from the socket.
+ * This data should be dealt with, otherwise it will be discarded.
+ * @param buf The buffer
+ * @param size The size of the buffer
+ */
+ virtual void onDataReady(Uint8* buf,Uint32 size) = 0;
+ };
+
+ class SocketWriter
+ {
+ public:
+ SocketWriter() {}
+ virtual ~SocketWriter() {}
+
+ /**
+ * The socket is ready to write, the writer is asked to provide the data.
+ * The data will be fully sent, before another request is done.
+ * @param data The data
+ * @param max_to_write The maximum number of bytes to put in the buffer
+ * @param The number of bytes placed in the buffer
+ */
+ virtual Uint32 onReadyToWrite(Uint8* data,Uint32 max_to_write) = 0;
+
+ /// Check if data is ready to write
+ virtual bool hasBytesToWrite() const = 0;
+
+ };
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Extends the Socket class with
+ */
+ class BufferedSocket : public Socket
+ {
+ mutable QMutex mutex;
+ SocketReader* rdr;
+ SocketWriter* wrt;
+ Uint8* output_buffer;
+ Uint32 bytes_in_output_buffer; // bytes in the output buffer
+ Uint32 bytes_sent; // bytes written of the output buffer
+ Speed* down_speed;
+ Speed* up_speed;
+ int poll_index;
+
+ Uint32 up_gid;
+ Uint32 down_gid; // group id which this torrent belongs to, group 0 means the default group
+
+ public:
+ BufferedSocket(int fd);
+ BufferedSocket(bool tcp);
+ virtual ~BufferedSocket();
+
+ /**
+ * Set the group ID of the socket
+ * @param gid THe ID (0 is default group)
+ * @param upload Wether this is an upload group or a download group
+ */
+ void setGroupID(Uint32 gid,bool upload);
+
+ /// Get the download group ID
+ Uint32 downloadGroupID() const {return down_gid;}
+
+ /// Get the upload group ID
+ Uint32 uploadGroupID() const {return up_gid;}
+
+ void setReader(SocketReader* r) {rdr = r;}
+ void setWriter(SocketWriter* r) {wrt = r;}
+
+ /**
+ * Reads data from the socket to the buffer.
+ * @param max_bytes_to_read Maximum number of bytes to read (0 is no limit)
+ * @param now Current time stamp
+ * @return The number of bytes read
+ */
+ Uint32 readBuffered(Uint32 max_bytes_to_read,bt::TimeStamp now);
+
+ /**
+ * Writes data from the buffer to the socket.
+ * @param max The maximum number of bytes to send over the socket (0 = no limit)
+ * * @param now Current time stamp
+ * @return The number of bytes written
+ */
+ Uint32 writeBuffered(Uint32 max,bt::TimeStamp now);
+
+ /// See if the socket has something ready to write
+ bool bytesReadyToWrite() const
+ {
+ return bytes_in_output_buffer > 0 || (!wrt ? false : wrt->hasBytesToWrite());
+ }
+
+
+ /// Get the current download rate
+ float getDownloadRate() const;
+
+ /// Get the current download rate
+ float getUploadRate() const;
+
+ /// Update up and down speed
+ void updateSpeeds(bt::TimeStamp now);
+
+ int getPollIndex() const {return poll_index;}
+ void setPollIndex(int pi) {poll_index = pi;}
+
+ private:
+ Uint32 sendOutputBuffer(Uint32 max,bt::TimeStamp now);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/circularbuffer.cpp b/libktorrent/net/circularbuffer.cpp
new file mode 100644
index 0000000..abce80a
--- /dev/null
+++ b/libktorrent/net/circularbuffer.cpp
@@ -0,0 +1,146 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <torrent/globals.h>
+#include "circularbuffer.h"
+#include "bufferedsocket.h"
+
+using namespace bt;
+
+namespace net
+{
+
+ CircularBuffer::CircularBuffer(Uint32 max_size) : buf(0),max_size(max_size),first(0),size(0)
+ {
+ buf = new Uint8[max_size];
+ }
+
+
+ CircularBuffer::~CircularBuffer()
+ {
+ delete [] buf;
+ }
+
+ Uint32 CircularBuffer::freeSpace() const
+ {
+ return max_size - size;
+ }
+
+ Uint32 CircularBuffer::write(const Uint8* data,Uint32 dsize)
+ {
+ if (size == max_size)
+ return 0;
+
+ mutex.lock();
+ Uint32 wp = (first + size) % max_size;
+ Uint32 j = 0;
+ while (size < max_size && (dsize == 0 || j < dsize))
+ {
+ buf[wp] = data[j];
+ j++;
+ wp = (wp + 1) % max_size;
+ size++;
+ }
+
+ mutex.unlock();
+ return j;
+ }
+
+ Uint32 CircularBuffer::read(Uint8* data,Uint32 max_to_read)
+ {
+ if (!size)
+ return 0;
+
+ mutex.lock();
+ Uint32 j = 0;
+ while (size > 0 && j < max_to_read)
+ {
+ data[j] = buf[first];
+ j++;
+ first = (first + 1) % max_size;
+ size--;
+ }
+ mutex.unlock();
+ return j;
+ }
+
+ Uint32 CircularBuffer::send(BufferedSocket* s,Uint32 max)
+ {
+ if (!size)
+ return 0;
+
+ Uint32 ret = 0;
+ mutex.lock();
+
+ if (first + size <= max_size)
+ {
+ Uint32 ts = size;
+ if (max > 0 && size > max)
+ ts = max;
+ ret = s->send(buf + first,ts);
+ first += ret;
+ size -= ret;
+ }
+ else if (max > 0) // if there is a limit
+ {
+ // write from first to the end of the buffer
+ Uint32 to_send = max_size - first;
+ if (to_send > max)
+ to_send = max;
+
+ ret = s->send(buf + first,to_send);
+
+ // update first, wrap around if necessary
+ first = (first + ret) % max_size;
+ size -= ret; // ret bytes less in the buffer
+ max -= ret; // decrease limit
+
+ if (max > 0 && ret == to_send && size > 0)
+ {
+ // we have sent everything so we can send more
+ to_send = size > max ? max : size;
+ Uint32 ret2 = s->send(buf,to_send);
+
+ ret += ret2;
+ first += ret2;
+ size -= ret2;
+ }
+ }
+ else // no limit
+ {
+ Uint32 to_send = max_size - first;
+ ret = s->send(buf + first,to_send);
+ // update first, wrap around if necessary
+ first = (first + ret) % max_size;
+ size -= ret; // ret bytes less in the buffer
+ if (ret == to_send && size > 0)
+ {
+ // we have sent everything so we can send more
+ Uint32 ret2 = s->send(buf,size);
+ ret += ret2;
+ first += ret2;
+ size -= ret2;
+ }
+ }
+ mutex.unlock();
+ return ret;
+ }
+
+}
diff --git a/libktorrent/net/circularbuffer.h b/libktorrent/net/circularbuffer.h
new file mode 100644
index 0000000..63e271e
--- /dev/null
+++ b/libktorrent/net/circularbuffer.h
@@ -0,0 +1,89 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETCIRCULARBUFFER_H
+#define NETCIRCULARBUFFER_H
+
+#include <qmutex.h>
+#include <util/constants.h>
+
+namespace net
+{
+ using bt::Uint8;
+ using bt::Uint32;
+
+ class BufferedSocket;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Simple circular buffer, to simulate a queue.
+ * Writes happen at the end, reads at the beginning.
+ * The buffer is protected by a mutex.
+ */
+ class CircularBuffer
+ {
+ Uint8* buf;
+ Uint32 max_size;
+ Uint32 first; // index of first byte in the buffer
+ Uint32 size; // number of bytes in use
+ mutable QMutex mutex;
+ public:
+ /**
+ * Create the buffer.
+ * @param max_size Maximum size of the buffer.
+ */
+ CircularBuffer(Uint32 max_size);
+ virtual ~CircularBuffer();
+
+ /// How much capacity does the buffer have
+ Uint32 capacity() const {return max_size;}
+
+ /// How much free space is there
+ Uint32 freeSpace() const;
+
+
+ /**
+ * Write a bunch of data at the back of the buffer.
+ * @param data Data to write
+ * @param size How many bytes to write
+ * @return The number of bytes written in the buffer
+ */
+ Uint32 write(const Uint8* data,Uint32 size);
+
+ /**
+ * Read from the buffer.
+ * @param data Buffer to store read data
+ * @param max_to_read Maximum amount of bytes to read
+ * @return The number of bytes read
+ */
+ Uint32 read(Uint8* data,Uint32 max_to_read);
+
+ /**
+ * Send the data in the buffer over the socket
+ * @param s THe socket
+ * @param max Maximum bytes to send
+ * @return The number of bytes written
+ */
+ Uint32 send(BufferedSocket* s,Uint32 max);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/downloadthread.cpp b/libktorrent/net/downloadthread.cpp
new file mode 100644
index 0000000..ae0f0b9
--- /dev/null
+++ b/libktorrent/net/downloadthread.cpp
@@ -0,0 +1,137 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <sys/poll.h>
+#include <util/functions.h>
+#include "socketgroup.h"
+#include "downloadthread.h"
+#include "socketmonitor.h"
+#include "bufferedsocket.h"
+
+using namespace bt;
+
+namespace net
+{
+ Uint32 DownloadThread::dcap = 0;
+ Uint32 DownloadThread::sleep_time = 3;
+
+ DownloadThread::DownloadThread(SocketMonitor* sm) : NetworkThread(sm)
+ {
+ }
+
+
+ DownloadThread::~DownloadThread()
+ {}
+
+ void DownloadThread::update()
+ {
+ sm->lock();
+ int num = fillPollVector();
+ sm->unlock();
+
+ int timeout = 10;
+ if (poll(&fd_vec[0],num,timeout) > 0)
+ {
+ sm->lock();
+ TimeStamp now = bt::Now();
+ Uint32 num_ready = 0;
+ SocketMonitor::Itr itr = sm->begin();
+ while (itr != sm->end())
+ {
+ BufferedSocket* s = *itr;
+ int pi = s->getPollIndex();
+ if (pi >= 0 && s->ok() && fd_vec[pi].revents & POLLIN)
+ {
+ // add to the correct group
+ Uint32 gid = s->downloadGroupID();
+ SocketGroup* g = groups.find(gid);
+ if (!g)
+ g = groups.find(0);
+
+ g->add(s);
+ num_ready++;
+ }
+ itr++;
+ }
+
+ if (num_ready > 0)
+ doGroups(num_ready,now,dcap);
+ prev_run_time = now;
+ sm->unlock();
+ }
+
+ if (dcap > 0 || groups.count() > 0)
+ msleep(sleep_time);
+ }
+
+ int DownloadThread::fillPollVector()
+ {
+ TimeStamp ts = bt::Now();
+ int i = 0;
+
+ // fill the poll vector with all sockets
+ SocketMonitor::Itr itr = sm->begin();
+ while (itr != sm->end())
+ {
+ BufferedSocket* s = *itr;
+ if (s && s->ok() && s->fd() > 0)
+ {
+ if (fd_vec.size() <= i)
+ {
+ // expand pollfd vector if necessary
+ struct pollfd pfd;
+ pfd.fd = s->fd();
+ pfd.revents = 0;
+ pfd.events = POLLIN;
+ fd_vec.push_back(pfd);
+ }
+ else
+ {
+ // use existing slot
+ struct pollfd & pfd = fd_vec[i];
+ pfd.fd = s->fd();
+ pfd.revents = 0;
+ pfd.events = POLLIN;
+ }
+ s->setPollIndex(i);
+ i++;
+ s->updateSpeeds(ts);
+ }
+ else
+ {
+ s->setPollIndex(-1);
+ }
+ itr++;
+ }
+
+ return i;
+ }
+
+ void DownloadThread::setSleepTime(Uint32 stime)
+ {
+ if (stime >= 1 && stime <= 10)
+ sleep_time = stime;
+ }
+
+ bool DownloadThread::doGroup(SocketGroup* g,Uint32 & allowance,bt::TimeStamp now)
+ {
+ return g->download(allowance,now);
+ }
+}
diff --git a/libktorrent/net/downloadthread.h b/libktorrent/net/downloadthread.h
new file mode 100644
index 0000000..08e9e46
--- /dev/null
+++ b/libktorrent/net/downloadthread.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETDOWNLOADTHREAD_H
+#define NETDOWNLOADTHREAD_H
+
+#include <vector>
+#include "networkthread.h"
+
+struct pollfd;
+
+namespace net
+{
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Thread which processes incoming data
+ */
+ class DownloadThread : public NetworkThread
+ {
+ static bt::Uint32 dcap;
+ static bt::Uint32 sleep_time;
+
+ std::vector<struct pollfd> fd_vec;
+
+ public:
+ DownloadThread(SocketMonitor* sm);
+ virtual ~DownloadThread();
+
+
+ /// Set the download cap
+ static void setCap(bt::Uint32 cap) {dcap = cap;}
+
+ /// Set the sleep time when using download caps
+ static void setSleepTime(bt::Uint32 stime);
+ private:
+ int fillPollVector();
+
+ virtual void update();
+ virtual bool doGroup(SocketGroup* g,Uint32 & allowance,bt::TimeStamp now);
+
+// void processIncomingData(bt::TimeStamp now);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/networkthread.cpp b/libktorrent/net/networkthread.cpp
new file mode 100644
index 0000000..40791c9
--- /dev/null
+++ b/libktorrent/net/networkthread.cpp
@@ -0,0 +1,165 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include "socketgroup.h"
+#include "socketmonitor.h"
+#include "networkthread.h"
+
+using namespace bt;
+
+namespace net
+{
+
+ NetworkThread::NetworkThread(SocketMonitor* sm)
+ : sm(sm),running(false)
+ {
+ groups.setAutoDelete(true);
+ groups.insert(0,new SocketGroup(0));
+ }
+
+
+ NetworkThread::~NetworkThread()
+ {}
+
+ void NetworkThread::run()
+ {
+ running = true;
+ prev_run_time = bt::Now();
+ while (running)
+ update();
+ }
+
+ void NetworkThread::addGroup(Uint32 gid,Uint32 limit)
+ {
+ // if group already exists, just change the limit
+ SocketGroup* g = groups.find(gid);
+ if (g)
+ {
+ g->setLimit(limit);
+ }
+ else
+ {
+ g = new SocketGroup(limit);
+ groups.insert(gid,g);
+ }
+ }
+
+ void NetworkThread::removeGroup(Uint32 gid)
+ {
+ // make sure the 0 group is never erased
+ if (gid != 0)
+ groups.erase(gid);
+ }
+
+ void NetworkThread::setGroupLimit(Uint32 gid,Uint32 limit)
+ {
+ SocketGroup* g = groups.find(gid);
+ if (g)
+ {
+ g->setLimit(limit);
+ }
+ }
+
+ Uint32 NetworkThread::doGroupsLimited(Uint32 num_ready,bt::TimeStamp now,Uint32 & allowance)
+ {
+ Uint32 num_still_ready = 0;
+
+ // this is one pass over all the groups
+ bt::PtrMap<Uint32,SocketGroup>::iterator itr = groups.begin();
+ while (itr != groups.end() && allowance > 0)
+ {
+ SocketGroup* g = itr->second;
+ if (g->numSockets() > 0)
+ {
+ Uint32 group_allowance = (Uint32)ceil(((double)g->numSockets() / num_ready) * allowance);
+
+ // lets not do to much and make sure we don't pass 0 to the socket group (0 is unlimited)
+ if (group_allowance > allowance || group_allowance == 0)
+ group_allowance = allowance;
+
+ Uint32 ga = group_allowance;
+
+ if (!doGroup(g,ga,now))
+ g->clear(); // group is done, so clear it
+ else
+ num_still_ready += g->numSockets(); // keep track of the number of sockets which are still ready
+
+ Uint32 done = group_allowance - ga;
+ if (allowance >= done)
+ allowance -= done;
+ else
+ allowance = 0;
+ }
+ itr++;
+ }
+
+ return num_still_ready > 0;
+ }
+
+ void NetworkThread::doGroups(Uint32 num_ready,bt::TimeStamp now,bt::Uint32 limit)
+ {
+ if (limit == 0)
+ {
+ Uint32 allowance = 0;
+ bt::PtrMap<Uint32,SocketGroup>::iterator itr = groups.begin();
+ while (itr != groups.end())
+ {
+ SocketGroup* g = itr->second;
+ if (g->numSockets() > 0)
+ {
+ g->calcAllowance(now);
+ doGroup(g,allowance,now);
+ g->clear();
+ }
+ itr++;
+ }
+ }
+ else
+ {
+ // calculate group allowance for each group
+ bt::PtrMap<Uint32,SocketGroup>::iterator itr = groups.begin();
+ while (itr != groups.end())
+ {
+ SocketGroup* g = itr->second;
+ g->calcAllowance(now);
+ itr++;
+ }
+
+ Uint32 allowance = (Uint32)ceil(1.02 * limit * (now - prev_run_time) * 0.001);
+
+ while (allowance > 0 && num_ready > 0)
+ {
+ // loop until nobody is ready anymore or the allowance is up
+ num_ready = doGroupsLimited(num_ready,now,allowance);
+ }
+
+ // make sure all groups are cleared
+ itr = groups.begin();
+ while (itr != groups.end())
+ {
+ SocketGroup* g = itr->second;
+ g->clear();
+ itr++;
+ }
+ }
+ }
+}
diff --git a/libktorrent/net/networkthread.h b/libktorrent/net/networkthread.h
new file mode 100644
index 0000000..7472c15
--- /dev/null
+++ b/libktorrent/net/networkthread.h
@@ -0,0 +1,113 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETNETWORKTHREAD_H
+#define NETNETWORKTHREAD_H
+
+#include <qthread.h>
+#include <util/constants.h>
+#include <util/ptrmap.h>
+
+using bt::Uint32;
+
+namespace net
+{
+ class SocketMonitor;
+ class SocketGroup;
+ class BufferedSocket;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Base class for the 2 networking threads. Handles the socket groups.
+ */
+ class NetworkThread : public QThread
+ {
+ protected:
+ SocketMonitor* sm;
+ bool running;
+ bt::PtrMap<Uint32,SocketGroup> groups;
+ bt::TimeStamp prev_run_time;
+
+ public:
+ NetworkThread(SocketMonitor* sm);
+ virtual ~NetworkThread();
+
+
+ /**
+ * Add a new group with a given limit
+ * @param gid The group ID (cannot be 0, 0 is the default group)
+ * @param limit The limit in bytes per sec
+ */
+ void addGroup(Uint32 gid,Uint32 limit);
+
+ /**
+ * Remove a group
+ * @param gid The group ID
+ */
+ void removeGroup(Uint32 gid);
+
+ /**
+ * Set the limit for a group
+ * @param gid The group ID
+ * @param limit The limit
+ */
+ void setGroupLimit(Uint32 gid,Uint32 limit);
+
+ /**
+ * The main function of the thread
+ */
+ void run();
+
+ /**
+ * Subclasses must implement this function
+ */
+ virtual void update() = 0;
+
+ /**
+ * Do one SocketGroup
+ * @param g The group
+ * @param allowance The groups allowance
+ * @param now The current time
+ * @return true if the group can go again
+ */
+ virtual bool doGroup(SocketGroup* g,Uint32 & allowance,bt::TimeStamp now) = 0;
+
+ /// Stop before the next update
+ void stop() {running = false;}
+
+ /// Is the thread running
+ bool isRunning() const {return running;}
+
+ protected:
+ /**
+ * Go over all groups and do them
+ * @param num_ready The number of ready sockets
+ * @param now The current time
+ * @param limit The global limit in bytes per sec
+ */
+ void doGroups(Uint32 num_ready,bt::TimeStamp now,bt::Uint32 limit);
+
+ private:
+ Uint32 doGroupsLimited(Uint32 num_ready,bt::TimeStamp now,Uint32 & allowance);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/portlist.cpp b/libktorrent/net/portlist.cpp
new file mode 100644
index 0000000..56076ed
--- /dev/null
+++ b/libktorrent/net/portlist.cpp
@@ -0,0 +1,73 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "portlist.h"
+
+namespace net
+{
+ Port::Port() : number(0),proto(TCP),forward(false)
+ {
+ }
+
+ Port::Port(bt::Uint16 number,Protocol proto,bool forward)
+ : number(number),proto(proto),forward(forward)
+ {
+ }
+
+ Port::Port(const Port & p) : number(p.number),proto(p.proto),forward(p.forward)
+ {
+ }
+
+ bool Port::operator == (const Port & p) const
+ {
+ return number == p.number && proto == p.proto;
+ }
+
+ PortList::PortList() : lst(0)
+ {}
+
+
+ PortList::~PortList()
+ {}
+
+
+ void PortList::addNewPort(bt::Uint16 number,Protocol proto,bool forward)
+ {
+ Port p = Port(number,proto,forward);
+ append(p);
+ if (lst)
+ lst->portAdded(p);
+ }
+
+
+ void PortList::removePort(bt::Uint16 number,Protocol proto)
+ {
+ PortList::iterator itr = find(Port(number,proto,false));
+ if (itr == end())
+ return;
+
+ if (lst)
+ lst->portRemoved(*itr);
+
+ erase(itr);
+ }
+
+
+
+}
diff --git a/libktorrent/net/portlist.h b/libktorrent/net/portlist.h
new file mode 100644
index 0000000..af60c1c
--- /dev/null
+++ b/libktorrent/net/portlist.h
@@ -0,0 +1,103 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETPORTLIST_H
+#define NETPORTLIST_H
+
+#include <qvaluelist.h>
+#include <util/constants.h>
+
+namespace net
+{
+ enum Protocol
+ {
+ TCP,
+ UDP
+ };
+
+ struct Port
+ {
+ bt::Uint16 number;
+ Protocol proto;
+ bool forward;
+
+ Port();
+ Port(bt::Uint16 number,Protocol proto,bool forward);
+ Port(const Port & p);
+
+ bool operator == (const Port & p) const;
+ };
+
+ /**
+ * Listener class for the PortList.
+ */
+ class PortListener
+ {
+ public:
+ /**
+ * A port has been added.
+ * @param port The port
+ */
+ virtual void portAdded(const Port & port) = 0;
+
+ /**
+ * A port has been removed
+ * @param port The port
+ */
+ virtual void portRemoved(const Port & port) = 0;
+ };
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * List of ports which are currently being used.
+ *
+ */
+ class PortList : public QValueList<Port>
+ {
+ PortListener* lst;
+ public:
+ PortList();
+ virtual ~PortList();
+
+ /**
+ * When a port is in use, this function needs to be called.
+ * @param number Port number
+ * @param proto Protocol
+ * @param forward Wether or not it needs to be forwarded
+ */
+ void addNewPort(bt::Uint16 number,Protocol proto,bool forward);
+
+ /**
+ * Needs to be called when a port is not being using anymore.
+ * @param number Port number
+ * @param proto Protocol
+ */
+ void removePort(bt::Uint16 number,Protocol proto);
+
+ /**
+ * Set the port listener.
+ * @param pl Port listener
+ */
+ void setListener(PortListener* pl) {lst = pl;}
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/socket.cpp b/libktorrent/net/socket.cpp
new file mode 100644
index 0000000..b9a53f3
--- /dev/null
+++ b/libktorrent/net/socket.cpp
@@ -0,0 +1,326 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qglobal.h>
+
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+
+#if defined(Q_OS_LINUX) && !defined(__FreeBSD_kernel__)
+#include <asm/ioctls.h>
+#endif
+
+#ifdef Q_OS_SOLARIS
+#include <sys/filio.h>
+#endif
+
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include <torrent/globals.h>
+#include <util/log.h>
+#include "socket.h"
+
+using namespace bt;
+
+namespace net
+{
+
+ Socket::Socket(int fd) : m_fd(fd),m_state(IDLE)
+ {
+#if defined(Q_OS_MACX) || defined(Q_OS_DARWIN) || (defined(Q_OS_FREEBSD) && !defined(__DragonFly__) && __FreeBSD_version < 600020)
+ int val = 1;
+ if (setsockopt(m_fd,SOL_SOCKET,SO_NOSIGPIPE,&val,sizeof(int)) < 0)
+ {
+ Out(SYS_CON|LOG_NOTICE) << QString("Failed to set the NOSIGPIPE option : %1").arg(strerror(errno)) << endl;
+ }
+#endif
+ cacheAddress();
+ }
+
+ Socket::Socket(bool tcp) : m_fd(-1),m_state(IDLE)
+ {
+ int fd = socket(PF_INET,tcp ? SOCK_STREAM : SOCK_DGRAM,0);
+ if (fd < 0)
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << QString("Cannot create socket : %1").arg(strerror(errno)) << endl;
+ }
+ m_fd = fd;
+#if defined(Q_OS_MACX) || defined(Q_OS_DARWIN) || (defined(Q_OS_FREEBSD) && !defined(__DragonFly__) && __FreeBSD_version < 600020)
+ int val = 1;
+ if (setsockopt(m_fd,SOL_SOCKET,SO_NOSIGPIPE,&val,sizeof(int)) < 0)
+ {
+ Out(SYS_CON|LOG_NOTICE) << QString("Failed to set the NOSIGPIPE option : %1").arg(strerror(errno)) << endl;
+ }
+#endif
+ }
+
+ Socket::~Socket()
+ {
+ if (m_fd >= 0)
+ {
+ shutdown(m_fd, SHUT_RDWR);
+ ::close(m_fd);
+ }
+ }
+
+ void Socket::close()
+ {
+ if (m_fd >= 0)
+ {
+ shutdown(m_fd, SHUT_RDWR);
+ ::close(m_fd);
+ m_fd = -1;
+ m_state = CLOSED;
+ }
+ }
+
+ void Socket::setNonBlocking()
+ {
+ fcntl(m_fd, F_SETFL, O_NONBLOCK);
+ }
+
+ bool Socket::connectTo(const Address & a)
+ {
+ struct sockaddr_in addr;
+ memset(&addr,0,sizeof(struct sockaddr_in));
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(a.port());
+ addr.sin_addr.s_addr = htonl(a.ip());
+
+ if (::connect(m_fd,(struct sockaddr*)&addr,sizeof(struct sockaddr)) < 0)
+ {
+ if (errno == EINPROGRESS)
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Socket is connecting" << endl;
+ m_state = CONNECTING;
+ return false;
+ }
+ else
+ {
+ Out(SYS_CON|LOG_NOTICE) << QString("Cannot connect to host %1:%2 : %3")
+ .arg(a.toString()).arg(a.port()).arg(strerror(errno)) << endl;
+ return false;
+ }
+ }
+ m_state = CONNECTED;
+ cacheAddress();
+ return true;
+ }
+
+ bool Socket::bind(Uint16 port,bool also_listen)
+ {
+ struct sockaddr_in addr;
+ memset(&addr,0,sizeof(struct sockaddr_in));
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(port);
+
+ if (::bind(m_fd,(struct sockaddr*)&addr,sizeof(struct sockaddr)) < 0)
+ {
+ Out(SYS_CON|LOG_IMPORTANT) << QString("Cannot bind to port %1 : %2").arg(port).arg(strerror(errno)) << endl;
+ return false;
+ }
+
+ if (also_listen && listen(m_fd,5) < 0)
+ {
+ Out(SYS_CON|LOG_IMPORTANT) << QString("Cannot listen to port %1 : %2").arg(port).arg(strerror(errno)) << endl;
+ return false;
+ }
+
+ int val = 1;
+ if (setsockopt(m_fd,SOL_SOCKET,SO_REUSEADDR,&val,sizeof(int)) < 0)
+ {
+ Out(SYS_CON|LOG_NOTICE) << QString("Failed to set the reuseaddr option : %1").arg(strerror(errno)) << endl;
+ }
+ m_state = BOUND;
+ return true;
+ }
+
+ int Socket::send(const bt::Uint8* buf,int len)
+ {
+ int ret = ::send(m_fd,buf,len,MSG_NOSIGNAL);
+ if (ret < 0)
+ {
+ if (errno != EAGAIN && errno != EWOULDBLOCK)
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Send error : " << QString(strerror(errno)) << endl;
+ close();
+ }
+ return 0;
+ }
+ return ret;
+ }
+
+ int Socket::recv(bt::Uint8* buf,int max_len)
+ {
+ int ret = ::recv(m_fd,buf,max_len,0);
+ if (ret < 0)
+ {
+ if (errno != EAGAIN && errno != EWOULDBLOCK)
+ {
+ // Out(SYS_CON|LOG_DEBUG) << "Receive error : " << QString(strerror(errno)) << endl;
+ close();
+ }
+ return 0;
+ }
+ else if (ret == 0)
+ {
+ // connection closed
+ close();
+ return 0;
+ }
+ return ret;
+ }
+
+ int Socket::sendTo(const bt::Uint8* buf,int len,const Address & a)
+ {
+ struct sockaddr_in addr;
+ memset(&addr,0,sizeof(struct sockaddr_in));
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(a.port());
+ addr.sin_addr.s_addr = htonl(a.ip());
+
+ int ns = 0;
+ while (ns < len)
+ {
+ int left = len - ns;
+ int ret = ::sendto(m_fd,(char*)buf + ns,left,0,(struct sockaddr*)&addr,sizeof(struct sockaddr));
+ if (ret < 0)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Send error : " << QString(strerror(errno)) << endl;
+ return 0;
+ }
+
+ ns += ret;
+ }
+ return ns;
+ }
+
+ int Socket::recvFrom(bt::Uint8* buf,int max_len,Address & a)
+ {
+ struct sockaddr_in addr;
+ memset(&addr,0,sizeof(struct sockaddr_in));
+ socklen_t sl = sizeof(struct sockaddr);
+
+ int ret = ::recvfrom(m_fd,buf,max_len,0,(struct sockaddr*)&addr,&sl);
+ if (ret < 0)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Receive error : " << QString(strerror(errno)) << endl;
+ return 0;
+ }
+
+ a.setPort(ntohs(addr.sin_port));
+ a.setIP(ntohl(addr.sin_addr.s_addr));
+ return ret;
+ }
+
+ int Socket::accept(Address & a)
+ {
+ struct sockaddr_in addr;
+ memset(&addr,0,sizeof(struct sockaddr_in));
+ socklen_t slen = sizeof(struct sockaddr_in);
+
+ int sfd = ::accept(m_fd,(struct sockaddr*)&addr,&slen);
+ if (sfd < 0)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Accept error : " << QString(strerror(errno)) << endl;
+ return -1;
+ }
+
+ a.setPort(ntohs(addr.sin_port));
+ a.setIP(ntohl(addr.sin_addr.s_addr));
+
+ Out(SYS_CON|LOG_DEBUG) << "Accepted connection from " << QString(inet_ntoa(addr.sin_addr)) << endl;
+ return sfd;
+ }
+
+ bool Socket::setTOS(unsigned char type_of_service)
+ {
+#if defined(Q_OS_MACX) || defined(Q_OS_DARWIN) || (defined(Q_OS_FREEBSD) && __FreeBSD_version < 600020) || defined(Q_OS_NETBSD) || defined(Q_OS_OPENBSD) || defined(Q_OS_BSD4)
+ unsigned int c = type_of_service;
+#else
+ unsigned char c = type_of_service;
+#endif
+ if (setsockopt(m_fd,IPPROTO_IP,IP_TOS,&c,sizeof(c)) < 0)
+ {
+ Out(SYS_CON|LOG_NOTICE) << QString("Failed to set TOS to %1 : %2")
+ .arg(type_of_service).arg(strerror(errno)) << endl;
+ return false;
+ }
+ return true;
+ }
+
+ Uint32 Socket::bytesAvailable() const
+ {
+ int ret = 0;
+ if (ioctl(m_fd,FIONREAD,&ret) < 0)
+ return 0;
+
+ return ret;
+ }
+
+ bool Socket::connectSuccesFull()
+ {
+ if (m_state != CONNECTING)
+ return false;
+
+ int err = 0;
+ socklen_t len = sizeof(int);
+ if (getsockopt(m_fd,SOL_SOCKET,SO_ERROR,&err,&len) < 0)
+ return false;
+
+ if (err == 0)
+ {
+ m_state = CONNECTED;
+ cacheAddress();
+ }
+
+ return err == 0;
+ }
+
+ void Socket::cacheAddress()
+ {
+ struct sockaddr_in raddr;
+ socklen_t slen = sizeof(struct sockaddr_in);
+ if (getpeername(m_fd,(struct sockaddr*)&raddr,&slen) == 0)
+ addr = Address(inet_ntoa(raddr.sin_addr),ntohs(raddr.sin_port));
+ }
+
+ /*
+ void Socket::setReadBufferSize(int rbs)
+ {
+ if (setsockopt(m_fd, SOL_SOCKET, SO_RCVBUF, (char *)&rbs,sizeof(int)) < 0)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Failed to set read buffer size " << endl;
+ }
+ }
+ */
+}
diff --git a/libktorrent/net/socket.h b/libktorrent/net/socket.h
new file mode 100644
index 0000000..db8953b
--- /dev/null
+++ b/libktorrent/net/socket.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETSOCKET_H
+#define NETSOCKET_H
+
+#include <util/constants.h>
+#include "address.h"
+
+namespace net
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class Socket
+ {
+ public:
+ enum State
+ {
+ IDLE,
+ CONNECTING,
+ CONNECTED,
+ BOUND,
+ CLOSED
+ };
+
+ Socket(int fd);
+ Socket(bool tcp);
+ virtual ~Socket();
+
+ void setNonBlocking();
+ bool connectTo(const Address & addr);
+ /// See if a connectTo was succesfull in non blocking mode
+ bool connectSuccesFull();
+ bool bind(Uint16 port,bool also_listen);
+ int send(const bt::Uint8* buf,int len);
+ int recv(bt::Uint8* buf,int max_len);
+ int sendTo(const bt::Uint8* buf,int size,const Address & addr);
+ int recvFrom(bt::Uint8* buf,int max_size,Address & addr);
+ int accept(Address & a);
+ bool ok() const {return m_fd >= 0;}
+ int fd() const {return m_fd;}
+ bool setTOS(unsigned char type_of_service);
+ const Address & getPeerName() const {return addr;}
+ void close();
+ State state() const {return m_state;}
+
+ /**
+ * Set the size of the TCP read buffer.
+ * @param rbs
+ */
+// void setReadBufferSize(Uint32 rbs);
+
+ Uint32 bytesAvailable() const;
+ private:
+ void cacheAddress();
+
+ private:
+ int m_fd;
+ State m_state;
+ Address addr;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/socketgroup.cpp b/libktorrent/net/socketgroup.cpp
new file mode 100644
index 0000000..8c9c5e7
--- /dev/null
+++ b/libktorrent/net/socketgroup.cpp
@@ -0,0 +1,186 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include "socketgroup.h"
+#include "bufferedsocket.h"
+
+using namespace bt;
+
+namespace net
+{
+
+ SocketGroup::SocketGroup(Uint32 limit) : limit(limit)
+ {
+ prev_run_time = bt::GetCurrentTime();
+ group_allowance = 0;
+ }
+
+
+ SocketGroup::~SocketGroup()
+ {}
+
+ void SocketGroup::processUnlimited(bool up,bt::TimeStamp now)
+ {
+ std::list<BufferedSocket*>::iterator i = sockets.begin();
+ while (i != sockets.end())
+ {
+ BufferedSocket* s = *i;
+ if (s)
+ {
+ if (up)
+ s->writeBuffered(0,now);
+ else
+ s->readBuffered(0,now);
+ }
+ i++;
+ }
+ }
+
+ bool SocketGroup::processLimited(bool up,bt::TimeStamp now,Uint32 & allowance)
+ {
+ Uint32 bslot = allowance / sockets.size() + 1;
+
+ std::list<BufferedSocket*>::iterator itr = sockets.begin();
+
+ // while we can send and there are sockets left to send
+ while (sockets.size() > 0 && allowance > 0)
+ {
+ Uint32 as = bslot;
+ if (as > allowance)
+ as = allowance;
+
+ BufferedSocket* s = *itr;
+ if (s)
+ {
+ Uint32 ret = 0;
+ if (up)
+ ret = s->writeBuffered(as,now);
+ else
+ ret = s->readBuffered(as,now);
+
+ // if this socket did what it was supposed to do,
+ // it can have another go if stuff is leftover
+ // if it doesn't, we erase it from the list
+ if (ret != as)
+ itr = sockets.erase(itr);
+ else
+ itr++;
+
+ if (ret > allowance)
+ allowance = 0;
+ else
+ allowance -= ret;
+ }
+ else
+ {
+ // 0 pointer so just erase
+ itr = sockets.erase(itr);
+ }
+
+ // wrap around if necessary
+ if (itr == sockets.end())
+ itr = sockets.begin();
+ }
+
+ return sockets.size() > 0;
+ }
+
+ bool SocketGroup::download(Uint32 & global_allowance,bt::TimeStamp now)
+ {
+ return process(false,now,global_allowance);
+ }
+
+ bool SocketGroup::upload(Uint32 & global_allowance,bt::TimeStamp now)
+ {
+ return process(true,now,global_allowance);
+ }
+
+ void SocketGroup::calcAllowance(bt::TimeStamp now)
+ {
+ if (limit > 0)
+ group_allowance = (Uint32)ceil(1.02 * limit * (now - prev_run_time) * 0.001);
+ else
+ group_allowance = 0;
+ prev_run_time = now;
+ }
+
+ bool SocketGroup::process(bool up,bt::TimeStamp now,Uint32 & global_allowance)
+ {
+ if (limit > 0)
+ {
+ bool ret = false;
+ if (global_allowance == 0)
+ {
+ Uint32 p = group_allowance;
+ ret = processLimited(up,now,p);
+ group_allowance = p;
+ }
+ else if (global_allowance <= group_allowance)
+ {
+ Uint32 tmp = global_allowance;
+ ret = processLimited(up,now,tmp);
+
+ Uint32 done = (global_allowance - tmp);
+ if (group_allowance < done)
+ group_allowance = 0;
+ else
+ group_allowance -= done;
+
+ global_allowance = tmp;
+ }
+ else
+ {
+ Uint32 p = group_allowance;
+ ret = processLimited(up,now,p);
+
+ Uint32 done = (group_allowance - p);
+ if (global_allowance < done)
+ global_allowance = 0;
+ else
+ global_allowance -= done;
+
+ group_allowance = p;
+ }
+
+ // if group allowance is used up, this group can no longer do anything
+ if (group_allowance == 0)
+ {
+ clear();
+ return false;
+ }
+ else
+ return ret;
+ }
+ else if (global_allowance > 0)
+ {
+ return processLimited(up,now,global_allowance);
+ }
+ else
+ {
+ processUnlimited(up,now);
+ return false;
+ }
+ }
+
+
+
+}
diff --git a/libktorrent/net/socketgroup.h b/libktorrent/net/socketgroup.h
new file mode 100644
index 0000000..ba08029
--- /dev/null
+++ b/libktorrent/net/socketgroup.h
@@ -0,0 +1,90 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETSOCKETGROUP_H
+#define NETSOCKETGROUP_H
+
+#include <list>
+#include <util/constants.h>
+
+namespace net
+{
+ using bt::Uint32;
+
+ class BufferedSocket;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class SocketGroup
+ {
+ Uint32 limit;
+ std::list<BufferedSocket*> sockets;
+ bt::TimeStamp prev_run_time;
+ Uint32 group_allowance;
+ public:
+ SocketGroup(Uint32 limit);
+ virtual ~SocketGroup();
+
+ /// Clear the lists of sockets
+ void clear() {sockets.clear();}
+
+ /// Add a socket for processing
+ void add(BufferedSocket* s) {sockets.push_back(s);}
+
+ /**
+ Process all the sockets in the vector for download.
+ @param global_allowance How much the group can do, this will be updated, 0 means no limit
+ @param now Current time
+ @return true if we can download more data, false otherwise
+ */
+ bool download(Uint32 & global_allowance,bt::TimeStamp now);
+
+ /**
+ Process all the sockets in the vector for upload
+ @param global_allowance How much the group can do, this will be updated, 0 means no limit
+ @param now Current time
+ @return true if we can upload more data, false otherwise
+ */
+ bool upload(Uint32 & global_allowance,bt::TimeStamp now);
+
+ /**
+ * Set the group limit in bytes per sec
+ * @param lim The limit
+ */
+ void setLimit(Uint32 lim) {limit = lim;}
+
+ /// Get the number of sockets
+ Uint32 numSockets() const {return sockets.size();}
+
+ /**
+ * Calculate the allowance for this group
+ * @param now Current timestamp
+ */
+ void calcAllowance(bt::TimeStamp now);
+ private:
+ void processUnlimited(bool up,bt::TimeStamp now);
+ bool processLimited(bool up,bt::TimeStamp now,Uint32 & allowance);
+ bool process(bool up,bt::TimeStamp now,Uint32 & global_allowance);
+ };
+
+
+}
+
+#endif
diff --git a/libktorrent/net/socketmonitor.cpp b/libktorrent/net/socketmonitor.cpp
new file mode 100644
index 0000000..38225ab
--- /dev/null
+++ b/libktorrent/net/socketmonitor.cpp
@@ -0,0 +1,173 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <unistd.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "socketmonitor.h"
+#include "bufferedsocket.h"
+#include "uploadthread.h"
+#include "downloadthread.h"
+
+using namespace bt;
+
+namespace net
+{
+ SocketMonitor SocketMonitor::self;
+
+ SocketMonitor::SocketMonitor() : ut(0),dt(0),next_group_id(1)
+ {
+ dt = new DownloadThread(this);
+ ut = new UploadThread(this);
+ }
+
+
+ SocketMonitor::~SocketMonitor()
+ {
+ if (ut && ut->isRunning())
+ {
+ ut->stop();
+ ut->signalDataReady(); // kick it in the nuts, if the thread is waiting for data
+ if (!ut->wait(250))
+ {
+ ut->terminate();
+ ut->wait();
+ }
+ }
+
+
+ if (dt && dt->isRunning())
+ {
+ dt->stop();
+ if (!dt->wait(250))
+ {
+ dt->terminate();
+ dt->wait();
+ }
+ }
+
+ delete ut;
+ delete dt;
+ }
+
+ void SocketMonitor::lock()
+ {
+ mutex.lock();
+ }
+
+ void SocketMonitor::unlock()
+ {
+ mutex.unlock();
+ }
+
+ void SocketMonitor::setDownloadCap(Uint32 bytes_per_sec)
+ {
+ DownloadThread::setCap(bytes_per_sec);
+ }
+
+ void SocketMonitor::setUploadCap(Uint32 bytes_per_sec)
+ {
+ UploadThread::setCap(bytes_per_sec);
+ }
+
+ void SocketMonitor::setSleepTime(Uint32 sleep_time)
+ {
+ DownloadThread::setSleepTime(sleep_time);
+ UploadThread::setSleepTime(sleep_time);
+ }
+
+ void SocketMonitor::add(BufferedSocket* sock)
+ {
+ QMutexLocker lock(&mutex);
+
+ bool start_threads = smap.count() == 0;
+ smap.append(sock);
+
+ if (start_threads)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Starting socketmonitor threads" << endl;
+
+ if (!dt->isRunning())
+ dt->start(QThread::IdlePriority);
+ if (!ut->isRunning())
+ ut->start(QThread::IdlePriority);
+ }
+ }
+
+ void SocketMonitor::remove(BufferedSocket* sock)
+ {
+ QMutexLocker lock(&mutex);
+ if (smap.count() == 0)
+ return;
+
+ smap.remove(sock);
+ if (smap.count() == 0)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Stopping socketmonitor threads" << endl;
+ if (dt && dt->isRunning())
+ dt->stop();
+ if (ut && ut->isRunning())
+ {
+ ut->stop();
+ ut->signalDataReady();
+ }
+ }
+ }
+
+ void SocketMonitor::signalPacketReady()
+ {
+ if (ut)
+ ut->signalDataReady();
+ }
+
+ Uint32 SocketMonitor::newGroup(GroupType type,Uint32 limit)
+ {
+ lock();
+ Uint32 gid = next_group_id++;
+ if (type == UPLOAD_GROUP)
+ ut->addGroup(gid,limit);
+ else
+ dt->addGroup(gid,limit);
+ unlock();
+ return gid;
+ }
+
+ void SocketMonitor::setGroupLimit(GroupType type,Uint32 gid,Uint32 limit)
+ {
+ lock();
+ if (type == UPLOAD_GROUP)
+ ut->setGroupLimit(gid,limit);
+ else
+ dt->setGroupLimit(gid,limit);
+ unlock();
+ }
+
+ void SocketMonitor::removeGroup(GroupType type,Uint32 gid)
+ {
+ lock();
+ if (type == UPLOAD_GROUP)
+ ut->removeGroup(gid);
+ else
+ dt->removeGroup(gid);
+ unlock();
+ }
+
+}
diff --git a/libktorrent/net/socketmonitor.h b/libktorrent/net/socketmonitor.h
new file mode 100644
index 0000000..79e4a2e
--- /dev/null
+++ b/libktorrent/net/socketmonitor.h
@@ -0,0 +1,118 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETSOCKETMONITOR_H
+#define NETSOCKETMONITOR_H
+
+
+#include <qmutex.h>
+#include <qptrlist.h>
+#include <util/constants.h>
+
+
+namespace net
+{
+ using bt::Uint32;
+
+ class BufferedSocket;
+ class UploadThread;
+ class DownloadThread;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Monitors all sockets for upload and download traffic.
+ * It uses two threads to do this.
+ */
+ class SocketMonitor
+ {
+ static SocketMonitor self;
+
+ QMutex mutex;
+ UploadThread* ut;
+ DownloadThread* dt;
+ QPtrList<BufferedSocket> smap;
+ Uint32 next_group_id;
+
+ SocketMonitor();
+ public:
+ virtual ~SocketMonitor();
+
+ /// Add a new socket, will start the threads if necessary
+ void add(BufferedSocket* sock);
+
+ /// Remove a socket, will stop threads if no more sockets are left
+ void remove(BufferedSocket* sock);
+
+ enum GroupType
+ {
+ UPLOAD_GROUP,
+ DOWNLOAD_GROUP
+ };
+
+
+ /**
+ * Creata a new upload or download group
+ * @param type Wether it is an upload or download group
+ * @param limit Limit of group in bytes/s
+ * @return The group ID
+ */
+ Uint32 newGroup(GroupType type,Uint32 limit);
+
+ /**
+ * Change the group limit
+ * @param type The group type
+ * @param gid The group id
+ * @param limit The limit
+ */
+ void setGroupLimit(GroupType type,Uint32 gid,Uint32 limit);
+
+ /**
+ * Remove a group
+ * @param type The group type
+ * @param gid The group id
+ */
+ void removeGroup(GroupType type,Uint32 gid);
+
+ typedef QPtrList<BufferedSocket>::iterator Itr;
+
+ /// Get the begin of the list of sockets
+ Itr begin() {return smap.begin();}
+
+ /// Get the end of the list of sockets
+ Itr end() {return smap.end();}
+
+ /// lock the monitor
+ void lock();
+
+ /// unlock the monitor
+ void unlock();
+
+ /// Tell upload thread a packet is ready
+ void signalPacketReady();
+
+ static void setDownloadCap(Uint32 bytes_per_sec);
+ static void setUploadCap(Uint32 bytes_per_sec);
+ static void setSleepTime(Uint32 sleep_time);
+ static SocketMonitor & instance() {return self;}
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/speed.cpp b/libktorrent/net/speed.cpp
new file mode 100644
index 0000000..aa57513
--- /dev/null
+++ b/libktorrent/net/speed.cpp
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/timer.h>
+#include <util/functions.h>
+#include "speed.h"
+
+using namespace bt;
+
+namespace net
+{
+ const Uint64 SPEED_INTERVAL = 5000;
+
+ Speed::Speed() : rate(0),bytes(0)
+ {}
+
+
+ Speed::~Speed()
+ {}
+
+ void Speed::onData(Uint32 b,bt::TimeStamp ts)
+ {
+ dlrate.append(qMakePair(b,ts));
+ bytes += b;
+ }
+
+ void Speed::update(bt::TimeStamp now)
+ {
+ QValueList<QPair<Uint32,TimeStamp> >::iterator i = dlrate.begin();
+ while (i != dlrate.end())
+ {
+ QPair<Uint32,TimeStamp> & p = *i;
+ if (now - p.second > SPEED_INTERVAL || now < p.second)
+ {
+ if (bytes >= p.first) // make sure we don't wrap around
+ bytes -= p.first; // subtract bytes
+ else
+ bytes = 0;
+ i = dlrate.erase(i);
+ }
+ else
+ {
+ // seeing that newer entries are appended, they are in the list chronologically
+ // so once we hit an entry which is in the interval, we can just break out of the loop
+ // because all following entries will be in the interval
+ break;
+ }
+ }
+
+ if (bytes == 0)
+ {
+ rate = 0;
+ }
+ else
+ {
+ // Out() << "bytes = " << bytes << " d = " << d << endl;
+ rate = (float) bytes / (float)(SPEED_INTERVAL * 0.001);
+ }
+ }
+
+}
diff --git a/libktorrent/net/speed.h b/libktorrent/net/speed.h
new file mode 100644
index 0000000..d5825e9
--- /dev/null
+++ b/libktorrent/net/speed.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETSPEED_H
+#define NETSPEED_H
+
+#include <qpair.h>
+#include <qvaluelist.h>
+#include <util/constants.h>
+
+namespace net
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Measures the download and upload speed.
+ */
+ class Speed
+ {
+ float rate;
+ bt::Uint32 bytes;
+ QValueList<QPair<bt::Uint32,bt::TimeStamp> > dlrate;
+ public:
+ Speed();
+ virtual ~Speed();
+
+ void onData(bt::Uint32 bytes,bt::TimeStamp ts);
+ void update(bt::TimeStamp now);
+ float getRate() const {return rate;}
+ };
+
+}
+
+#endif
diff --git a/libktorrent/net/uploadthread.cpp b/libktorrent/net/uploadthread.cpp
new file mode 100644
index 0000000..0023cf6
--- /dev/null
+++ b/libktorrent/net/uploadthread.cpp
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <util/functions.h>
+#include "uploadthread.h"
+#include "socketmonitor.h"
+#include "bufferedsocket.h"
+#include "socketgroup.h"
+
+using namespace bt;
+
+namespace net
+{
+ Uint32 UploadThread::ucap = 0;
+ Uint32 UploadThread::sleep_time = 3;
+
+ UploadThread::UploadThread(SocketMonitor* sm) : NetworkThread(sm)
+ {}
+
+
+ UploadThread::~UploadThread()
+ {}
+
+
+ void UploadThread::update()
+ {
+ sm->lock();
+ bt::TimeStamp now = bt::Now();
+
+ Uint32 num_ready = 0;
+ // loop over all sockets and see which ones have data ready
+ SocketMonitor::Itr itr = sm->begin();
+ while (itr != sm->end())
+ {
+ BufferedSocket* s = *itr;
+ if (s && s->ok() && s->bytesReadyToWrite())
+ {
+ SocketGroup* g = groups.find(s->uploadGroupID());
+ if (!g)
+ g = groups.find(0);
+
+ g->add(s);
+ num_ready++;
+ }
+ itr++;
+ }
+
+ if (num_ready > 0)
+ doGroups(num_ready,now,ucap);
+ prev_run_time = now;
+ sm->unlock();
+
+ if (num_ready == 0) // nobody was ready so go to sleep
+ data_ready.wait();
+ else
+ msleep(sleep_time);
+ }
+
+ void UploadThread::signalDataReady()
+ {
+ data_ready.wakeOne();
+ }
+
+ void UploadThread::setSleepTime(Uint32 stime)
+ {
+ if (stime >= 1 && stime <= 10)
+ sleep_time = stime;
+ }
+
+ bool UploadThread::doGroup(SocketGroup* g,Uint32 & allowance,bt::TimeStamp now)
+ {
+ return g->upload(allowance,now);
+ }
+}
diff --git a/libktorrent/net/uploadthread.h b/libktorrent/net/uploadthread.h
new file mode 100644
index 0000000..265abac
--- /dev/null
+++ b/libktorrent/net/uploadthread.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 NETUPLOADTHREAD_H
+#define NETUPLOADTHREAD_H
+
+
+
+#include <qwaitcondition.h>
+#include "networkthread.h"
+
+namespace net
+{
+ class SocketMonitor;
+ class BufferedSocket;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class UploadThread : public NetworkThread
+ {
+ static bt::Uint32 ucap;
+ static bt::Uint32 sleep_time;
+
+ QWaitCondition data_ready;
+ public:
+ UploadThread(SocketMonitor* sm);
+ virtual ~UploadThread();
+
+ /// Wake up thread, data is ready to be sent
+ void signalDataReady();
+
+ /// Set the upload cap
+ static void setCap(bt::Uint32 uc) {ucap = uc;}
+
+ /// Set the sleep time when using upload caps
+ static void setSleepTime(bt::Uint32 stime);
+ private:
+ virtual void update();
+ virtual bool doGroup(SocketGroup* g,Uint32 & allowance,bt::TimeStamp now);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/pluginmanager.cpp b/libktorrent/pluginmanager.cpp
new file mode 100644
index 0000000..db9e0a3
--- /dev/null
+++ b/libktorrent/pluginmanager.cpp
@@ -0,0 +1,312 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qfile.h>
+#include <qtextstream.h>
+#include <kparts/componentfactory.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <util/fileops.h>
+#include <util/waitjob.h>
+#include <torrent/globals.h>
+#include <interfaces/guiinterface.h>
+#include "pluginmanager.h"
+#include "pluginmanagerprefpage.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ PluginManager::PluginManager(CoreInterface* core,GUIInterface* gui) : core(core),gui(gui)
+ {
+ unloaded.setAutoDelete(false);
+ plugins.setAutoDelete(false);
+ prefpage = 0;
+ pltoload.append("Info Widget");
+ pltoload.append("Search");
+ }
+
+ PluginManager::~PluginManager()
+ {
+ delete prefpage;
+ unloaded.setAutoDelete(true);
+ plugins.setAutoDelete(true);
+ }
+
+ void PluginManager::loadPluginList()
+ {
+ KTrader::OfferList offers = KTrader::self()->query("KTorrent/Plugin");
+
+ KTrader::OfferList::ConstIterator iter;
+ for(iter = offers.begin(); iter != offers.end(); ++iter)
+ {
+ KService::Ptr service = *iter;
+ int errCode = 0;
+ Plugin* plugin =
+ KParts::ComponentFactory::createInstanceFromService<kt::Plugin>
+ (service, 0, 0, QStringList(),&errCode);
+
+ if (!plugin)
+ continue;
+
+
+ if (!plugin->versionCheck(kt::VERSION_STRING))
+ {
+ Out(SYS_GEN|LOG_NOTICE) <<
+ QString("Plugin %1 version does not match KTorrent version, unloading it.")
+ .arg(service->library()) << endl;
+
+ delete plugin;
+ // unload the library again, no need to have it loaded
+ KLibLoader::self()->unloadLibrary(service->library().local8Bit());
+ continue;
+ }
+
+ unloaded.insert(plugin->getName(),plugin);
+ if (pltoload.contains(plugin->getName()))
+ load(plugin->getName());
+ }
+
+ if (!prefpage)
+ {
+ prefpage = new PluginManagerPrefPage(this);
+ gui->addPrefPage(prefpage);
+ }
+ prefpage->updatePluginList();
+ }
+
+
+ void PluginManager::load(const QString & name)
+ {
+ Plugin* p = unloaded.find(name);
+ if (!p)
+ return;
+
+ Out(SYS_GEN|LOG_NOTICE) << "Loading plugin "<< p->getName() << endl;
+ p->setCore(core);
+ p->setGUI(gui);
+ p->load();
+ gui->mergePluginGui(p);
+ unloaded.erase(name);
+ plugins.insert(p->getName(),p);
+ p->loaded = true;
+
+ if (!cfg_file.isNull())
+ saveConfigFile(cfg_file);
+ }
+
+ void PluginManager::unload(const QString & name)
+ {
+ Plugin* p = plugins.find(name);
+ if (!p)
+ return;
+
+ // first shut it down properly
+ bt::WaitJob* wjob = new WaitJob(2000);
+ try
+ {
+ p->shutdown(wjob);
+ if (wjob->needToWait())
+ bt::WaitJob::execute(wjob);
+ else
+ delete wjob;
+ }
+ catch (Error & err)
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Error when unloading plugin: " << err.toString() << endl;
+ }
+
+
+ gui->removePluginGui(p);
+ p->unload();
+ plugins.erase(name);
+ unloaded.insert(p->getName(),p);
+ p->loaded = false;
+
+ if (!cfg_file.isNull())
+ saveConfigFile(cfg_file);
+ }
+
+ void PluginManager::loadAll()
+ {
+ bt::PtrMap<QString,Plugin>::iterator i = unloaded.begin();
+ while (i != unloaded.end())
+ {
+ Plugin* p = i->second;
+ p->setCore(core);
+ p->setGUI(gui);
+ p->load();
+ gui->mergePluginGui(p);
+ plugins.insert(p->getName(),p);
+ p->loaded = true;
+ i++;
+ }
+ unloaded.clear();
+ if (!cfg_file.isNull())
+ saveConfigFile(cfg_file);
+ }
+
+ void PluginManager::unloadAll(bool save)
+ {
+ // first properly shutdown all plugins
+ bt::WaitJob* wjob = new WaitJob(2000);
+ try
+ {
+ bt::PtrMap<QString,Plugin>::iterator i = plugins.begin();
+ while (i != plugins.end())
+ {
+ Plugin* p = i->second;
+ p->shutdown(wjob);
+ i++;
+ }
+
+ if (wjob->needToWait())
+ bt::WaitJob::execute(wjob);
+ else
+ delete wjob;
+ }
+ catch (Error & err)
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Error when unloading all plugins: " << err.toString() << endl;
+ }
+
+ // then unload them
+ bt::PtrMap<QString,Plugin>::iterator i = plugins.begin();
+ while (i != plugins.end())
+ {
+ Plugin* p = i->second;
+ gui->removePluginGui(p);
+ p->unload();
+ unloaded.insert(p->getName(),p);
+ p->loaded = false;
+ i++;
+ }
+ plugins.clear();
+ if (save && !cfg_file.isNull())
+ saveConfigFile(cfg_file);
+ }
+
+ void PluginManager::updateGuiPlugins()
+ {
+ bt::PtrMap<QString,Plugin>::iterator i = plugins.begin();
+ while (i != plugins.end())
+ {
+ Plugin* p = i->second;
+ p->guiUpdate();
+ i++;
+ }
+ }
+
+ void PluginManager::fillPluginList(QPtrList<Plugin> & plist)
+ {
+ bt::PtrMap<QString,Plugin>::iterator i = plugins.begin();
+ while (i != plugins.end())
+ {
+ Plugin* p = i->second;
+ plist.append(p);
+ i++;
+ }
+
+
+ i = unloaded.begin();
+ while (i != unloaded.end())
+ {
+ Plugin* p = i->second;
+ plist.append(p);
+ i++;
+ }
+ }
+
+ bool PluginManager::isLoaded(const QString & name) const
+ {
+ const Plugin* p = plugins.find(name);
+ return p != 0;
+ }
+
+ void PluginManager::loadConfigFile(const QString & file)
+ {
+ cfg_file = file;
+ // make a default config file if doesn't exist
+ if (!bt::Exists(file))
+ {
+ writeDefaultConfigFile(file);
+ return;
+ }
+
+ QFile f(file);
+ if (!f.open(IO_ReadOnly))
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Cannot open file " << file << " : " << f.errorString() << endl;
+ return;
+ }
+
+ pltoload.clear();
+
+ QTextStream in(&f);
+ while (!in.atEnd())
+ {
+ QString l = in.readLine();
+ if (l.isNull())
+ break;
+
+ pltoload.append(l);
+ }
+ }
+
+ void PluginManager::saveConfigFile(const QString & file)
+ {
+ cfg_file = file;
+ QFile f(file);
+ if (!f.open(IO_WriteOnly))
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Cannot open file " << file << " : " << f.errorString() << endl;
+ return;
+ }
+
+ QTextStream out(&f);
+ bt::PtrMap<QString,Plugin>::iterator i = plugins.begin();
+ while (i != plugins.end())
+ {
+ Plugin* p = i->second;
+ out << p->getName() << endl;
+ i++;
+ }
+ }
+
+
+ void PluginManager::writeDefaultConfigFile(const QString & file)
+ {
+ // by default we will load the infowidget and searchplugin
+ QFile f(file);
+ if (!f.open(IO_WriteOnly))
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Cannot open file " << file << " : " << f.errorString() << endl;
+ return;
+ }
+
+ QTextStream out(&f);
+
+ out << "Info Widget" << endl << "Search" << endl;
+
+ pltoload.clear();
+ pltoload.append("Info Widget");
+ pltoload.append("Search");
+ }
+}
diff --git a/libktorrent/pluginmanager.h b/libktorrent/pluginmanager.h
new file mode 100644
index 0000000..611ec66
--- /dev/null
+++ b/libktorrent/pluginmanager.h
@@ -0,0 +1,118 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTPLUGINMANAGER_H
+#define KTPLUGINMANAGER_H
+
+#include <qptrlist.h>
+#include <util/ptrmap.h>
+#include <interfaces/plugin.h>
+#include <qstringlist.h>
+
+
+namespace kt
+{
+ class CoreInterface;
+ class GUIInterface;
+ class PluginManagerPrefPage;
+
+ /**
+ * @author Joris Guisson
+ * @brief Class to manage plugins
+ *
+ * This class manages all plugins. Plugins are stored in a map
+ */
+ class PluginManager
+ {
+ bt::PtrMap<QString,Plugin> plugins,unloaded;
+ CoreInterface* core;
+ GUIInterface* gui;
+ PluginManagerPrefPage* prefpage;
+ QStringList pltoload;
+ QString cfg_file;
+ public:
+ PluginManager(CoreInterface* core,GUIInterface* gui);
+ virtual ~PluginManager();
+
+ /**
+ * Load the list of plugins.
+ * This basically uses KTrader to get a list of available plugins, and
+ * loads those, but does not initialize them. We will consider a plugin loaded
+ * when it's load method is called.
+ */
+ void loadPluginList();
+
+ /**
+ * Loads which plugins need to be loaded from a file.
+ * @param file The file
+ */
+ void loadConfigFile(const QString & file);
+
+ /**
+ * Saves which plugins are loaded to a file.
+ * @param file The file
+ */
+ void saveConfigFile(const QString & file);
+
+ /**
+ * Fill a list with all available plugins.
+ * @param pllist The plugin list
+ */
+ void fillPluginList(QPtrList<Plugin> & plist);
+
+ /**
+ * Is a plugin loaded
+ * @param name Naame of plugin.
+ * @return True if it is, false if it isn't
+ */
+ bool isLoaded(const QString & name) const;
+
+ /**
+ * Load a plugin.
+ * @param name Name of the plugin
+ */
+ void load(const QString & name);
+
+ /**
+ * Unload a plugin.
+ * @param name Name of the plugin
+ */
+ void unload(const QString & name);
+
+ /**
+ * Load all unloaded plugins.
+ */
+ void loadAll();
+
+ /**
+ * Unload all loaded plugins.
+ */
+ void unloadAll(bool save = true);
+
+ /**
+ * Update all plugins who need a periodical GUI update.
+ */
+ void updateGuiPlugins();
+ private:
+ void writeDefaultConfigFile(const QString & file);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/pluginmanagerprefpage.cpp b/libktorrent/pluginmanagerprefpage.cpp
new file mode 100644
index 0000000..8151be4
--- /dev/null
+++ b/libktorrent/pluginmanagerprefpage.cpp
@@ -0,0 +1,213 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kpushbutton.h>
+#include <klistview.h>
+#include <qheader.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <util/constants.h>
+#include "pluginmanager.h"
+#include "pluginmanagerwidget.h"
+#include "pluginmanagerprefpage.h"
+#include "labelview.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ class PluginViewItem : public LabelViewItem
+ {
+ Plugin* p;
+ public:
+ PluginViewItem(Plugin* p,LabelView* parent)
+ : LabelViewItem(p->getIcon(),p->getGuiName(),p->getDescription(),parent),p(p)
+ {
+ update();
+ }
+
+ virtual ~PluginViewItem()
+ {}
+
+ virtual void update()
+ {
+ setTitle("<h3>" + p->getGuiName() + "</h3>");
+ setDescription(
+ i18n("%1<br>Status: <b>%2</b><br>Author: %3").arg(p->getDescription())
+ .arg(p->isLoaded() ? i18n("Loaded") : i18n("Not loaded"))
+ .arg(p->getAuthor()));
+ }
+
+ QString pluginName() {return p->getName();}
+ };
+
+ PluginManagerPrefPage::PluginManagerPrefPage(PluginManager* pman)
+ : PrefPageInterface(i18n("Plugins"), i18n("Plugin Options"),KGlobal::iconLoader()->loadIcon("ktplugins",KIcon::NoGroup)),pman(pman)
+ {
+ pmw = 0;
+ }
+
+
+ PluginManagerPrefPage::~PluginManagerPrefPage()
+ {}
+
+ bool PluginManagerPrefPage::apply()
+ {
+ return true;
+ }
+
+ void PluginManagerPrefPage::createWidget(QWidget* parent)
+ {
+ pmw = new PluginManagerWidget(parent);
+
+ connect(pmw->load_btn,SIGNAL(clicked()),this,SLOT(onLoad()));
+ connect(pmw->unload_btn,SIGNAL(clicked()),this,SLOT(onUnload()));
+ connect(pmw->load_all_btn,SIGNAL(clicked()),this,SLOT(onLoadAll()));
+ connect(pmw->unload_all_btn,SIGNAL(clicked()),this,SLOT(onUnloadAll()));
+ LabelView* lv = pmw->plugin_view;
+ connect(lv,SIGNAL(currentChanged(LabelViewItem * )),this,SLOT(onCurrentChanged( LabelViewItem* )));
+ }
+
+ void PluginManagerPrefPage::updatePluginList()
+ {
+ LabelView* lv = pmw->plugin_view;
+ lv->clear();
+ // get list of plugins
+ QPtrList<Plugin> pl;
+ pman->fillPluginList(pl);
+
+ // Add them all
+ QPtrList<Plugin>::iterator i = pl.begin();
+ while (i != pl.end())
+ {
+ Plugin* p = *i;
+ lv->addItem(new PluginViewItem(p,lv));
+ i++;
+ }
+ lv->sort();
+ }
+
+ void PluginManagerPrefPage::updateData()
+ {
+ updateAllButtons();
+ }
+
+
+
+ void PluginManagerPrefPage::deleteWidget()
+ {
+ delete pmw;
+ pmw = 0;
+ }
+
+ void PluginManagerPrefPage::onCurrentChanged(LabelViewItem* item)
+ {
+ PluginViewItem* pvi = (PluginViewItem*)item;
+ if (!item)
+ {
+ pmw->load_btn->setEnabled(false);
+ pmw->unload_btn->setEnabled(false);
+ }
+ else
+ {
+ bool loaded = pman->isLoaded(pvi->pluginName());
+ pmw->load_btn->setEnabled(!loaded);
+ pmw->unload_btn->setEnabled(loaded);
+ }
+ }
+
+ void PluginManagerPrefPage::updateAllButtons()
+ {
+ Uint32 tot = 0;
+ Uint32 loaded = 0;
+ // get list of plugins
+ QPtrList<Plugin> pl;
+ pman->fillPluginList(pl);
+
+ QPtrList<Plugin>::iterator i = pl.begin();
+ while (i != pl.end())
+ {
+ Plugin* p = *i;
+ tot++;
+ if (p->isLoaded())
+ loaded++;
+ i++;
+ }
+
+ if (loaded == tot)
+ {
+ pmw->load_all_btn->setEnabled(false);
+ pmw->unload_all_btn->setEnabled(true);
+ }
+ else if (loaded < tot && loaded > 0)
+ {
+ pmw->unload_all_btn->setEnabled(true);
+ pmw->load_all_btn->setEnabled(true);
+ }
+ else
+ {
+ pmw->unload_all_btn->setEnabled(false);
+ pmw->load_all_btn->setEnabled(true);
+ }
+ onCurrentChanged(pmw->plugin_view->selectedItem());
+ }
+
+ void PluginManagerPrefPage::onLoad()
+ {
+ LabelView* lv = pmw->plugin_view;
+ PluginViewItem* vi = (PluginViewItem*)lv->selectedItem();
+ if (vi && !pman->isLoaded(vi->pluginName()))
+ {
+ pman->load(vi->pluginName());
+ vi->update();
+ updateAllButtons();
+ }
+ }
+
+ void PluginManagerPrefPage::onUnload()
+ {
+ LabelView* lv = pmw->plugin_view;
+ PluginViewItem* vi = (PluginViewItem*)lv->selectedItem();
+ if (vi && pman->isLoaded(vi->pluginName()))
+ {
+ pman->unload(vi->pluginName());
+ vi->update();
+ updateAllButtons();
+ }
+ }
+
+ void PluginManagerPrefPage::onLoadAll()
+ {
+ pman->loadAll();
+ LabelView* lv = pmw->plugin_view;
+ lv->update();
+ updateAllButtons();
+ }
+
+ void PluginManagerPrefPage::onUnloadAll()
+ {
+ pman->unloadAll();
+ LabelView* lv = pmw->plugin_view;
+ lv->update();
+ updateAllButtons();
+ }
+
+}
diff --git a/libktorrent/pluginmanagerprefpage.h b/libktorrent/pluginmanagerprefpage.h
new file mode 100644
index 0000000..47df97f
--- /dev/null
+++ b/libktorrent/pluginmanagerprefpage.h
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTPLUGINMANAGERPREFPAGE_H
+#define KTPLUGINMANAGERPREFPAGE_H
+
+#include <qobject.h>
+#include <interfaces/prefpageinterface.h>
+
+class QListViewItem;
+class PluginManagerWidget;
+
+namespace kt
+{
+ class PluginManager;
+ class LabelViewItem;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Pref page which allows to load and unload plugins.
+ */
+ class PluginManagerPrefPage : public QObject,public PrefPageInterface
+ {
+ Q_OBJECT
+ public:
+ PluginManagerPrefPage(PluginManager* pman);
+ virtual ~PluginManagerPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void updateData();
+ virtual void deleteWidget();
+
+ void updatePluginList();
+
+ private slots:
+ void onLoad();
+ void onUnload();
+ void onLoadAll();
+ void onUnloadAll();
+ void onCurrentChanged(LabelViewItem* item);
+
+ private:
+ void updateAllButtons();
+
+ private:
+ PluginManager* pman;
+ PluginManagerWidget* pmw;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/pluginmanagerwidget.ui b/libktorrent/pluginmanagerwidget.ui
new file mode 100644
index 0000000..f83efe0
--- /dev/null
+++ b/libktorrent/pluginmanagerwidget.ui
@@ -0,0 +1,127 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>PluginManagerWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>PluginManagerWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>320</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Plugin Manager</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="kt::LabelView">
+ <property name="name">
+ <cstring>plugin_view</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>load_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Load</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>unload_btn</cstring>
+ </property>
+ <property name="text">
+ <string>U&amp;nload</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>load_all_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Load &amp;All</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>unload_all_btn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Unload All</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>31</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>kt::LabelView</class>
+ <header location="global">labelview.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="PNG" length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042c49444154388db5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d404e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3eeffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6bebebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64dcbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb004580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9ee0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93d642365be0636a0d28ec7600941d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13ed1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f72208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45c02d37499182b01cc0201a085d61a2144d8b2ac8fb6ed340e77240c4261890e04c250185262546d534a032154b59e0ad394e41c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd051532ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de6795578012889ff6b98fe016ea0ce1c6a2573410000000049454e44ae426082</data>
+ </image>
+</images>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>labelview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/libktorrent/settings.kcfgc b/libktorrent/settings.kcfgc
new file mode 100644
index 0000000..f5a6064
--- /dev/null
+++ b/libktorrent/settings.kcfgc
@@ -0,0 +1,6 @@
+# Code generation options for kconfig_compiler
+File=ktorrent.kcfg
+ClassName=Settings
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables
diff --git a/libktorrent/torrent/Makefile.am b/libktorrent/torrent/Makefile.am
new file mode 100644
index 0000000..d546228
--- /dev/null
+++ b/libktorrent/torrent/Makefile.am
@@ -0,0 +1,33 @@
+INCLUDES = -I$(top_builddir)/ktorrent/libktorrent -I$(top_builddir)/libktorrent \
+ -I$(srcdir)/.. $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_LTLIBRARIES = libtorrent.la
+libtorrent_la_LDFLAGS = $(all_libraries)
+noinst_HEADERS = advancedchokealgorithm.h announcelist.h authenticate.h \
+ authenticatebase.h authenticationmonitor.h bdecoder.h bencoder.h bnode.h cache.h \
+ cachefile.h cap.h choker.h chunk.h chunkcounter.h chunkdownload.h chunkmanager.h \
+ chunkselector.h dndfile.h downloadcap.h downloader.h globals.h httptracker.h \
+ ipblocklist.h movedatafilesjob.h multifilecache.h newchokealgorithm.h \
+ oldchokealgorithm.h packet.h packetreader.h packetwriter.h peer.h peerdownloader.h peerid.h \
+ peermanager.h peersourcemanager.h peeruploader.h piece.h preallocationthread.h \
+ queuemanager.h request.h server.h serverauthenticate.h singlefilecache.h \
+ speedestimater.h statsfile.h timeestimator.h torrent.h torrentcontrol.h torrentcreator.h \
+ torrentfile.h tracker.h udptracker.h udptrackersocket.h uploadcap.h uploader.h \
+ upspeedestimater.h utpex.h value.h
+
+libtorrent_la_SOURCES = advancedchokealgorithm.cpp announcelist.cpp \
+ authenticate.cpp authenticatebase.cpp authenticationmonitor.cpp bdecoder.cpp \
+ bencoder.cpp bnode.cpp cache.cpp cachefile.cpp cap.cpp choker.cpp chunk.cpp \
+ chunkcounter.cpp chunkdownload.cpp chunkmanager.cpp chunkselector.cpp dndfile.cpp \
+ downloadcap.cpp downloader.cpp globals.cpp httptracker.cpp ipblocklist.cpp \
+ movedatafilesjob.cpp multifilecache.cpp newchokealgorithm.cpp packet.cpp packetreader.cpp \
+ packetwriter.cpp peer.cpp peerdownloader.cpp peerid.cpp peermanager.cpp \
+ peersourcemanager.cpp peeruploader.cpp piece.cpp preallocationthread.cpp queuemanager.cpp \
+ request.cpp server.cpp serverauthenticate.cpp singlefilecache.cpp \
+ speedestimater.cpp statsfile.cpp timeestimator.cpp torrent.cpp torrentcontrol.cpp \
+ torrentcreator.cpp torrentfile.cpp tracker.cpp udptracker.cpp udptrackersocket.cpp \
+ uploadcap.cpp uploader.cpp upspeedestimater.cpp utpex.cpp value.cpp
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/libktorrent/torrent/advancedchokealgorithm.cpp b/libktorrent/torrent/advancedchokealgorithm.cpp
new file mode 100644
index 0000000..7ca0578
--- /dev/null
+++ b/libktorrent/torrent/advancedchokealgorithm.cpp
@@ -0,0 +1,259 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <util/functions.h>
+#include <interfaces/torrentinterface.h>
+#include "chunkmanager.h"
+#include "peer.h"
+#include "peermanager.h"
+#include "packetwriter.h"
+#include "advancedchokealgorithm.h"
+
+using namespace kt;
+
+namespace bt
+{
+
+
+ const Uint32 OPT_SEL_INTERVAL = 30*1000; // we switch optimistic peer each 30 seconds
+ const double NEWBIE_BONUS = 1.0;
+ const double SNUB_PENALTY = 10.0;
+ const double ONE_MB = 1024*1024;
+
+
+ AdvancedChokeAlgorithm::AdvancedChokeAlgorithm()
+ : ChokeAlgorithm()
+ {
+ last_opt_sel_time = 0;
+ }
+
+
+ AdvancedChokeAlgorithm::~AdvancedChokeAlgorithm()
+ {}
+
+ bool AdvancedChokeAlgorithm::calcACAScore(Peer* p,ChunkManager & cman,const kt::TorrentStats & stats)
+ {
+ const PeerInterface::Stats & s = p->getStats();
+ if (p->isSeeder())
+ {
+ /*
+ double bd = 0;
+ if (stats.trk_bytes_downloaded > 0)
+ bd = s.bytes_downloaded / stats.trk_bytes_downloaded;
+ double ds = 0;
+ if (stats.download_rate > 0)
+ ds = s.download_rate/ stats.download_rate;
+ p->setACAScore(5*bd + 5*ds);
+ */
+ p->setACAScore(0.0);
+ return false;
+ }
+
+ bool should_be_interested = false;
+ bool should_we_be_interested = false;
+ // before we start calculating first check if we have piece that the peer doesn't have
+ const BitSet & ours = cman.getBitSet();
+ const BitSet & theirs = p->getBitSet();
+ for (Uint32 i = 0;i < ours.getNumBits();i++)
+ {
+ if (ours.get(i) && !theirs.get(i))
+ {
+ should_be_interested = true;
+ break;
+ }
+ }
+
+ if (!should_be_interested || !p->isInterested())
+ {
+ // not interseted so it doesn't make sense to unchoke it
+ p->setACAScore(-50.0);
+ return false;
+ }
+
+
+
+ double nb = 0.0; // newbie bonus
+ double cp = 0.0; // choke penalty
+ double sp = 0.0; // snubbing penalty
+ double lb = s.local ? 10.0 : 0.0; // local peers get a bonus of 10
+ double bd = s.bytes_downloaded; // bytes downloaded
+ double tbd = stats.trk_bytes_downloaded; // total bytes downloaded
+ double ds = s.download_rate; // current download rate
+ double tds = stats.download_rate; // total download speed
+
+ // if the peer has less than 1 MB or 0.5 % of the torrent it is a newbie
+ if (p->percentAvailable() < 0.5 && stats.total_bytes * p->percentAvailable() < 1024*1024)
+ {
+ nb = NEWBIE_BONUS;
+ }
+
+ if (p->isChoked())
+ {
+ cp = NEWBIE_BONUS; // cp cancels out newbie bonus
+ }
+
+ // if the evil bit is on (!choked, snubbed and requests have timed out)
+ if (s.evil)
+ {
+ sp = SNUB_PENALTY;
+ }
+
+ // NB + K * (BD/TBD) - CP - SP + L * (DS / TDS)
+ double K = 5.0;
+ double L = 5.0;
+ double aca = lb + nb + (tbd > 0 ? K * (bd/tbd) : 0.0) + (tds > 0 ? L* (ds / tds) : 0.0) - cp - sp;
+
+ p->setACAScore(aca);
+ return true;
+ }
+
+ static int ACACmp(Peer* a,Peer* b)
+ {
+ if (a->getStats().aca_score < b->getStats().aca_score)
+ return 1;
+ else if (a->getStats().aca_score > b->getStats().aca_score)
+ return -1;
+ else
+ return 0;
+ }
+
+
+ void AdvancedChokeAlgorithm::doChokingLeechingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats)
+ {
+ PeerPtrList ppl;
+ Uint32 np = pman.getNumConnectedPeers();
+ // add all non seeders
+ for (Uint32 i = 0;i < np;i++)
+ {
+ Peer* p = pman.getPeer(i);
+ if (p)
+ {
+ if (calcACAScore(p,cman,stats))
+ ppl.append(p);
+ else
+ // choke seeders they do not want to download from us anyway
+ p->choke();
+ }
+ }
+
+ // sort list by ACA score
+ ppl.setCompareFunc(ACACmp);
+ ppl.sort();
+
+ doUnchoking(ppl,updateOptimisticPeer(pman,ppl));
+ }
+
+ void AdvancedChokeAlgorithm::doUnchoking(PeerPtrList & ppl,Peer* poup)
+ {
+ // Get the number of upload slots
+ Uint32 num_slots = Choker::getNumUploadSlots();
+ // Do the choking and unchoking
+ Uint32 num_unchoked = 0;
+ for (Uint32 i = 0;i < ppl.count();i++)
+ {
+ Peer* p = ppl.at(i);
+ if (!poup && num_unchoked < num_slots)
+ {
+ p->getPacketWriter().sendUnchoke();
+ num_unchoked++;
+ }
+ else if (num_unchoked < num_slots -1 || p == poup)
+ {
+ p->getPacketWriter().sendUnchoke();
+ if (p != poup)
+ num_unchoked++;
+ }
+ else
+ {
+ p->choke();
+ }
+ }
+ }
+
+ static int UpRateCmp(Peer* a,Peer* b)
+ {
+ if (a->getStats().upload_rate < b->getStats().upload_rate)
+ return -1;
+ else if (a->getStats().upload_rate > b->getStats().upload_rate)
+ return 1;
+ else
+ return 0;
+ }
+
+ void AdvancedChokeAlgorithm::doChokingSeedingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats)
+ {
+ PeerPtrList ppl;
+ Uint32 np = pman.getNumConnectedPeers();
+ // add all non seeders
+ for (Uint32 i = 0;i < np;i++)
+ {
+ Peer* p = pman.getPeer(i);
+ if (p)
+ {
+ // update the ACA score in the process
+ if (calcACAScore(p,cman,stats))
+ ppl.append(p);
+ else
+ // choke seeders they do not want to download from us anyway
+ p->choke();
+ }
+ }
+
+ ppl.setCompareFunc(UpRateCmp);
+ ppl.sort();
+
+ doUnchoking(ppl,updateOptimisticPeer(pman,ppl));
+ }
+
+ static Uint32 FindPlannedOptimisticUnchokedPeer(PeerManager& pman,const PeerPtrList & ppl)
+ {
+ Uint32 num_peers = pman.getNumConnectedPeers();
+ if (num_peers == 0)
+ return UNDEFINED_ID;
+
+ // find a random peer that is choked and interested
+ Uint32 start = rand() % num_peers;
+ Uint32 i = (start + 1) % num_peers;
+ while (i != start)
+ {
+ Peer* p = pman.getPeer(i);
+ if (p && p->isChoked() && p->isInterested() && !p->isSeeder() && ppl.contains(p))
+ return p->getID();
+ i = (i + 1) % num_peers;
+ }
+
+ // we do not expect to have 4 billion peers
+ return UNDEFINED_ID;
+ }
+
+ Peer* AdvancedChokeAlgorithm::updateOptimisticPeer(PeerManager & pman,const PeerPtrList & ppl)
+ {
+ // get the planned optimistic unchoked peer and change it if necessary
+ Peer* poup = pman.findPeer(opt_unchoked_peer_id);
+ TimeStamp now = GetCurrentTime();
+ if (now - last_opt_sel_time > OPT_SEL_INTERVAL || !poup)
+ {
+ opt_unchoked_peer_id = FindPlannedOptimisticUnchokedPeer(pman,ppl);
+ last_opt_sel_time = now;
+ poup = pman.findPeer(opt_unchoked_peer_id);
+ }
+ return poup;
+ }
+}
diff --git a/libktorrent/torrent/advancedchokealgorithm.h b/libktorrent/torrent/advancedchokealgorithm.h
new file mode 100644
index 0000000..f8a1086
--- /dev/null
+++ b/libktorrent/torrent/advancedchokealgorithm.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTADVANCEDCHOKEALGORITHM_H
+#define BTADVANCEDCHOKEALGORITHM_H
+
+#include "choker.h"
+
+namespace bt
+{
+ class Peer;
+ class PeerPtrList;
+
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class AdvancedChokeAlgorithm : public ChokeAlgorithm
+ {
+ TimeStamp last_opt_sel_time; // last time we updated the optimistic unchoked peer
+ public:
+ AdvancedChokeAlgorithm();
+ virtual ~AdvancedChokeAlgorithm();
+
+ virtual void doChokingLeechingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats);
+ virtual void doChokingSeedingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats);
+
+ private:
+ bool calcACAScore(Peer* p,ChunkManager & cman,const kt::TorrentStats & stats);
+ Peer* updateOptimisticPeer(PeerManager & pman,const PeerPtrList & ppl);
+ void doUnchoking(PeerPtrList & ppl,Peer* poup);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/announcelist.cpp b/libktorrent/torrent/announcelist.cpp
new file mode 100644
index 0000000..74b3397
--- /dev/null
+++ b/libktorrent/torrent/announcelist.cpp
@@ -0,0 +1,195 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#if 0
+#include "announcelist.h"
+#include "bnode.h"
+#include <util/error.h>
+#include "globals.h"
+#include <util/log.h>
+
+#include <klocale.h>
+#include <qstringlist.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+namespace bt
+{
+
+ AnnounceList::AnnounceList()
+ :m_datadir(QString::null)
+ {
+ curr = 0;
+ }
+
+
+ AnnounceList::~AnnounceList()
+ {
+ saveTrackers();
+ }
+
+ void AnnounceList::load(BNode* node)
+ {
+ BListNode* ml = dynamic_cast<BListNode*>(node);
+ if (!ml)
+ return;
+
+ //ml->printDebugInfo();
+ for (Uint32 i = 0;i < ml->getNumChildren();i++)
+ {
+ BListNode* url = dynamic_cast<BListNode*>(ml->getChild(i));
+ if (!url)
+ throw Error(i18n("Parse Error"));
+
+ for (Uint32 j = 0;j < url->getNumChildren();j++)
+ {
+ BValueNode* vn = dynamic_cast<BValueNode*>(url->getChild(j));
+ if (!vn)
+ throw Error(i18n("Parse Error"));
+
+ KURL url(vn->data().toString().stripWhiteSpace());
+ trackers.append(url);
+ //Out() << "Added tracker " << url << endl;
+ }
+ }
+ }
+
+ const KURL::List AnnounceList::getTrackerURLs()
+ {
+ KURL::List complete(trackers);
+ complete += custom_trackers;
+ return complete;
+ }
+
+ void AnnounceList::addTracker(KURL url, bool custom)
+ {
+ if(custom)
+ custom_trackers.append(url);
+ else
+ trackers.append(url);
+ }
+
+ bool AnnounceList::removeTracker(KURL url)
+ {
+ KURL::List::iterator i = custom_trackers.find(url);
+ if(i != custom_trackers.end())
+ {
+ custom_trackers.remove(i);
+ return true;
+ }
+ else
+ return false;
+ }
+
+ KURL AnnounceList::getTrackerURL(bool last_was_succesfull) const
+ {
+ int defaults = trackers.count();
+ int customs = custom_trackers.count();
+ int total = defaults + customs;
+
+ if (total == 0)
+ return KURL(); // return invalid url is there are no trackers
+
+ if (last_was_succesfull)
+ return curr < defaults ? *trackers.at(curr) : *custom_trackers.at(curr % customs);
+
+ curr = (curr + 1) % total;
+ return curr < defaults ? *trackers.at(curr) : *custom_trackers.at(curr % customs);
+ }
+
+ void AnnounceList::debugPrintURLList()
+ {
+ Out() << "Announce List : " << endl;
+ for (KURL::List::iterator i = trackers.begin();i != trackers.end();i++)
+ Out() << "URL : " << *i << endl;
+ }
+
+ void AnnounceList::saveTrackers()
+ {
+ QFile file(m_datadir + "trackers");
+ if(!file.open(IO_WriteOnly))
+ return;
+
+ QTextStream stream(&file);
+ for (KURL::List::iterator i = custom_trackers.begin();i != custom_trackers.end();i++)
+ stream << (*i).prettyURL() << ::endl;
+ file.close();
+ }
+
+ void AnnounceList::loadTrackers()
+ {
+ QFile file(m_datadir + "trackers");
+ if(!file.open(IO_ReadOnly))
+ return;
+
+ QTextStream stream(&file);
+ while (!stream.atEnd())
+ {
+ KURL url(stream.readLine().stripWhiteSpace());
+ custom_trackers.append(url);
+ }
+
+ file.close();
+ }
+
+ void AnnounceList::setDatadir(const QString& theValue)
+ {
+ m_datadir = theValue;
+ loadTrackers();
+ }
+
+ void AnnounceList::setTracker(KURL url)
+ {
+ int defaults = trackers.count();
+ int customs = custom_trackers.count();
+ int total = defaults + customs;
+
+ int backup = curr;
+
+ for(curr=0; curr<defaults; ++curr)
+ {
+ if( *trackers.at(curr) == url )
+ return;
+ }
+
+ for( ; curr<total; ++curr)
+ {
+ if( *custom_trackers.at(curr % customs) == url )
+ return;
+ }
+
+ curr = backup;
+ }
+
+ void AnnounceList::restoreDefault()
+ {
+ curr = 0;
+ }
+
+ void AnnounceList::merge(const AnnounceList* al)
+ {
+ for (Uint32 i = 0;i < al->getNumTrackerURLs();i++)
+ {
+ KURL url = *al->trackers.at(i);
+ if (!trackers.contains(url) && !custom_trackers.contains(url))
+ custom_trackers.append(url);
+ }
+ }
+}
+#endif
diff --git a/libktorrent/torrent/announcelist.h b/libktorrent/torrent/announcelist.h
new file mode 100644
index 0000000..38f9e72
--- /dev/null
+++ b/libktorrent/torrent/announcelist.h
@@ -0,0 +1,107 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTANNOUNCELIST_H
+#define BTANNOUNCELIST_H
+
+#if 0
+#include <kurl.h>
+#include <qstring.h>
+#include <interfaces/trackerslist.h>
+
+namespace bt
+{
+ class BNode;
+
+ /**
+ * @author Joris Guisson
+ * @brief Keep track of a list of trackers
+ *
+ * This class keeps track of a list of tracker URL.
+ */
+ class AnnounceList : public kt::TrackersList
+ {
+ KURL::List trackers;
+ KURL::List custom_trackers;
+
+ public:
+ AnnounceList();
+ virtual ~AnnounceList();
+
+ /**
+ * Load the list from a bencoded list of lists.
+ * @param node The BNode
+ */
+ void load(BNode* node);
+
+ /**
+ * Get a new tracker url.
+ * @param last_was_succesfull Wether or not the last url was succesfull
+ * @return An URL
+ */
+ KURL getTrackerURL(bool last_was_succesfull) const;
+
+
+ ///Gets a list of trackers (URLs)
+ const KURL::List getTrackerURLs();
+
+ ///Adds new tracker URL to the list
+ void addTracker(KURL url, bool custom = true);
+
+ /**
+ * Removes a tracker from the list
+ * @param url Tracker URL to remove from custom trackers list.
+ * @returns TRUE if URL is in custom list and it is removed or FALSE if it could not be removed or it's a default tracker
+ */
+ bool removeTracker(KURL url);
+
+ ///Changes current tracker
+ void setTracker(KURL url);
+
+ ///Restores the default torrent tracker
+ void restoreDefault();
+
+ /// Get the number of tracker URLs
+ unsigned int getNumTrackerURLs() const {return trackers.count();}
+
+ void debugPrintURLList();
+
+ ///Saves custom trackers in a file
+ void saveTrackers();
+
+ ///Loads custom trackers from a file
+ void loadTrackers();
+
+ void setDatadir(const QString& theValue);
+
+ /**
+ * Merge an other announce list to this one.
+ * @param al The AnnounceList
+ */
+ void merge(const AnnounceList* al);
+
+ private:
+ QString m_datadir;
+
+ };
+
+}
+#endif
+
+#endif
diff --git a/libktorrent/torrent/authenticate.cpp b/libktorrent/torrent/authenticate.cpp
new file mode 100644
index 0000000..14e34ea
--- /dev/null
+++ b/libktorrent/torrent/authenticate.cpp
@@ -0,0 +1,156 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <mse/streamsocket.h>
+#include "authenticate.h"
+#include "ipblocklist.h"
+#include "peermanager.h"
+
+namespace bt
+{
+
+ Authenticate::Authenticate(const QString & ip,Uint16 port,
+ const SHA1Hash & info_hash,const PeerID & peer_id,PeerManager* pman)
+ : info_hash(info_hash),our_peer_id(peer_id),pman(pman)
+ {
+ finished = succes = false;
+ sock = new mse::StreamSocket();
+ host = ip;
+ this->port = port;
+
+ Out(SYS_CON|LOG_NOTICE) << "Initiating connection to " << host << endl;
+
+ if (sock->connectTo(host,port))
+ {
+ connected();
+ }
+ else if (sock->connecting())
+ {
+ // do nothing the monitor will notify us when we are connected
+ }
+ else
+ {
+ onFinish(false);
+ }
+ }
+
+ Authenticate::~Authenticate()
+ {
+ }
+
+ void Authenticate::onReadyWrite()
+ {
+// Out() << "Authenticate::onReadyWrite()" << endl;
+ if (sock->connectSuccesFull())
+ {
+ connected();
+ }
+ else
+ {
+ onFinish(false);
+ }
+ }
+
+ void Authenticate::connected()
+ {
+ sendHandshake(info_hash,our_peer_id);
+ }
+
+ void Authenticate::onFinish(bool succes)
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Authentication to " << host << " : " << (succes ? "ok" : "failure") << endl;
+ finished = true;
+ this->succes = succes;
+
+ if (!succes)
+ {
+ sock->deleteLater();
+ sock = 0;
+ }
+ timer.stop();
+ if (pman)
+ pman->peerAuthenticated(this,succes);
+ }
+
+ void Authenticate::handshakeRecieved(bool full)
+ {
+ const Uint8* hs = handshake;
+ // Out() << "Authenticate::handshakeRecieved" << endl;
+ IPBlocklist& ipfilter = IPBlocklist::instance();
+ //Out() << "Dodo " << pp.ip << endl;
+ if (ipfilter.isBlocked(host))
+ {
+ onFinish(false);
+ return;
+ }
+
+ SHA1Hash rh(hs+28);
+ if (rh != info_hash)
+ {
+ Out() << "Wrong info_hash : " << rh.toString() << endl;
+ onFinish(false);
+ return;
+ }
+
+ char tmp[21];
+ tmp[20] = '\0';
+ memcpy(tmp,hs+48,20);
+ peer_id = PeerID(tmp);
+
+ if (our_peer_id == peer_id /*|| peer_id.startsWith("Yoda")*/)
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Lets not connect to our selves " << endl;
+ onFinish(false);
+ return;
+ }
+
+ // check if we aren't already connected to the client
+ if (pman->connectedTo(peer_id))
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Already connected to " << peer_id.toString() << endl;
+ onFinish(false);
+ return;
+ }
+
+ // only finish when the handshake was fully received
+ if (full)
+ onFinish(true);
+ }
+
+
+ mse::StreamSocket* Authenticate::takeSocket()
+ {
+ mse::StreamSocket* s = sock;
+ sock = 0;
+ return s;
+ }
+
+ void Authenticate::onPeerManagerDestroyed()
+ {
+ // Out(SYS_CON|LOG_NOTICE) << "Authenticate::onPeerManagerDestroyed()" << endl;
+ pman = 0;
+ if (finished)
+ return;
+
+ onFinish(false);
+ }
+
+}
+#include "authenticate.moc"
diff --git a/libktorrent/torrent/authenticate.h b/libktorrent/torrent/authenticate.h
new file mode 100644
index 0000000..03c8d75
--- /dev/null
+++ b/libktorrent/torrent/authenticate.h
@@ -0,0 +1,98 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTAUTHENTICATE_H
+#define BTAUTHENTICATE_H
+
+
+#include <util/sha1hash.h>
+#include "authenticatebase.h"
+#include "globals.h"
+#include "peerid.h"
+
+
+namespace bt
+{
+
+
+ class PeerManager;
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Authenicate a peer
+ *
+ * After we connect to a peer,
+ * we need to authenticate the peer. This class handles this.
+ */
+ class Authenticate : public AuthenticateBase
+ {
+ Q_OBJECT
+ public:
+
+ /**
+ * Connect to a remote host first and authenicate it.
+ * @param ip IP-address of host
+ * @param port Port of host
+ * @param info_hash Info hash
+ * @param peer_id Peer ID
+ * @param pman PeerManager
+ */
+ Authenticate(const QString & ip,Uint16 port,
+ const SHA1Hash & info_hash,const PeerID & peer_id,
+ PeerManager* pman);
+
+ virtual ~Authenticate();
+
+ /**
+ * Get a pointer to the socket, and set it internally
+ * to NULL. After a succesfull authentication, this is used
+ * to transfer ownership to a Peer object.
+ * @return The socket
+ */
+ mse::StreamSocket* takeSocket();
+
+ const PeerID & getPeerID() const {return peer_id;}
+
+ /// See if the authentication is succesfull
+ bool isSuccesfull() const {return succes;}
+
+ const QString & getIP() const {return host;}
+ Uint16 getPort() const {return port;}
+
+ protected slots:
+ void onReadyWrite();
+ void onPeerManagerDestroyed();
+
+ protected:
+ void onFinish(bool succes);
+ void handshakeRecieved(bool full);
+ virtual void connected();
+
+ protected:
+ SHA1Hash info_hash;
+ PeerID our_peer_id,peer_id;
+ QString host;
+ Uint16 port;
+ bool succes;
+ PeerManager* pman;
+ };
+}
+
+#endif
diff --git a/libktorrent/torrent/authenticatebase.cpp b/libktorrent/torrent/authenticatebase.cpp
new file mode 100644
index 0000000..9ee2ad7
--- /dev/null
+++ b/libktorrent/torrent/authenticatebase.cpp
@@ -0,0 +1,159 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <mse/streamsocket.h>
+#include <util/sha1hash.h>
+#include <util/log.h>
+#include <kademlia/dhtbase.h>
+#include "globals.h"
+#include "peerid.h"
+#include "authenticatebase.h"
+
+namespace bt
+{
+
+
+
+ AuthenticateBase::AuthenticateBase(mse::StreamSocket* s) : sock(s),finished(false),local(false)
+ {
+ connect(&timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
+ timer.start(20000,true);
+ memset(handshake,0x00,68);
+ bytes_of_handshake_recieved = 0;
+ ext_support = 0;
+ poll_index = -1;
+ }
+
+
+ AuthenticateBase::~AuthenticateBase()
+ {
+ if (sock)
+ sock->deleteLater();
+ }
+
+ void AuthenticateBase::sendHandshake(const SHA1Hash & info_hash,const PeerID & our_peer_id)
+ {
+ // Out() << "AuthenticateBase::sendHandshake" << endl;
+ if (!sock) return;
+
+ Uint8 hs[68];
+ makeHandshake(hs,info_hash,our_peer_id);
+ sock->sendData(hs,68);
+ }
+
+ void AuthenticateBase::makeHandshake(Uint8* hs,const SHA1Hash & info_hash,const PeerID & our_peer_id)
+ {
+ const char* pstr = "BitTorrent protocol";
+ hs[0] = 19;
+ memcpy(hs+1,pstr,19);
+ memset(hs+20,0x00,8);
+ if (Globals::instance().getDHT().isRunning())
+ hs[27] |= 0x01; // DHT support
+
+ hs[25] |= 0x10; // extension protocol
+ hs[27] |= 0x04; // fast extensions
+ memcpy(hs+28,info_hash.getData(),20);
+ memcpy(hs+48,our_peer_id.data(),20);
+ }
+
+ void AuthenticateBase::onReadyRead()
+ {
+ Uint32 ba = sock->bytesAvailable();
+ // Out() << "AuthenticateBase::onReadyRead " << ba << endl;
+ if (ba == 0)
+ {
+ onFinish(false);
+ return;
+ }
+
+ if (!sock || finished || ba < 48)
+ return;
+
+ // first see if we already have some bytes from the handshake
+ if (bytes_of_handshake_recieved == 0)
+ {
+ if (ba < 68)
+ {
+ // read partial
+ sock->readData(handshake,ba);
+ bytes_of_handshake_recieved += ba;
+ if (ba >= 27 && handshake[27] & 0x01)
+ ext_support |= bt::DHT_SUPPORT;
+ // tell subclasses of a partial handshake
+ handshakeRecieved(false);
+ return;
+ }
+ else
+ {
+ // read full handshake
+ sock->readData(handshake,68);
+ }
+ }
+ else
+ {
+ // read remaining part
+ Uint32 to_read = 68 - bytes_of_handshake_recieved;
+ sock->readData(handshake + bytes_of_handshake_recieved,to_read);
+ }
+
+ if (handshake[0] != 19)
+ {
+ onFinish(false);
+ return;
+ }
+
+ const char* pstr = "BitTorrent protocol";
+ if (memcmp(pstr,handshake+1,19) != 0)
+ {
+ onFinish(false);
+ return;
+ }
+
+ if (Globals::instance().getDHT().isRunning() && (handshake[27] & 0x01))
+ ext_support |= bt::DHT_SUPPORT;
+
+ if (handshake[27] & 0x04)
+ ext_support |= bt::FAST_EXT_SUPPORT;
+
+ if (handshake[25] & 0x10)
+ ext_support |= bt::EXT_PROT_SUPPORT;
+
+ handshakeRecieved(true);
+ }
+
+ void AuthenticateBase::onError(int)
+ {
+ if (finished)
+ return;
+ onFinish(false);
+ }
+
+ void AuthenticateBase::onTimeout()
+ {
+ if (finished)
+ return;
+
+ Out(SYS_CON|LOG_DEBUG) << "Timeout occurred" << endl;
+ onFinish(false);
+ }
+
+ void AuthenticateBase::onReadyWrite()
+ {}
+}
+#include "authenticatebase.moc"
diff --git a/libktorrent/torrent/authenticatebase.h b/libktorrent/torrent/authenticatebase.h
new file mode 100644
index 0000000..fdab158
--- /dev/null
+++ b/libktorrent/torrent/authenticatebase.h
@@ -0,0 +1,125 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTAUTHENTICATEBASE_H
+#define BTAUTHENTICATEBASE_H
+
+#include <qobject.h>
+#include <qsocket.h>
+#include <qtimer.h>
+#include <util/constants.h>
+
+
+namespace mse
+{
+ class StreamSocket;
+}
+
+
+namespace bt
+{
+ class SHA1Hash;
+ class PeerID;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Base class for authentication classes. This class just groups
+ * some common stuff between Authenticate and ServerAuthentciate.
+ * It has a socket, handles the timing out, provides a function to send
+ * the handshake.
+ */
+ class AuthenticateBase : public QObject
+ {
+ Q_OBJECT
+ public:
+ AuthenticateBase(mse::StreamSocket* s = 0);
+ virtual ~AuthenticateBase();
+
+ /// Set wether this is a local peer
+ void setLocal(bool loc) {local = loc;}
+
+ /// Is this a local peer
+ bool isLocal() const {return local;}
+
+ /// See if the authentication is finished
+ bool isFinished() const {return finished;}
+
+ /// Flags indicating which extensions are supported
+ Uint32 supportedExtensions() const {return ext_support;}
+
+ /// get teh socket
+ const mse::StreamSocket* getSocket() const {return sock;}
+
+ /// We can read from the socket
+ virtual void onReadyRead();
+
+ /// We can write to the socket (used to detect a succesfull connection)
+ virtual void onReadyWrite();
+
+ int getPollIndex() const {return poll_index;}
+ void setPollIndex(int pi) {poll_index = pi;}
+
+ protected:
+ /**
+ * Send a handshake
+ * @param info_hash The info_hash to include
+ * @param our_peer_id Our PeerID
+ */
+ void sendHandshake(const SHA1Hash & info_hash,const PeerID & our_peer_id);
+
+ /**
+ * Authentication finished.
+ * @param succes Succes or not
+ */
+ virtual void onFinish(bool succes) = 0;
+
+ /**
+ * The other side send a handshake. The first 20 bytes
+ * of the handshake will already have been checked.
+ * @param full Indicates wether we have a full handshake
+ * if this is not full, we should just send our own
+ */
+ virtual void handshakeRecieved(bool full) = 0;
+
+ /**
+ * Fill in the handshake in a buffer.
+ */
+ void makeHandshake(bt::Uint8* buf,const SHA1Hash & info_hash,const PeerID & our_peer_id);
+
+
+
+ protected slots:
+ void onTimeout();
+ void onError(int err);
+
+ protected:
+ mse::StreamSocket* sock;
+ QTimer timer;
+ bool finished;
+ Uint8 handshake[68];
+ Uint32 bytes_of_handshake_recieved;
+ Uint32 ext_support;
+ bool local;
+ int poll_index;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/authenticationmonitor.cpp b/libktorrent/torrent/authenticationmonitor.cpp
new file mode 100644
index 0000000..08215d0
--- /dev/null
+++ b/libktorrent/torrent/authenticationmonitor.cpp
@@ -0,0 +1,149 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <unistd.h>
+#include <sys/poll.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include <mse/streamsocket.h>
+#include "authenticationmonitor.h"
+#include "authenticatebase.h"
+
+#include <util/profiler.h>
+
+
+namespace bt
+{
+ AuthenticationMonitor AuthenticationMonitor::self;
+
+ AuthenticationMonitor::AuthenticationMonitor()
+ {}
+
+
+ AuthenticationMonitor::~AuthenticationMonitor()
+ {
+
+ }
+
+ void AuthenticationMonitor::clear()
+ {
+ std::list<AuthenticateBase*>::iterator itr = auths.begin();
+ while (itr != auths.end())
+ {
+ AuthenticateBase* ab = *itr;
+ if (ab)
+ ab->deleteLater();
+ itr++;
+ }
+ auths.clear();
+ }
+
+
+ void AuthenticationMonitor::add(AuthenticateBase* s)
+ {
+ auths.push_back(s);
+ }
+
+ void AuthenticationMonitor::remove(AuthenticateBase* s)
+ {
+ auths.remove(s);
+ }
+
+ void AuthenticationMonitor::update()
+ {
+ if (auths.size() == 0)
+ return;
+
+ int i = 0;
+
+ std::list<AuthenticateBase*>::iterator itr = auths.begin();
+ while (itr != auths.end())
+ {
+ AuthenticateBase* ab = *itr;
+ if (!ab || ab->isFinished())
+ {
+ if (ab)
+ ab->deleteLater();
+
+ itr = auths.erase(itr);
+ }
+ else
+ {
+ ab->setPollIndex(-1);
+ if (ab->getSocket() && ab->getSocket()->fd() >= 0)
+ {
+ int fd = ab->getSocket()->fd();
+ if (i >= fd_vec.size())
+ {
+ struct pollfd pfd = {-1,0,0};
+ fd_vec.push_back(pfd);
+ }
+
+ struct pollfd & pfd = fd_vec[i];
+ pfd.fd = fd;
+ pfd.revents = 0;
+ if (!ab->getSocket()->connecting())
+ pfd.events = POLLIN;
+ else
+ pfd.events = POLLOUT;
+ ab->setPollIndex(i);
+ i++;
+ }
+ itr++;
+ }
+ }
+
+ if (poll(&fd_vec[0],i,1) > 0)
+ {
+ handleData();
+ }
+ }
+
+ void AuthenticationMonitor::handleData()
+ {
+ std::list<AuthenticateBase*>::iterator itr = auths.begin();
+ while (itr != auths.end())
+ {
+ AuthenticateBase* ab = *itr;
+ if (ab && ab->getSocket() && ab->getSocket()->fd() >= 0 && ab->getPollIndex() >= 0)
+ {
+ int pi = ab->getPollIndex();
+ if (fd_vec[pi].revents & POLLIN)
+ {
+ ab->onReadyRead();
+ }
+ else if (fd_vec[pi].revents & POLLOUT)
+ {
+ ab->onReadyWrite();
+ }
+ }
+
+ if (!ab || ab->isFinished())
+ {
+ if (ab)
+ ab->deleteLater();
+ itr = auths.erase(itr);
+ }
+ else
+ itr++;
+ }
+ }
+
+}
diff --git a/libktorrent/torrent/authenticationmonitor.h b/libktorrent/torrent/authenticationmonitor.h
new file mode 100644
index 0000000..43a4ebb
--- /dev/null
+++ b/libktorrent/torrent/authenticationmonitor.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTAUTHENTICATIONMONITOR_H
+#define BTAUTHENTICATIONMONITOR_H
+
+#include <list>
+#include <vector>
+
+struct pollfd;
+
+namespace bt
+{
+ class AuthenticateBase;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Monitors ongoing authentication attempts. This class is a singleton.
+ */
+ class AuthenticationMonitor
+ {
+ std::list<AuthenticateBase*> auths;
+ std::vector<struct pollfd> fd_vec;
+
+ static AuthenticationMonitor self;
+
+ AuthenticationMonitor();
+ public:
+
+ virtual ~AuthenticationMonitor();
+
+
+ /**
+ * Add a new AuthenticateBase object.
+ * @param s
+ */
+ void add(AuthenticateBase* s);
+
+ /**
+ * Remove an AuthenticateBase object
+ * @param s
+ */
+ void remove(AuthenticateBase* s);
+
+ /**
+ * Check all AuthenticateBase objects.
+ */
+ void update();
+
+ /**
+ * Clear all AuthenticateBase objects, also delets them
+ */
+ void clear();
+
+ static AuthenticationMonitor & instance() {return self;}
+
+ private:
+ void handleData();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/bdecoder.cpp b/libktorrent/torrent/bdecoder.cpp
new file mode 100644
index 0000000..6c5a179
--- /dev/null
+++ b/libktorrent/torrent/bdecoder.cpp
@@ -0,0 +1,224 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/error.h>
+#include <klocale.h>
+#include "bdecoder.h"
+#include "bnode.h"
+#include "globals.h"
+
+namespace bt
+{
+
+ BDecoder::BDecoder(const QByteArray & data,bool verbose,Uint32 off)
+ : data(data),pos(off),verbose(verbose)
+ {
+ }
+
+
+ BDecoder::~BDecoder()
+ {}
+
+ BNode* BDecoder::decode()
+ {
+ if (pos >= data.size())
+ return 0;
+
+ if (data[pos] == 'd')
+ {
+ return parseDict();
+ }
+ else if (data[pos] == 'l')
+ {
+ return parseList();
+ }
+ else if (data[pos] == 'i')
+ {
+ return parseInt();
+ }
+ else if (data[pos] >= '0' && data[pos] <= '9')
+ {
+ return parseString();
+ }
+ else
+ {
+ throw Error(i18n("Illegal token: %1").arg(data[pos]));
+ }
+ }
+
+ BDictNode* BDecoder::parseDict()
+ {
+ Uint32 off = pos;
+ // we're now entering a dictionary
+ BDictNode* curr = new BDictNode(off);
+ pos++;
+ if (verbose) Out() << "DICT" << endl;
+ try
+ {
+ while (pos < data.size() && data[pos] != 'e')
+ {
+ if (verbose) Out() << "Key : " << endl;
+ BNode* kn = decode();
+ BValueNode* k = dynamic_cast<BValueNode*>(kn);
+ if (!k || k->data().getType() != Value::STRING)
+ {
+ delete kn;
+ throw Error(i18n("Decode error"));
+ }
+
+ QByteArray key = k->data().toByteArray();
+ delete kn;
+
+ BNode* data = decode();
+ curr->insert(key,data);
+ }
+ pos++;
+ }
+ catch (...)
+ {
+ delete curr;
+ throw;
+ }
+ if (verbose) Out() << "END" << endl;
+ curr->setLength(pos - off);
+ return curr;
+ }
+
+ BListNode* BDecoder::parseList()
+ {
+ Uint32 off = pos;
+ if (verbose) Out() << "LIST" << endl;
+ BListNode* curr = new BListNode(off);
+ pos++;
+ try
+ {
+ while (pos < data.size() && data[pos] != 'e')
+ {
+ BNode* n = decode();
+ curr->append(n);
+ }
+ pos++;
+ }
+ catch (...)
+ {
+ delete curr;
+ throw;
+ }
+ if (verbose) Out() << "END" << endl;
+ curr->setLength(pos - off);
+ return curr;
+ }
+
+ BValueNode* BDecoder::parseInt()
+ {
+ Uint32 off = pos;
+ pos++;
+ QString n;
+ // look for e and add everything between i and e to n
+ while (pos < data.size() && data[pos] != 'e')
+ {
+ n += data[pos];
+ pos++;
+ }
+
+ // check if we aren't at the end of the data
+ if (pos >= data.size())
+ {
+ throw Error(i18n("Unexpected end of input"));
+ }
+
+ // try to decode the int
+ bool ok = true;
+ int val = 0;
+ val = n.toInt(&ok);
+ if (ok)
+ {
+ pos++;
+ if (verbose) Out() << "INT = " << val << endl;
+ BValueNode* vn = new BValueNode(Value(val),off);
+ vn->setLength(pos - off);
+ return vn;
+ }
+ else
+ {
+ Int64 bi = 0LL;
+ bi = n.toLongLong(&ok);
+ if (!ok)
+ throw Error(i18n("Cannot convert %1 to an int").arg(n));
+
+ pos++;
+ if (verbose) Out() << "INT64 = " << n << endl;
+ BValueNode* vn = new BValueNode(Value(bi),off);
+ vn->setLength(pos - off);
+ return vn;
+ }
+ }
+
+ BValueNode* BDecoder::parseString()
+ {
+ Uint32 off = pos;
+ // string are encoded 4:spam (length:string)
+
+ // first get length by looking for the :
+ QString n;
+ while (pos < data.size() && data[pos] != ':')
+ {
+ n += data[pos];
+ pos++;
+ }
+ // check if we aren't at the end of the data
+ if (pos >= data.size())
+ {
+ throw Error(i18n("Unexpected end of input"));
+ }
+
+ // try to decode length
+ bool ok = true;
+ int len = 0;
+ len = n.toInt(&ok);
+ if (!ok)
+ {
+ throw Error(i18n("Cannot convert %1 to an int").arg(n));
+ }
+ // move pos to the first part of the string
+ pos++;
+ if (pos + len > data.size())
+ throw Error(i18n("Torrent is incomplete!"));
+
+ QByteArray arr(len);
+ for (unsigned int i = pos;i < pos + len;i++)
+ arr.at(i-pos) = data[i];
+ pos += len;
+ // read the string into n
+
+ // pos should be positioned right after the string
+ BValueNode* vn = new BValueNode(Value(arr),off);
+ vn->setLength(pos - off);
+ if (verbose)
+ {
+ if (arr.size() < 200)
+ Out() << "STRING " << QString(arr) << endl;
+ else
+ Out() << "STRING " << "really long string" << endl;
+ }
+ return vn;
+ }
+}
+
diff --git a/libktorrent/torrent/bdecoder.h b/libktorrent/torrent/bdecoder.h
new file mode 100644
index 0000000..dfffce5
--- /dev/null
+++ b/libktorrent/torrent/bdecoder.h
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTBDECODER_H
+#define BTBDECODER_H
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace bt
+{
+
+ class BNode;
+ class BListNode;
+ class BDictNode;
+ class BValueNode;
+
+ /**
+ * @author Joris Guisson
+ * @brief Decodes b-encoded data
+ *
+ * Class to decode b-encoded data.
+ */
+ class BDecoder
+ {
+ const QByteArray & data;
+ Uint32 pos;
+ bool verbose;
+ public:
+ /**
+ * Constructor, passes in the data to decode.
+ * @param data The data
+ * @param verbose Verbose output to the log
+ * @param off Offset to start parsing
+ */
+ BDecoder(const QByteArray & data,bool verbose,Uint32 off = 0);
+ virtual ~BDecoder();
+
+ /**
+ * Decode the data, the root node gets
+ * returned. (Note that the caller must delete this node)
+ * @return The root node
+ */
+ BNode* decode();
+ private:
+ BDictNode* parseDict();
+ BListNode* parseList();
+ BValueNode* parseInt();
+ BValueNode* parseString();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/bencoder.cpp b/libktorrent/torrent/bencoder.cpp
new file mode 100644
index 0000000..e4a80a0
--- /dev/null
+++ b/libktorrent/torrent/bencoder.cpp
@@ -0,0 +1,137 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "bencoder.h"
+#include <util/file.h>
+
+namespace bt
+{
+
+
+ BEncoderFileOutput::BEncoderFileOutput(File* fptr) : fptr(fptr)
+ {
+ }
+
+ void BEncoderFileOutput::write(const char* str,Uint32 len)
+ {
+ if (!fptr)
+ return;
+
+ fptr->write(str,len);
+ }
+
+ ////////////////////////////////////
+
+ BEncoderBufferOutput::BEncoderBufferOutput(QByteArray & data) : data(data),ptr(0)
+ {
+ }
+
+ void BEncoderBufferOutput::write(const char* str,Uint32 len)
+ {
+ if (ptr + len > data.size())
+ data.resize(ptr + len);
+
+ for (Uint32 i = 0;i < len;i++)
+ data[ptr++] = str[i];
+ }
+
+ ////////////////////////////////////
+
+ BEncoder::BEncoder(File* fptr) : out(0),del(true)
+ {
+ out = new BEncoderFileOutput(fptr);
+ }
+
+ BEncoder::BEncoder(BEncoderOutput* out) : out(out),del(true)
+ {
+ }
+
+
+ BEncoder::~BEncoder()
+ {
+ if (del)
+ delete out;
+ }
+
+ void BEncoder::beginDict()
+ {
+ if (!out) return;
+
+ out->write("d",1);
+ }
+
+ void BEncoder::beginList()
+ {
+ if (!out) return;
+
+ out->write("l",1);
+ }
+
+ void BEncoder::write(Uint32 val)
+ {
+ if (!out) return;
+
+ QCString s = QString("i%1e").arg(val).utf8();
+ out->write(s,s.length());
+ }
+
+ void BEncoder::write(Uint64 val)
+ {
+ if (!out) return;
+
+ QCString s = QString("i%1e").arg(val).utf8();
+ out->write(s,s.length());
+ }
+
+ void BEncoder::write(const QString & str)
+ {
+ if (!out) return;
+
+ QCString u = str.utf8();
+ QCString s = QString("%1:").arg(u.length()).utf8();
+ out->write(s,s.length());
+ out->write(u,u.length());
+ }
+
+ void BEncoder::write(const QByteArray & data)
+ {
+ if (!out) return;
+
+ QCString s = QString::number(data.size()).utf8();
+ out->write(s,s.length());
+ out->write(":",1);
+ out->write(data.data(),data.size());
+ }
+
+ void BEncoder::write(const Uint8* data,Uint32 size)
+ {
+ if (!out) return;
+
+ QCString s = QString("%1:").arg(size).utf8();
+ out->write(s,s.length());
+ out->write((const char*)data,size);
+ }
+
+ void BEncoder::end()
+ {
+ if (!out) return;
+
+ out->write("e",1);
+ }
+}
diff --git a/libktorrent/torrent/bencoder.h b/libktorrent/torrent/bencoder.h
new file mode 100644
index 0000000..8760d14
--- /dev/null
+++ b/libktorrent/torrent/bencoder.h
@@ -0,0 +1,150 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTBENCODER_H
+#define BTBENCODER_H
+
+
+#include <util/file.h>
+
+
+namespace bt
+{
+ class File;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Interface for classes which wish to receive the output from a BEncoder.
+ */
+ class BEncoderOutput
+ {
+ public:
+ virtual ~BEncoderOutput() {}
+ /**
+ * Write a string of characters.
+ * @param str The string
+ * @param len The length of the string
+ */
+ virtual void write(const char* str,Uint32 len) = 0;
+ };
+
+ /**
+ * Writes the output of a bencoder to a file
+ */
+ class BEncoderFileOutput : public BEncoderOutput
+ {
+ File* fptr;
+ public:
+ BEncoderFileOutput(File* fptr);
+
+ void write(const char* str,Uint32 len);
+ };
+
+ /**
+ * Write the output of a BEncoder to a QByteArray
+ */
+ class BEncoderBufferOutput : public BEncoderOutput
+ {
+ QByteArray & data;
+ Uint32 ptr;
+ public:
+ BEncoderBufferOutput(QByteArray & data);
+
+ void write(const char* str,Uint32 len);
+ };
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Helper class to b-encode stuff.
+ *
+ * This class b-encodes data. For more details about b-encoding, see
+ * the BitTorrent protocol docs. The data gets written to a BEncoderOutput
+ * thing.
+ */
+ class BEncoder
+ {
+ BEncoderOutput* out;
+ bool del;
+ public:
+ /**
+ * Constructor, output gets written to a file.
+ * @param fptr The File to write to
+ */
+ BEncoder(File* fptr);
+
+
+ /**
+ * Constructor, output gets written to a BEncoderOutput object.
+ * @param out The BEncoderOutput
+ */
+ BEncoder(BEncoderOutput* out);
+ virtual ~BEncoder();
+
+ /**
+ * Begin a dictionary.Should have a corresponding end call.
+ */
+ void beginDict();
+
+ /**
+ * Begin a list. Should have a corresponding end call.
+ */
+ void beginList();
+
+ /**
+ * Write an int
+ * @param val
+ */
+ void write(Uint32 val);
+
+ /**
+ * Write an int64
+ * @param val
+ */
+ void write(Uint64 val);
+
+ /**
+ * Write a string
+ * @param str
+ */
+ void write(const QString & str);
+
+ /**
+ * Write a QByteArray
+ * @param data
+ */
+ void write(const QByteArray & data);
+
+ /**
+ * Write a data array
+ * @param data
+ * @param size of data
+ */
+ void write(const Uint8* data,Uint32 size);
+
+ /**
+ * End a beginDict or beginList call.
+ */
+ void end();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/bnode.cpp b/libktorrent/torrent/bnode.cpp
new file mode 100644
index 0000000..e76dcf3
--- /dev/null
+++ b/libktorrent/torrent/bnode.cpp
@@ -0,0 +1,177 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include "bnode.h"
+#include "globals.h"
+
+namespace bt
+{
+
+ BNode::BNode(Type type,Uint32 off) : type(type),off(off),len(0)
+ {
+ }
+
+
+ BNode::~BNode()
+ {}
+
+ ////////////////////////////////////////////////
+
+ BValueNode::BValueNode(const Value & v,Uint32 off) : BNode(VALUE,off),v(v)
+ {}
+
+ BValueNode::~BValueNode()
+ {}
+
+ void BValueNode::printDebugInfo()
+ {
+ if (v.getType() == Value::INT)
+ Out() << "Value = " << v.toInt() << endl;
+ else
+ Out() << "Value = " << v.toString() << endl;
+ }
+
+ ////////////////////////////////////////////////
+
+ BDictNode::BDictNode(Uint32 off) : BNode(DICT,off)
+ {
+ }
+
+ BDictNode::~BDictNode()
+ {
+ QValueList<DictEntry>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ DictEntry & e = *i;
+ delete e.node;
+ i++;
+ }
+ }
+
+ void BDictNode::insert(const QByteArray & key,BNode* node)
+ {
+ DictEntry entry;
+ entry.key = key;
+ entry.node = node;
+ children.append(entry);
+ }
+
+ BNode* BDictNode::getData(const QString & key)
+ {
+ QValueList<DictEntry>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ DictEntry & e = *i;
+ if (QString(e.key) == key)
+ return e.node;
+ i++;
+ }
+ return 0;
+ }
+
+ BDictNode* BDictNode::getDict(const QByteArray & key)
+ {
+ QValueList<DictEntry>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ DictEntry & e = *i;
+ if (e.key == key)
+ return dynamic_cast<BDictNode*>(e.node);
+ i++;
+ }
+ return 0;
+ }
+
+ BListNode* BDictNode::getList(const QString & key)
+ {
+ BNode* n = getData(key);
+ return dynamic_cast<BListNode*>(n);
+ }
+
+ BDictNode* BDictNode::getDict(const QString & key)
+ {
+ BNode* n = getData(key);
+ return dynamic_cast<BDictNode*>(n);
+ }
+
+ BValueNode* BDictNode::getValue(const QString & key)
+ {
+ BNode* n = getData(key);
+ return dynamic_cast<BValueNode*>(n);
+ }
+
+ void BDictNode::printDebugInfo()
+ {
+ Out() << "DICT" << endl;
+ QValueList<DictEntry>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ DictEntry & e = *i;
+ Out() << QString(e.key) << ": " << endl;
+ e.node->printDebugInfo();
+ i++;
+ }
+ Out() << "END" << endl;
+ }
+
+ ////////////////////////////////////////////////
+
+ BListNode::BListNode(Uint32 off) : BNode(LIST,off)
+ {
+ children.setAutoDelete(true);
+ }
+
+
+ BListNode::~BListNode()
+ {}
+
+
+ void BListNode::append(BNode* node)
+ {
+ children.append(node);
+ }
+
+ BListNode* BListNode::getList(Uint32 idx)
+ {
+ return dynamic_cast<BListNode*>(getChild(idx));
+ }
+
+ BDictNode* BListNode::getDict(Uint32 idx)
+ {
+ return dynamic_cast<BDictNode*>(getChild(idx));
+ }
+
+ BValueNode* BListNode::getValue(Uint32 idx)
+ {
+ return dynamic_cast<BValueNode*>(getChild(idx));
+ }
+
+ void BListNode::printDebugInfo()
+ {
+ Out() << "LIST " << children.count() << endl;
+ for (Uint32 i = 0;i < children.count();i++)
+ {
+ BNode* n = children.at(i);
+ n->printDebugInfo();
+ }
+ Out() << "END" << endl;
+ }
+}
+
diff --git a/libktorrent/torrent/bnode.h b/libktorrent/torrent/bnode.h
new file mode 100644
index 0000000..685291c
--- /dev/null
+++ b/libktorrent/torrent/bnode.h
@@ -0,0 +1,210 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTBNODE_H
+#define BTBNODE_H
+
+#include <qptrlist.h>
+#include <qvaluelist.h>
+#include <util/constants.h>
+#include "value.h"
+
+
+namespace bt
+{
+ class BListNode;
+
+ /**
+ * @author Joris Guisson
+ * @brief Base class for a node in a b-encoded piece of data
+ *
+ * There are 3 possible pieces of data in b-encoded piece of data.
+ * This is the base class for all those 3 things.
+ */
+ class BNode
+ {
+ public:
+ enum Type
+ {
+ VALUE,DICT,LIST
+ };
+
+ /**
+ * Constructor, sets the Type, and the offset into
+ * the data.
+ * @param type Type of node
+ * @param off The offset into the data
+ */
+ BNode(Type type,Uint32 off);
+ virtual ~BNode();
+
+ /// Get the type of node
+ Type getType() const {return type;}
+
+ /// Get the offset in the bytearray where this node starts.
+ Uint32 getOffset() const {return off;}
+
+ /// Get the length this node takes up in the bytearray.
+ Uint32 getLength() const {return len;}
+
+ /// Set the length
+ void setLength(Uint32 l) {len = l;}
+
+ /// Print some debugging info
+ virtual void printDebugInfo() = 0;
+ private:
+ Type type;
+ Uint32 off,len;
+ };
+
+ /**
+ * @author Joris Guisson
+ * @brief Represents a value (string,bytearray or int) in bencoded data
+ *
+ * @todo Use QVariant
+ */
+ class BValueNode : public BNode
+ {
+ Value v;
+ public:
+ BValueNode(const Value & v,Uint32 off);
+ virtual ~BValueNode();
+
+ const Value & data() const {return v;}
+ void printDebugInfo();
+ };
+
+ /**
+ * @author Joris Guisson
+ * @brief Represents a dictionary in bencoded data
+ *
+ */
+ class BDictNode : public BNode
+ {
+ struct DictEntry
+ {
+ QByteArray key;
+ BNode* node;
+ };
+ QValueList<DictEntry> children;
+ public:
+ BDictNode(Uint32 off);
+ virtual ~BDictNode();
+
+ /**
+ * Insert a BNode in the dictionary.
+ * @param key The key
+ * @param node The node
+ */
+ void insert(const QByteArray & key,BNode* node);
+
+ /**
+ * Get a BNode.
+ * @param key The key
+ * @return The node or 0 if there is no node with has key @a key
+ */
+ BNode* getData(const QString & key);
+
+ /**
+ * Get a BListNode.
+ * @param key The key
+ * @return The node or 0 if there is no list node with has key @a key
+ */
+ BListNode* getList(const QString & key);
+
+ /**
+ * Get a BDictNode.
+ * @param key The key
+ * @return The node or 0 if there is no dict node with has key @a key
+ */
+ BDictNode* getDict(const QString & key);
+
+ /**
+ * Get a BDictNode.
+ * @param key The key
+ * @return The node or 0 if there is no dict node with has key @a key
+ */
+ BDictNode* getDict(const QByteArray & key);
+
+ /**
+ * Get a BValueNode.
+ * @param key The key
+ * @return The node or 0 if there is no value node with has key @a key
+ */
+ BValueNode* getValue(const QString & key);
+
+ void printDebugInfo();
+ };
+
+ /**
+ * @author Joris Guisson
+ * @brief Represents a list in bencoded data
+ *
+ */
+ class BListNode : public BNode
+ {
+ QPtrList<BNode> children;
+ public:
+ BListNode(Uint32 off);
+ virtual ~BListNode();
+
+ /**
+ * Append a node to the list.
+ * @param node The node
+ */
+ void append(BNode* node);
+ void printDebugInfo();
+
+ /// Get the number of nodes in the list.
+ Uint32 getNumChildren() const {return children.count();}
+
+ /**
+ * Get a node from the list
+ * @param idx The index
+ * @return The node or 0 if idx is out of bounds
+ */
+ BNode* getChild(Uint32 idx) {return children.at(idx);}
+
+ /**
+ * Get a BListNode.
+ * @param idx The index
+ * @return The node or 0 if the index is out of bounds or the element
+ * at postion @a idx isn't a BListNode.
+ */
+ BListNode* getList(Uint32 idx);
+
+ /**
+ * Get a BDictNode.
+ * @param idx The index
+ * @return The node or 0 if the index is out of bounds or the element
+ * at postion @a idx isn't a BDictNode.
+ */
+ BDictNode* getDict(Uint32 idx);
+
+ /**
+ * Get a BValueNode.
+ * @param idx The index
+ * @return The node or 0 if the index is out of bounds or the element
+ * at postion @a idx isn't a BValueNode.
+ */
+ BValueNode* getValue(Uint32 idx);
+ };
+}
+
+#endif
diff --git a/libktorrent/torrent/cache.cpp b/libktorrent/torrent/cache.cpp
new file mode 100644
index 0000000..dcf9a77
--- /dev/null
+++ b/libktorrent/torrent/cache.cpp
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "torrent.h"
+#include "chunk.h"
+#include "cache.h"
+#include "peermanager.h"
+#include <util/functions.h>
+
+namespace bt
+{
+
+ Cache::Cache(Torrent & tor,const QString & tmpdir,const QString & datadir)
+ : tor(tor),tmpdir(tmpdir),datadir(datadir),mmap_failures(0)
+ {
+ if (!datadir.endsWith(bt::DirSeparator()))
+ this->datadir += bt::DirSeparator();
+
+ if (!tmpdir.endsWith(bt::DirSeparator()))
+ this->tmpdir += bt::DirSeparator();
+
+ preexisting_files = false;
+ }
+
+
+ Cache::~Cache()
+ {}
+
+
+ void Cache::changeTmpDir(const QString & ndir)
+ {
+ tmpdir = ndir;
+ }
+
+ bool Cache::mappedModeAllowed()
+ {
+ return MaxOpenFiles() - bt::PeerManager::getTotalConnections() < 100;
+ }
+}
diff --git a/libktorrent/torrent/cache.h b/libktorrent/torrent/cache.h
new file mode 100644
index 0000000..4c373ee
--- /dev/null
+++ b/libktorrent/torrent/cache.h
@@ -0,0 +1,165 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCACHE_H
+#define BTCACHE_H
+
+#include <kio/job.h>
+
+class QStringList;
+
+namespace bt
+{
+ class Torrent;
+ class TorrentFile;
+ class Chunk;
+ class PreallocationThread;
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Manages the temporary data
+ *
+ * Interface for a class which manages downloaded data.
+ * Subclasses should implement the load and save methods.
+ */
+ class Cache
+ {
+ protected:
+ Torrent & tor;
+ QString tmpdir;
+ QString datadir;
+ bool preexisting_files;
+ Uint32 mmap_failures;
+ public:
+ Cache(Torrent & tor,const QString & tmpdir,const QString & datadir);
+ virtual ~Cache();
+
+ /// Get the datadir
+ QString getDataDir() const {return datadir;}
+
+ /**
+ * Get the actual output path.
+ * @return The output path
+ */
+ virtual QString getOutputPath() const = 0;
+
+ /**
+ * Changes the tmp dir. All data files should already been moved.
+ * This just modifies the tmpdir variable.
+ * @param ndir The new tmpdir
+ */
+ virtual void changeTmpDir(const QString & ndir);
+
+ /**
+ * Move the data files to a new directory.
+ * @param ndir The directory
+ * @return The KIO::Job doing the move
+ */
+ virtual KIO::Job* moveDataFiles(const QString & ndir) = 0;
+
+ /**
+ * The move data files job is done.
+ * @param job The job that did it
+ */
+ virtual void moveDataFilesCompleted(KIO::Job* job) = 0;
+
+ /**
+ * Changes output path. All data files should already been moved.
+ * This just modifies the datadir variable.
+ * @param outputpath New output path
+ */
+ virtual void changeOutputPath(const QString & outputpath) = 0;
+
+ /**
+ * Load a chunk into memory. If something goes wrong,
+ * an Error should be thrown.
+ * @param c The Chunk
+ */
+ virtual void load(Chunk* c) = 0;
+
+ /**
+ * Save a chunk to disk. If something goes wrong,
+ * an Error should be thrown.
+ * @param c The Chunk
+ */
+ virtual void save(Chunk* c) = 0;
+
+ /**
+ * Prepare a chunk for downloading.
+ * @param c The Chunk
+ * @return true if ok, false otherwise
+ */
+ virtual bool prep(Chunk* c) = 0;
+
+ /**
+ * Create all the data files to store the data.
+ */
+ virtual void create() = 0;
+
+ /**
+ * Close the cache file(s).
+ */
+ virtual void close() = 0;
+
+ /**
+ * Open the cache file(s)
+ */
+ virtual void open() = 0;
+
+ /// Does nothing, can be overridden to be alerted of download status changes of a TorrentFile
+ virtual void downloadStatusChanged(TorrentFile*, bool) {};
+
+ /**
+ * Preallocate diskspace for all files
+ * @param prealloc The thread doing the preallocation
+ */
+ virtual void preallocateDiskSpace(PreallocationThread* prealloc) = 0;
+
+ /// See if the download has existing files
+ bool hasExistingFiles() const {return preexisting_files;}
+
+
+ /**
+ * Test all files and see if they are not missing.
+ * If so put them in a list
+ */
+ virtual bool hasMissingFiles(QStringList & sl) = 0;
+
+ /**
+ * Delete all data files, in case of multi file torrents
+ * empty directories should also be deleted.
+ */
+ virtual void deleteDataFiles() = 0;
+
+ /**
+ * See if we are allowed to use mmap, when loading chunks.
+ * This will return false if we are close to system limits.
+ */
+ static bool mappedModeAllowed();
+
+ /**
+ * Get the number of bytes all the files of this torrent are currently using on disk.
+ * */
+ virtual Uint64 diskUsage() = 0;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/cachefile.cpp b/libktorrent/torrent/cachefile.cpp
new file mode 100644
index 0000000..6367b7f
--- /dev/null
+++ b/libktorrent/torrent/cachefile.cpp
@@ -0,0 +1,507 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <unistd.h>
+#include <errno.h>
+#include <qfile.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kfileitem.h>
+#include <util/array.h>
+#include <util/fileops.h>
+#include <torrent/globals.h>
+#include <interfaces/functions.h>
+#include <kapplication.h>
+#include <util/log.h>
+#include <util/error.h>
+#include "cachefile.h"
+#include "preallocationthread.h"
+#include "settings.h"
+
+
+// Not all systems have an O_LARGEFILE - Solaris depending
+// on command-line defines, FreeBSD never - so in those cases,
+// make it a zero bitmask. As long as it's only OR'ed into
+// open(2) flags, that's fine.
+//
+#ifndef O_LARGEFILE
+#define O_LARGEFILE (0)
+#endif
+
+
+
+
+namespace bt
+{
+
+ CacheFile::CacheFile() : fd(-1),max_size(0),file_size(0),mutex(true)
+ {
+ read_only = false;
+ }
+
+
+ CacheFile::~CacheFile()
+ {
+ if (fd != -1)
+ close();
+ }
+
+ void CacheFile::changePath(const QString & npath)
+ {
+ path = npath;
+ }
+
+ void CacheFile::openFile(Mode mode)
+ {
+ int flags = O_LARGEFILE;
+
+ // by default allways try read write
+ fd = ::open(QFile::encodeName(path),flags | O_RDWR);
+ if (fd < 0 && mode == READ)
+ {
+ // in case RDWR fails, try readonly if possible
+ fd = ::open(QFile::encodeName(path),flags | O_RDONLY);
+ if (fd >= 0)
+ read_only = true;
+ }
+
+ if (fd < 0)
+ {
+ throw Error(i18n("Cannot open %1 : %2").arg(path).arg(strerror(errno)));
+ }
+
+ file_size = FileSize(fd);
+ }
+
+ void CacheFile::open(const QString & path,Uint64 size)
+ {
+ QMutexLocker lock(&mutex);
+ // only set the path and the max size, we only open the file when it is needed
+ this->path = path;
+ max_size = size;
+ }
+
+ void* CacheFile::map(MMappeable* thing,Uint64 off,Uint32 size,Mode mode)
+ {
+ QMutexLocker lock(&mutex);
+ // reopen the file if necessary
+ if (fd == -1)
+ {
+ // Out() << "Reopening " << path << endl;
+ openFile(mode);
+ }
+
+ if (read_only && mode != READ)
+ {
+ throw Error(i18n("Cannot open %1 for writing : readonly filesystem").arg(path));
+ }
+
+ if (off + size > max_size)
+ {
+ Out() << "Warning : writing past the end of " << path << endl;
+ Out() << (off + size) << " " << max_size << endl;
+ return 0;
+ }
+
+ int mmap_flag = 0;
+ switch (mode)
+ {
+ case READ:
+ mmap_flag = PROT_READ;
+ break;
+ case WRITE:
+ mmap_flag = PROT_WRITE;
+ break;
+ case RW:
+ mmap_flag = PROT_READ|PROT_WRITE;
+ break;
+ }
+
+ if (off + size > file_size)
+ {
+ Uint64 to_write = (off + size) - file_size;
+ // Out() << "Growing file with " << to_write << " bytes" << endl;
+ growFile(to_write);
+ }
+
+ Uint32 page_size = sysconf(_SC_PAGESIZE);
+ if (off % page_size > 0)
+ {
+ // off is not a multiple of the page_size
+ // so we play around a bit
+ Uint32 diff = (off % page_size);
+ Uint64 noff = off - diff;
+ // Out() << "Offsetted mmap : " << diff << endl;
+#if HAVE_MMAP64
+ char* ptr = (char*)mmap64(0, size + diff, mmap_flag, MAP_SHARED, fd, noff);
+#else
+ char* ptr = (char*)mmap(0, size + diff, mmap_flag, MAP_SHARED, fd, noff);
+#endif
+ if (ptr == MAP_FAILED)
+ {
+ Out() << "mmap failed : " << QString(strerror(errno)) << endl;
+ return 0;
+ }
+ else
+ {
+ CacheFile::Entry e;
+ e.thing = thing;
+ e.offset = off;
+ e.diff = diff;
+ e.ptr = ptr;
+ e.size = size + diff;
+ e.mode = mode;
+ mappings.insert((void*)(ptr + diff),e);
+ return ptr + diff;
+ }
+ }
+ else
+ {
+#if HAVE_MMAP64
+ void* ptr = mmap64(0, size, mmap_flag, MAP_SHARED, fd, off);
+#else
+ void* ptr = mmap(0, size, mmap_flag, MAP_SHARED, fd, off);
+#endif
+ if (ptr == MAP_FAILED)
+ {
+ Out() << "mmap failed : " << QString(strerror(errno)) << endl;
+ return 0;
+ }
+ else
+ {
+ CacheFile::Entry e;
+ e.thing = thing;
+ e.offset = off;
+ e.ptr = ptr;
+ e.diff = 0;
+ e.size = size;
+ e.mode = mode;
+ mappings.insert(ptr,e);
+ return ptr;
+ }
+ }
+ }
+
+ void CacheFile::growFile(Uint64 to_write)
+ {
+ // reopen the file if necessary
+ if (fd == -1)
+ {
+ // Out() << "Reopening " << path << endl;
+ openFile(RW);
+ }
+
+ if (read_only)
+ throw Error(i18n("Cannot open %1 for writing : readonly filesystem").arg(path));
+
+ // jump to the end of the file
+ SeekFile(fd,0,SEEK_END);
+
+ if (file_size + to_write > max_size)
+ {
+ Out() << "Warning : writing past the end of " << path << endl;
+ Out() << (file_size + to_write) << " " << max_size << endl;
+ }
+
+ Uint8 buf[1024];
+ memset(buf,0,1024);
+ Uint64 num = to_write;
+ // write data until to_write is 0
+ while (to_write > 0)
+ {
+ int nb = to_write > 1024 ? 1024 : to_write;
+ int ret = ::write(fd,buf,nb);
+ if (ret < 0)
+ throw Error(i18n("Cannot expand file %1 : %2").arg(path).arg(strerror(errno)));
+ else if (ret != nb)
+ throw Error(i18n("Cannot expand file %1 : incomplete write").arg(path));
+ to_write -= nb;
+ }
+ file_size += num;
+//
+ // Out() << QString("growing %1 = %2").arg(path).arg(kt::BytesToString(file_size)) << endl;
+
+ if (file_size != FileSize(fd))
+ {
+// Out() << QString("Homer Simpson %1 %2").arg(file_size).arg(sb.st_size) << endl;
+ fsync(fd);
+ if (file_size != FileSize(fd))
+ {
+ throw Error(i18n("Cannot expand file %1").arg(path));
+ }
+ }
+ }
+
+ void CacheFile::unmap(void* ptr,Uint32 size)
+ {
+ int ret = 0;
+ QMutexLocker lock(&mutex);
+ // see if it wasn't an offsetted mapping
+ if (mappings.contains(ptr))
+ {
+ CacheFile::Entry & e = mappings[ptr];
+#if HAVE_MUNMAP64
+ if (e.diff > 0)
+ ret = munmap64((char*)ptr - e.diff,e.size);
+ else
+ ret = munmap64(ptr,e.size);
+#else
+ if (e.diff > 0)
+ ret = munmap((char*)ptr - e.diff,e.size);
+ else
+ ret = munmap(ptr,e.size);
+#endif
+ mappings.erase(ptr);
+ // no mappings, close temporary
+ if (mappings.count() == 0)
+ closeTemporary();
+ }
+ else
+ {
+#if HAVE_MUNMAP64
+ ret = munmap64(ptr,size);
+#else
+ ret = munmap(ptr,size);
+#endif
+ }
+
+ if (ret < 0)
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << QString("Munmap failed with error %1 : %2").arg(errno).arg(strerror(errno)) << endl;
+ }
+ }
+
+ void CacheFile::close()
+ {
+ QMutexLocker lock(&mutex);
+
+ if (fd == -1)
+ return;
+
+ QMap<void*,Entry>::iterator i = mappings.begin();
+ while (i != mappings.end())
+ {
+ int ret = 0;
+ CacheFile::Entry & e = i.data();
+#if HAVE_MUNMAP64
+ if (e.diff > 0)
+ ret = munmap64((char*)e.ptr - e.diff,e.size);
+ else
+ ret = munmap64(e.ptr,e.size);
+#else
+ if (e.diff > 0)
+ ret = munmap((char*)e.ptr - e.diff,e.size);
+ else
+ ret = munmap(e.ptr,e.size);
+#endif
+ e.thing->unmapped();
+
+ i++;
+ mappings.erase(e.ptr);
+
+ if (ret < 0)
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << QString("Munmap failed with error %1 : %2").arg(errno).arg(strerror(errno)) << endl;
+ }
+ }
+ ::close(fd);
+ fd = -1;
+ }
+
+ void CacheFile::read(Uint8* buf,Uint32 size,Uint64 off)
+ {
+ QMutexLocker lock(&mutex);
+ bool close_again = false;
+
+ // reopen the file if necessary
+ if (fd == -1)
+ {
+ // Out() << "Reopening " << path << endl;
+ openFile(READ);
+ close_again = true;
+ }
+
+ if (off >= file_size || off >= max_size)
+ {
+ throw Error(i18n("Error : Reading past the end of the file %1").arg(path));
+ }
+
+ // jump to right position
+ SeekFile(fd,(Int64)off,SEEK_SET);
+ if ((Uint32)::read(fd,buf,size) != size)
+ {
+ if (close_again)
+ closeTemporary();
+
+ throw Error(i18n("Error reading from %1").arg(path));
+ }
+
+ if (close_again)
+ closeTemporary();
+ }
+
+ void CacheFile::write(const Uint8* buf,Uint32 size,Uint64 off)
+ {
+ QMutexLocker lock(&mutex);
+ bool close_again = false;
+
+ // reopen the file if necessary
+ if (fd == -1)
+ {
+ // Out() << "Reopening " << path << endl;
+ openFile(RW);
+ close_again = true;
+ }
+
+ if (read_only)
+ throw Error(i18n("Cannot open %1 for writing : readonly filesystem").arg(path));
+
+ if (off + size > max_size)
+ {
+ Out() << "Warning : writing past the end of " << path << endl;
+ Out() << (off + size) << " " << max_size << endl;
+ }
+
+ if (file_size < off)
+ {
+ //Out() << QString("Writing %1 bytes at %2").arg(size).arg(off) << endl;
+ growFile(off - file_size);
+ }
+
+ // jump to right position
+ SeekFile(fd,(Int64)off,SEEK_SET);
+ int ret = ::write(fd,buf,size);
+ if (close_again)
+ closeTemporary();
+
+ if (ret == -1)
+ throw Error(i18n("Error writing to %1 : %2").arg(path).arg(strerror(errno)));
+ else if ((Uint32)ret != size)
+ {
+ Out() << QString("Incomplete write of %1 bytes, should be %2").arg(ret).arg(size) << endl;
+ throw Error(i18n("Error writing to %1").arg(path));
+ }
+
+ if (off + size > file_size)
+ file_size = off + size;
+ }
+
+ void CacheFile::closeTemporary()
+ {
+ if (fd == -1 || mappings.count() > 0)
+ return;
+
+ ::close(fd);
+ fd = -1;
+ }
+
+
+
+ void CacheFile::preallocate(PreallocationThread* prealloc)
+ {
+ QMutexLocker lock(&mutex);
+
+ if (FileSize(path) == max_size)
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "File " << path << " already big enough" << endl;
+ return;
+ }
+
+ Out(SYS_GEN|LOG_NOTICE) << "Preallocating file " << path << " (" << max_size << " bytes)" << endl;
+ bool close_again = false;
+ if (fd == -1)
+ {
+ openFile(RW);
+ close_again = true;
+ }
+
+ if (read_only)
+ {
+ if (close_again)
+ closeTemporary();
+
+ throw Error(i18n("Cannot open %1 for writing : readonly filesystem").arg(path));
+ }
+
+ try
+ {
+ bool res = false;
+
+ #ifdef HAVE_XFS_XFS_H
+ if( (! res) && Settings::fullDiskPrealloc() && (Settings::fullDiskPreallocMethod() == 1) )
+ {
+ res = XfsPreallocate(fd, max_size);
+ }
+ #endif
+
+ if(! res)
+ {
+ bt::TruncateFile(fd,max_size,!Settings::fullDiskPrealloc());
+ }
+ }
+ catch (bt::Error & e)
+ {
+ // first attempt failed, must be fat so try that
+ if (!FatPreallocate(fd,max_size))
+ {
+ if (close_again)
+ closeTemporary();
+
+ throw Error(i18n("Cannot preallocate diskspace : %1").arg(strerror(errno)));
+ }
+ }
+
+ file_size = FileSize(fd);
+ Out(SYS_GEN|LOG_DEBUG) << "file_size = " << file_size << endl;
+ if (close_again)
+ closeTemporary();
+ }
+
+ Uint64 CacheFile::diskUsage()
+ {
+ Uint64 ret = 0;
+ bool close_again = false;
+ if (fd == -1)
+ {
+ openFile(READ);
+ close_again = true;
+ }
+
+ struct stat sb;
+ if (fstat(fd,&sb) == 0)
+ {
+ ret = (Uint64)sb.st_blocks * 512;
+ }
+
+ // Out(SYS_GEN|LOG_NOTICE) << "CF: " << path << " is taking up " << ret << " bytes" << endl;
+ if (close_again)
+ closeTemporary();
+
+ return ret;
+ }
+}
diff --git a/libktorrent/torrent/cachefile.h b/libktorrent/torrent/cachefile.h
new file mode 100644
index 0000000..9c4ebc6
--- /dev/null
+++ b/libktorrent/torrent/cachefile.h
@@ -0,0 +1,149 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCACHEFILE_H
+#define BTCACHEFILE_H
+
+#include <qmap.h>
+#include <qmutex.h>
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace bt
+{
+ class PreallocationThread;
+
+
+ /**
+ * Interface which classes must implement to be able to map something from a CacheFile
+ * It will also be used to notify when things get unmapped or remapped
+ */
+ class MMappeable
+ {
+ public:
+ virtual ~MMappeable() {}
+
+ /**
+ * When a CacheFile is closed, this will be called on all existing mappings.
+ */
+ virtual void unmapped() = 0;
+ };
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Used by Single and MultiFileCache to write to disk.
+ */
+ class CacheFile
+ {
+ public:
+ CacheFile();
+ virtual ~CacheFile();
+
+ enum Mode
+ {
+ READ,WRITE,RW
+ };
+
+
+ /**
+ * Open the file.
+ * @param path Path of the file
+ * @param size Max size of the file
+ * @throw Error when something goes wrong
+ */
+ void open(const QString & path,Uint64 size);
+
+ /// Change the path of the file
+ void changePath(const QString & npath);
+
+ /**
+ * Map a part of the file into memory, will expand the file
+ * if it is to small, but will not go past the limit set in open.
+ * @param thing The thing that wishes to map the mmapping
+ * @param off Offset into the file
+ * @param size Size of the region to map
+ * @param mode How the region will be mapped
+ * @return A ptr to the mmaped region, or 0 if something goes wrong
+ */
+ void* map(MMappeable* thing,Uint64 off,Uint32 size,Mode mode);
+
+ /**
+ * Unmap a previously mapped region.
+ * @param ptr Ptr to the region
+ * @param size Size of the region
+ */
+ void unmap(void* ptr,Uint32 size);
+
+ /**
+ * Close the file, everything will be unmapped.
+ * @param to_be_reopened Indicates if the close is temporarely (i.e. it will be reopened)
+ */
+ void close();
+
+ /**
+ * Read from the file.
+ * @param buf Buffer to store data
+ * @param size Size to read
+ * @param off Offset to read from in file
+ */
+ void read(Uint8* buf,Uint32 size,Uint64 off);
+
+ /**
+ * Write to the file.
+ * @param buf Buffer to write
+ * @param size Size to read
+ * @param off Offset to read from in file
+ */
+ void write(const Uint8* buf,Uint32 size,Uint64 off);
+
+ /**
+ * Preallocate disk space
+ */
+ void preallocate(PreallocationThread* prealloc);
+
+ /// Get the number of bytes this cache file is taking up
+ Uint64 diskUsage();
+
+ private:
+ void growFile(Uint64 to_write);
+ void closeTemporary();
+ void openFile(Mode mode);
+
+ private:
+ int fd;
+ bool read_only;
+ Uint64 max_size,file_size;
+ QString path;
+ struct Entry
+ {
+ MMappeable* thing;
+ void* ptr;
+ Uint32 size;
+ Uint64 offset;
+ Uint32 diff;
+ Mode mode;
+ };
+ QMap<void*,Entry> mappings; // mappings where offset wasn't a multiple of 4K
+ mutable QMutex mutex;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/cap.cpp b/libktorrent/torrent/cap.cpp
new file mode 100644
index 0000000..a785520
--- /dev/null
+++ b/libktorrent/torrent/cap.cpp
@@ -0,0 +1,123 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#if 0
+#include <math.h>
+#include "cap.h"
+
+namespace bt
+{
+ typedef QValueList<Cap::Entry>::iterator CapItr;
+
+ Cap::Cap(bool percentage_check) : max_bytes_per_sec(0),leftover(0),current_speed(0),percentage_check(percentage_check)
+ {
+ timer.update();
+ }
+
+
+ Cap::~Cap()
+ {}
+
+ void Cap::setMaxSpeed(Uint32 max)
+ {
+ max_bytes_per_sec = max;
+ // tell everybody to go wild
+ if (max_bytes_per_sec == 0)
+ {
+ CapItr i = entries.begin();
+ while (i != entries.end())
+ {
+ Cap::Entry & e = *i;
+ e.obj->proceed(0);
+ i++;
+ }
+ entries.clear();
+ leftover = 0;
+ }
+ }
+
+ bool Cap::allow(Cappable* pd,Uint32 bytes)
+ {
+ if (max_bytes_per_sec == 0 || (percentage_check && (double)current_speed / (double)max_bytes_per_sec < 0.75))
+ {
+ timer.update();
+ return true;
+ }
+
+ // append pd to queue
+ entries.append(Cap::Entry(pd,bytes));
+ return false;
+ }
+
+ void Cap::killed(Cappable* pd)
+ {
+ CapItr i = entries.begin();
+ while (i != entries.end())
+ {
+ Cap::Entry & e = *i;
+ if (e.obj == pd)
+ i = entries.erase(i);
+ else
+ i++;
+ }
+ }
+
+ void Cap::update()
+ {
+ if (entries.count() == 0)
+ {
+ timer.update();
+ return;
+ }
+
+ // first calculate the time since the last update
+ double el = timer.getElapsedSinceUpdate();
+
+ // calculate the number of bytes we can send, including those leftover from the last time
+ Uint32 nb = (Uint32)round((el / 1000.0) * max_bytes_per_sec) + leftover;
+ leftover = 0;
+ // Out() << "nb = " << nb << endl;
+
+ while (entries.count() > 0 && nb > 0)
+ {
+ // get the first
+ Cap::Entry & e = entries.first();
+
+ if (e.num_bytes <= nb)
+ {
+ nb -= e.num_bytes;
+ // we can send all remaining bytes of the packet
+ e.obj->proceed(e.num_bytes);
+ entries.pop_front();
+ }
+ else
+ {
+ // sent nb bytes of the packets
+ e.obj->proceed(nb);
+ e.num_bytes -= nb;
+ nb = 0;
+ }
+ }
+
+ leftover = nb;
+ timer.update();
+ }
+
+}
+#endif
diff --git a/libktorrent/torrent/cap.h b/libktorrent/torrent/cap.h
new file mode 100644
index 0000000..a3a365e
--- /dev/null
+++ b/libktorrent/torrent/cap.h
@@ -0,0 +1,113 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCAP_H
+#define BTCAP_H
+
+#if 0
+#include <qvaluelist.h>
+#include <util/timer.h>
+#include <util/constants.h>
+
+namespace bt
+{
+ /**
+ * Base class for all cappable objects.
+ */
+ class Cappable
+ {
+ public:
+ /**
+ * Proceed with doing some bytes
+ * @param bytes The number of bytes it can do (0 = no limit)
+ * @return true if finished, false otherwise
+ */
+ virtual void proceed(Uint32 bytes) = 0;
+ };
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * A Cap is something which caps something.
+ */
+ class Cap
+ {
+ public:
+ Cap(bool percentage_check);
+ virtual ~Cap();
+
+ struct Entry
+ {
+ Cappable* obj;
+ Uint32 num_bytes;
+
+ Entry() : obj(0),num_bytes(0) {}
+ Entry(Cappable* obj,Uint32 nb) : obj(obj),num_bytes(nb) {}
+ };
+
+ /**
+ * Set the speed cap in bytes per second. 0 indicates
+ * no limit.
+ * @param max Maximum number of bytes per second.
+ */
+ void setMaxSpeed(Uint32 max);
+
+ /// Get max bytes/sec
+ Uint32 getMaxSpeed() const {return max_bytes_per_sec;}
+
+ /// Set the current speed
+ void setCurrentSpeed(Uint32 cs) {current_speed = cs;}
+
+ /// Get the current speed
+ Uint32 getCurrrentSpeed() const {return current_speed;}
+
+ /**
+ * Allow or disallow somebody from proceeding. If somebody
+ * is disallowed they will be stored in a queue, and will be notified
+ * when there turn is up.
+ * @param pd Thing which is doing the request
+ * @param bytes Bytes it wants to send
+ * @return true if the piece is allowed or not
+ */
+ bool allow(Cappable* pd,Uint32 bytes);
+
+ /**
+ * A thing in the queue should call this when it get destroyed. To
+ * remove them from the queue.
+ * @param pd The Cappable thing
+ */
+ void killed(Cappable* pd);
+
+ /**
+ * Update the downloadcap.
+ */
+ void update();
+
+ private:
+ QValueList<Entry> entries;
+ Uint32 max_bytes_per_sec;
+ Timer timer;
+ Uint32 leftover;
+ Uint32 current_speed;
+ bool percentage_check;
+ };
+
+}
+#endif
+#endif
diff --git a/libktorrent/torrent/choker.cpp b/libktorrent/torrent/choker.cpp
new file mode 100644
index 0000000..0cb08e9
--- /dev/null
+++ b/libktorrent/torrent/choker.cpp
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qptrlist.h>
+#include <interfaces/functions.h>
+#include "choker.h"
+#include "peermanager.h"
+#include "newchokealgorithm.h"
+#include "advancedchokealgorithm.h"
+
+using namespace kt;
+
+namespace bt
+{
+
+ PeerPtrList::PeerPtrList(PeerCompareFunc pcmp) : pcmp(pcmp)
+ {}
+
+ PeerPtrList::~PeerPtrList()
+ {}
+
+ int PeerPtrList::compareItems(QPtrCollection::Item a, QPtrCollection::Item b)
+ {
+ if (pcmp)
+ return pcmp((Peer*)a,(Peer*)b);
+ else
+ return CompareVal(a,b);
+ }
+
+ ////////////////////////////////////////////
+
+ ChokeAlgorithm::ChokeAlgorithm() : opt_unchoked_peer_id(0)
+ {
+ }
+
+ ChokeAlgorithm::~ChokeAlgorithm()
+ {
+ }
+
+
+ /////////////////////////////////
+
+ Uint32 Choker::num_upload_slots = 2;
+
+ Choker::Choker(PeerManager & pman,ChunkManager & cman) : pman(pman),cman(cman)
+ {
+#ifdef USE_OLD_CHOKE
+ choke = new NewChokeAlgorithm();
+#else
+ choke = new AdvancedChokeAlgorithm();
+#endif
+ }
+
+
+ Choker::~Choker()
+ {
+ delete choke;
+ }
+
+ void Choker::update(bool have_all,const kt::TorrentStats & stats)
+ {
+ if (have_all)
+ choke->doChokingSeedingState(pman,cman,stats);
+ else
+ choke->doChokingLeechingState(pman,cman,stats);
+ }
+
+}
diff --git a/libktorrent/torrent/choker.h b/libktorrent/torrent/choker.h
new file mode 100644
index 0000000..ba78f3c
--- /dev/null
+++ b/libktorrent/torrent/choker.h
@@ -0,0 +1,123 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCHOKER_H
+#define BTCHOKER_H
+
+#include <qptrlist.h>
+#include <util/constants.h>
+#include "peer.h"
+
+namespace kt
+{
+ struct TorrentStats;
+}
+
+namespace bt
+{
+ const Uint32 UNDEFINED_ID = 0xFFFFFFFF;
+
+ class PeerManager;
+ class ChunkManager;
+
+
+ typedef int (*PeerCompareFunc)(Peer* a,Peer* b);
+
+ class PeerPtrList : public QPtrList<Peer>
+ {
+ PeerCompareFunc pcmp;
+ public:
+ PeerPtrList(PeerCompareFunc pcmp = NULL);
+ virtual ~PeerPtrList();
+
+ void setCompareFunc(PeerCompareFunc p) {pcmp = p;}
+
+ virtual int compareItems(QPtrCollection::Item a, QPtrCollection::Item b);
+ };
+
+ /**
+ * Base class for all choke algorithms.
+ */
+ class ChokeAlgorithm
+ {
+ protected:
+ Uint32 opt_unchoked_peer_id;
+ public:
+ ChokeAlgorithm();
+ virtual ~ChokeAlgorithm();
+
+ /**
+ * Do the actual choking when we are still downloading.
+ * @param pman The PeerManager
+ * @param cman The ChunkManager
+ * @param stats The torrent stats
+ */
+ virtual void doChokingLeechingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats) = 0;
+
+ /**
+ * Do the actual choking when we are seeding
+ * @param pman The PeerManager
+ * @param cman The ChunkManager
+ * @param stats The torrent stats
+ */
+ virtual void doChokingSeedingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats) = 0;
+
+ /// Get the optimisticly unchoked peer ID
+ Uint32 getOptimisticlyUnchokedPeerID() const {return opt_unchoked_peer_id;}
+ };
+
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Handles the choking
+ *
+ * This class handles the choking and unchoking of Peer's.
+ * This class needs to be updated every 10 seconds.
+ */
+ class Choker
+ {
+ ChokeAlgorithm* choke;
+ PeerManager & pman;
+ ChunkManager & cman;
+ static Uint32 num_upload_slots;
+ public:
+ Choker(PeerManager & pman,ChunkManager & cman);
+ virtual ~Choker();
+
+ /**
+ * Update which peers are choked or not.
+ * @param have_all Indicates wether we have the entire file
+ * @param stats Statistic of the torrent
+ */
+ void update(bool have_all,const kt::TorrentStats & stats);
+
+ /// Get the PeerID of the optimisticly unchoked peer.
+ Uint32 getOptimisticlyUnchokedPeerID() const {return choke->getOptimisticlyUnchokedPeerID();}
+
+ /// Set the number of upload slots
+ static void setNumUploadSlots(Uint32 n) {num_upload_slots = n;}
+
+ /// Get the number of upload slots
+ static Uint32 getNumUploadSlots() {return num_upload_slots;}
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/chunk.cpp b/libktorrent/torrent/chunk.cpp
new file mode 100644
index 0000000..6873713
--- /dev/null
+++ b/libktorrent/torrent/chunk.cpp
@@ -0,0 +1,81 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/sha1hash.h>
+#include "chunk.h"
+#include "globals.h"
+
+
+namespace bt
+{
+
+ Chunk::Chunk(unsigned int index,Uint32 size)
+ : status(Chunk::NOT_DOWNLOADED),index(index),
+ data(0),size(size),ref_count(0),priority(NORMAL_PRIORITY)
+ {
+ }
+
+
+ Chunk::~Chunk()
+ {
+ clear();
+ }
+
+ void Chunk::setData(Uint8* d,Status nstatus)
+ {
+ clear();
+ status = nstatus;
+ data = d;
+ }
+
+ void Chunk::allocate()
+ {
+ clear();
+ status = BUFFERED;
+ data = new Uint8[size];
+ }
+
+ void Chunk::clear()
+ {
+ if (data)
+ {
+ if (status == BUFFERED)
+ delete [] data;
+ data = 0;
+ }
+ }
+
+ void Chunk::unmapped()
+ {
+ setData(0,Chunk::ON_DISK);
+ }
+
+ bool Chunk::checkHash(const SHA1Hash & h) const
+ {
+ if (status != BUFFERED && status != MMAPPED)
+ {
+ return false;
+ }
+ else
+ {
+ return SHA1Hash::generate(data,size) == h;
+ }
+ }
+
+}
diff --git a/libktorrent/torrent/chunk.h b/libktorrent/torrent/chunk.h
new file mode 100644
index 0000000..0896e96
--- /dev/null
+++ b/libktorrent/torrent/chunk.h
@@ -0,0 +1,165 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCHUNK_H
+#define BTCHUNK_H
+
+#include <util/constants.h>
+#include "cachefile.h"
+
+namespace bt
+{
+ class SHA1Hash;
+
+ /**
+ * @author Joris Guisson
+ * @brief Keep track of a piece of the file
+ *
+ * Keeps track of a piece of the file. The Chunk has 3 possible states :
+ * - MMAPPED : It is memory mapped
+ * - BUFFERED : It is in a buffer in dynamically allocated memory
+ * (because the chunk is located in 2 or more separate files, so we cannot just set a pointer
+ * to a region of mmapped memory)
+ * - ON_DISK : On disk
+ * - NOT_DOWNLOADED : It hasn't been dowloaded yet, and there is no buffer allocated
+ */
+ class Chunk : public MMappeable
+ {
+ public:
+ Chunk(unsigned int index,Uint32 size);
+ ~Chunk();
+
+ enum Status
+ {
+ MMAPPED,
+ BUFFERED,
+ ON_DISK,
+ NOT_DOWNLOADED
+ };
+
+ /// Get the chunks status.
+ Status getStatus() const;
+
+ /**
+ * Set the chunks status
+ * @param s
+ */
+ void setStatus(Status s);
+
+ /// Get the data
+ const Uint8* getData() const;
+
+ /// Get the data
+ Uint8* getData();
+
+ /// Set the data and the new status
+ void setData(Uint8* d,Status nstatus);
+
+ /// Clear the chunk (delete data depending on the mode)
+ void clear();
+
+ /// Get the chunk's index
+ Uint32 getIndex() const;
+
+ /// Get the chunk's size
+ Uint32 getSize() const;
+
+ /// Add one to the reference counter
+ void ref();
+
+ /// --reference counter
+ void unref();
+
+ /// reference coun > 0
+ bool taken() const;
+
+ /// allocate data if not already done, sets the status to buffered
+ void allocate();
+
+ /// get chunk priority
+ Priority getPriority() const;
+
+ /// set chunk priority
+ void setPriority(Priority newpriority = NORMAL_PRIORITY);
+
+ /// Is chunk excluded
+ bool isExcluded() const;
+
+ /// Is this a seed only chunk
+ bool isExcludedForDownloading() const;
+
+ /// In/Exclude chunk
+ void setExclude(bool yes);
+
+ /**
+ * Check wehter the chunk matches it's hash.
+ * @param h The hash
+ * @return true if the data matches the hash
+ */
+ bool checkHash(const SHA1Hash & h) const;
+
+ private:
+ virtual void unmapped();
+
+ private:
+ Status status;
+ Uint32 index;
+ Uint8* data;
+ Uint32 size;
+ int ref_count;
+ Priority priority;
+ };
+
+ inline Chunk::Status Chunk::getStatus() const
+ {
+ return status;
+ }
+
+ inline void Chunk::setStatus(Chunk::Status s)
+ {
+ status = s;
+ }
+
+ inline const Uint8* Chunk::getData() const {return data;}
+ inline Uint8* Chunk::getData() {return data;}
+
+ inline Uint32 Chunk::getIndex() const {return index;}
+ inline Uint32 Chunk::getSize() const {return size;}
+
+ inline void Chunk::ref() {ref_count++;}
+ inline void Chunk::unref() {ref_count--;}
+ inline bool Chunk::taken() const {return ref_count > 0;}
+
+ inline Priority Chunk::getPriority() const {return priority;}
+ inline void Chunk::setPriority(Priority newpriority) {priority = newpriority;}
+ inline bool Chunk::isExcluded() const
+ {
+ return priority == EXCLUDED;
+ }
+
+ inline bool Chunk::isExcludedForDownloading() const
+ {
+ return priority == ONLY_SEED_PRIORITY;
+ }
+
+ inline void Chunk::setExclude(bool yes)
+ {if(yes) priority = EXCLUDED; else priority = NORMAL_PRIORITY;}
+}
+
+#endif
diff --git a/libktorrent/torrent/chunkcounter.cpp b/libktorrent/torrent/chunkcounter.cpp
new file mode 100644
index 0000000..95b7535
--- /dev/null
+++ b/libktorrent/torrent/chunkcounter.cpp
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/bitset.h>
+#include "chunkcounter.h"
+
+namespace bt
+{
+
+ ChunkCounter::ChunkCounter(Uint32 num_chunks) : cnt(num_chunks)
+ {
+ // fill with 0
+ cnt.fill(0);
+ }
+
+
+ ChunkCounter::~ChunkCounter()
+ {
+ }
+
+ void ChunkCounter::reset()
+ {
+ cnt.fill(0);
+ }
+
+ void ChunkCounter::incBitSet(const BitSet & bs)
+ {
+ for (Uint32 i = 0;i < cnt.size();i++)
+ {
+ if(bs.get(i))
+ cnt[i]++;
+ }
+ }
+
+ void ChunkCounter::decBitSet(const BitSet & bs)
+ {
+ for (Uint32 i = 0;i < cnt.size();i++)
+ {
+ if(bs.get(i))
+ dec(i);
+ }
+ }
+
+ void ChunkCounter::inc(Uint32 idx)
+ {
+ if (idx < cnt.size())
+ cnt[idx]++;
+ }
+
+ void ChunkCounter::dec(Uint32 idx)
+ {
+ if (idx < cnt.size() && cnt[idx] > 0)
+ cnt[idx]--;
+ }
+
+ Uint32 ChunkCounter::get(Uint32 idx) const
+ {
+ if (idx < cnt.size())
+ return cnt[idx];
+ else
+ return 0;
+ }
+
+}
diff --git a/libktorrent/torrent/chunkcounter.h b/libktorrent/torrent/chunkcounter.h
new file mode 100644
index 0000000..ac2ec49
--- /dev/null
+++ b/libktorrent/torrent/chunkcounter.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCHUNKCOUNTER_H
+#define BTCHUNKCOUNTER_H
+
+#include <util/constants.h>
+#include <util/array.h>
+
+namespace bt
+{
+ class BitSet;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Class to keep track of how many peers have a chunk.
+ */
+ class ChunkCounter
+ {
+ Array<Uint32> cnt;
+ public:
+ ChunkCounter(Uint32 num_chunks);
+ virtual ~ChunkCounter();
+
+ /**
+ * If a bit in the bitset is one, increment the corresponding counter.
+ * @param bs The BitSet
+ */
+ void incBitSet(const BitSet & bs);
+
+
+ /**
+ * If a bit in the bitset is one, decrement the corresponding counter.
+ * @param bs The BitSet
+ */
+ void decBitSet(const BitSet & bs);
+
+ /**
+ * Increment the counter for the idx'th chunk
+ * @param idx Index of the chunk
+ */
+ void inc(Uint32 idx);
+
+
+ /**
+ * Decrement the counter for the idx'th chunk
+ * @param idx Index of the chunk
+ */
+ void dec(Uint32 idx);
+
+
+ /**
+ * Get the counter for the idx'th chunk
+ * @param idx Index of the chunk
+ */
+ Uint32 get(Uint32 idx) const;
+
+ /**
+ * Reset all values to 0
+ */
+ void reset();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/chunkdownload.cpp b/libktorrent/torrent/chunkdownload.cpp
new file mode 100644
index 0000000..51e9db9
--- /dev/null
+++ b/libktorrent/torrent/chunkdownload.cpp
@@ -0,0 +1,484 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <algorithm>
+#include <util/file.h>
+#include <util/log.h>
+#include <util/array.h>
+#include "chunkdownload.h"
+#include "downloader.h"
+#include "chunk.h"
+#include "peer.h"
+#include "peermanager.h"
+#include "piece.h"
+#include "peerdownloader.h"
+
+#include <klocale.h>
+
+namespace bt
+{
+
+ class DownloadStatus : public std::set<Uint32>
+ {
+ public:
+ // typedef std::set<Uint32>::iterator iterator;
+
+ DownloadStatus()
+ {
+
+ }
+
+ ~DownloadStatus()
+ {
+ }
+
+ void add(Uint32 p)
+ {
+ insert(p);
+ }
+
+ void remove(Uint32 p)
+ {
+ erase(p);
+ }
+
+ bool contains(Uint32 p)
+ {
+ return count(p) > 0;
+ }
+ };
+
+ ChunkDownload::ChunkDownload(Chunk* chunk) : chunk(chunk)
+ {
+ num = num_downloaded = 0;
+
+ num = chunk->getSize() / MAX_PIECE_LEN;
+
+ if (chunk->getSize() % MAX_PIECE_LEN != 0)
+ {
+ last_size = chunk->getSize() % MAX_PIECE_LEN;
+ num++;
+ }
+ else
+ {
+ last_size = MAX_PIECE_LEN;
+ }
+
+ pieces = BitSet(num);
+ pieces.clear();
+
+ for (Uint32 i = 0;i < num;i++)
+ piece_queue.append(i);
+
+ dstatus.setAutoDelete(true);
+ chunk->ref();
+
+ num_pieces_in_hash = 0;
+ if (usingContinuousHashing())
+ hash_gen.start();
+
+ }
+
+ ChunkDownload::~ChunkDownload()
+ {
+ chunk->unref();
+ }
+
+ bool ChunkDownload::piece(const Piece & p,bool & ok)
+ {
+ ok = false;
+ timer.update();
+
+ Uint32 pp = p.getOffset() / MAX_PIECE_LEN;
+ if (pieces.get(pp))
+ return false;
+
+
+ DownloadStatus* ds = dstatus.find(p.getPeer());
+ if (ds)
+ ds->remove(pp);
+
+ Uint8* buf = chunk->getData();
+ if (buf)
+ {
+ ok = true;
+ memcpy(buf + p.getOffset(),p.getData(),p.getLength());
+ pieces.set(pp,true);
+ piece_queue.remove(pp);
+ piece_providers.insert(p.getPeer());
+ num_downloaded++;
+ if (pdown.count() > 1)
+ {
+ endgameCancel(p);
+ }
+
+ if (usingContinuousHashing())
+ updateHash();
+
+ if (num_downloaded >= num)
+ {
+ // finalize hash
+ if (usingContinuousHashing())
+ hash_gen.end();
+
+ releaseAllPDs();
+ return true;
+ }
+ }
+
+ for (QPtrList<PeerDownloader>::iterator i = pdown.begin();i != pdown.end();++i)
+ sendRequests(*i);
+
+ return false;
+ }
+
+ void ChunkDownload::releaseAllPDs()
+ {
+ for (Uint32 i = 0;i < pdown.count();i++)
+ {
+ PeerDownloader* pd = pdown.at(i);
+ pd->release();
+ disconnect(pd,SIGNAL(timedout(const Request& )),this,SLOT(onTimeout(const Request& )));
+ disconnect(pd,SIGNAL(rejected( const Request& )),this,SLOT(onRejected( const Request& )));
+ }
+ dstatus.clear();
+ pdown.clear();
+ }
+
+ bool ChunkDownload::assignPeer(PeerDownloader* pd)
+ {
+ if (!pd || pdown.contains(pd))
+ return false;
+
+ pd->grab();
+ pdown.append(pd);
+ dstatus.insert(pd->getPeer()->getID(),new DownloadStatus());
+ sendRequests(pd);
+ connect(pd,SIGNAL(timedout(const Request& )),this,SLOT(onTimeout(const Request& )));
+ connect(pd,SIGNAL(rejected( const Request& )),this,SLOT(onRejected( const Request& )));
+ return true;
+ }
+
+ void ChunkDownload::notDownloaded(const Request & r,bool reject)
+ {
+ // find the peer
+ DownloadStatus* ds = dstatus.find(r.getPeer());
+ if (ds)
+ {
+ // Out() << "ds != 0" << endl;
+ Uint32 p = r.getOffset() / MAX_PIECE_LEN;
+ ds->remove(p);
+ }
+
+ // go over all PD's and do requets again
+ for (QPtrList<PeerDownloader>::iterator i = pdown.begin();i != pdown.end();++i)
+ sendRequests(*i);
+ }
+
+ void ChunkDownload::onRejected(const Request & r)
+ {
+ if (chunk->getIndex() == r.getIndex())
+ {
+// Out(SYS_CON|LOG_DEBUG) << QString("Request rejected %1 %2 %3 %4").arg(r.getIndex()).arg(r.getOffset()).arg(r.getLength()).arg(r.getPeer()) << endl;
+
+ notDownloaded(r,true);
+ }
+ }
+
+ void ChunkDownload::onTimeout(const Request & r)
+ {
+ // see if we are dealing with a piece of ours
+ if (chunk->getIndex() == r.getIndex())
+ {
+ Out(SYS_CON|LOG_DEBUG) << QString("Request timed out %1 %2 %3 %4").arg(r.getIndex()).arg(r.getOffset()).arg(r.getLength()).arg(r.getPeer()) << endl;
+
+ notDownloaded(r,false);
+ }
+ }
+
+ void ChunkDownload::sendRequests(PeerDownloader* pd)
+ {
+ timer.update();
+ DownloadStatus* ds = dstatus.find(pd->getPeer()->getID());
+ if (!ds)
+ return;
+
+ // if the peer is choked and we are not downloading an allowed fast chunk
+ if (pd->isChoked())
+ return;
+
+ Uint32 num_visited = 0;
+ while (num_visited < piece_queue.count() && pd->canAddRequest())
+ {
+ // get the first one in the queue
+ Uint32 i = piece_queue.first();
+ if (!ds->contains(i))
+ {
+ // send request
+ pd->download(
+ Request(
+ chunk->getIndex(),
+ i*MAX_PIECE_LEN,
+ i+1<num ? MAX_PIECE_LEN : last_size,
+ pd->getPeer()->getID()));
+ ds->add(i);
+ }
+ // move to the back so that it will take a while before it's turn is up
+ piece_queue.pop_front();
+ piece_queue.append(i);
+ num_visited++;
+ }
+
+ if (piece_queue.count() < 2 && piece_queue.count() > 0)
+ pd->setNearlyDone(true);
+ }
+
+
+
+ void ChunkDownload::update()
+ {
+ // go over all PD's and do requets again
+ for (QPtrList<PeerDownloader>::iterator i = pdown.begin();i != pdown.end();++i)
+ sendRequests(*i);
+ }
+
+
+ void ChunkDownload::sendCancels(PeerDownloader* pd)
+ {
+ DownloadStatus* ds = dstatus.find(pd->getPeer()->getID());
+ if (!ds)
+ return;
+
+ DownloadStatus::iterator itr = ds->begin();
+ while (itr != ds->end())
+ {
+ Uint32 i = *itr;
+ pd->cancel(
+ Request(
+ chunk->getIndex(),
+ i*MAX_PIECE_LEN,
+ i+1<num ? MAX_PIECE_LEN : last_size,0));
+ itr++;
+ }
+ ds->clear();
+ timer.update();
+ }
+
+ void ChunkDownload::endgameCancel(const Piece & p)
+ {
+ QPtrList<PeerDownloader>::iterator i = pdown.begin();
+ while (i != pdown.end())
+ {
+ PeerDownloader* pd = *i;
+ DownloadStatus* ds = dstatus.find(pd->getPeer()->getID());
+ Uint32 pp = p.getOffset() / MAX_PIECE_LEN;
+ if (ds && ds->contains(pp))
+ {
+ pd->cancel(Request(p));
+ ds->remove(pp);
+ }
+ i++;
+ }
+ }
+
+ void ChunkDownload::peerKilled(PeerDownloader* pd)
+ {
+ if (!pdown.contains(pd))
+ return;
+
+ dstatus.erase(pd->getPeer()->getID());
+ pdown.remove(pd);
+ disconnect(pd,SIGNAL(timedout(const Request& )),this,SLOT(onTimeout(const Request& )));
+ disconnect(pd,SIGNAL(rejected( const Request& )),this,SLOT(onRejected( const Request& )));
+ }
+
+
+ const Peer* ChunkDownload::getCurrentPeer() const
+ {
+ if (pdown.count() == 0)
+ return 0;
+ else
+ return pdown.getFirst()->getPeer();
+ }
+
+ Uint32 ChunkDownload::getChunkIndex() const
+ {
+ return chunk->getIndex();
+ }
+
+ QString ChunkDownload::getCurrentPeerID() const
+ {
+ if (pdown.count() == 0)
+ {
+ return QString::null;
+ }
+ else if (pdown.count() == 1)
+ {
+ const Peer* p = pdown.getFirst()->getPeer();
+ return p->getPeerID().identifyClient();
+ }
+ else
+ {
+ return i18n("1 peer","%n peers",pdown.count());
+ }
+ }
+
+ Uint32 ChunkDownload::getDownloadSpeed() const
+ {
+ Uint32 r = 0;
+ QPtrList<PeerDownloader>::const_iterator i = pdown.begin();
+ while (i != pdown.end())
+ {
+ const PeerDownloader* pd = *i;
+ r += pd->getPeer()->getDownloadRate();
+ i++;
+ }
+ return r;
+ }
+
+
+
+ void ChunkDownload::save(File & file)
+ {
+ ChunkDownloadHeader hdr;
+ hdr.index = chunk->getIndex();
+ hdr.num_bits = pieces.getNumBits();
+ hdr.buffered = chunk->getStatus() == Chunk::BUFFERED ? 1 : 0;
+ // save the chunk header
+ file.write(&hdr,sizeof(ChunkDownloadHeader));
+ // save the bitset
+ file.write(pieces.getData(),pieces.getNumBytes());
+ if (hdr.buffered)
+ {
+ // if it's a buffered chunk, save the contents to
+ file.write(chunk->getData(),chunk->getSize());
+ chunk->clear();
+ chunk->setStatus(Chunk::ON_DISK);
+ }
+ }
+
+ bool ChunkDownload::load(File & file,ChunkDownloadHeader & hdr)
+ {
+ // read pieces
+ if (hdr.num_bits != num)
+ return false;
+
+ pieces = BitSet(hdr.num_bits);
+ Array<Uint8> data(pieces.getNumBytes());
+ file.read(data,pieces.getNumBytes());
+ pieces = BitSet(data,hdr.num_bits);
+ num_downloaded = pieces.numOnBits();
+ if (hdr.buffered)
+ {
+ // if it's a buffered chunk, load the data to
+ if (file.read(chunk->getData(),chunk->getSize()) != chunk->getSize())
+ return false;
+ }
+
+ for (Uint32 i = 0;i < pieces.getNumBits();i++)
+ if (pieces.get(i))
+ piece_queue.remove(i);
+
+ updateHash();
+ return true;
+ }
+
+ Uint32 ChunkDownload::bytesDownloaded() const
+ {
+ Uint32 num_bytes = 0;
+ for (Uint32 i = 0;i < num;i++)
+ {
+ if (pieces.get(i))
+ {
+ num_bytes += i == num-1 ? last_size : MAX_PIECE_LEN;
+ }
+ }
+ return num_bytes;
+ }
+
+ void ChunkDownload::cancelAll()
+ {
+ QPtrList<PeerDownloader>::iterator i = pdown.begin();
+ while (i != pdown.end())
+ {
+ sendCancels(*i);
+ i++;
+ }
+ }
+
+ bool ChunkDownload::getOnlyDownloader(Uint32 & pid)
+ {
+ if (piece_providers.size() == 1)
+ {
+ pid = *piece_providers.begin();
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ void ChunkDownload::getStats(Stats & s)
+ {
+ s.chunk_index = chunk->getIndex();
+ s.current_peer_id = getCurrentPeerID();
+ s.download_speed = getDownloadSpeed();
+ s.num_downloaders = getNumDownloaders();
+ s.pieces_downloaded = num_downloaded;
+ s.total_pieces = num;
+ }
+
+ bool ChunkDownload::isChoked() const
+ {
+ QPtrList<PeerDownloader>::const_iterator i = pdown.begin();
+ while (i != pdown.end())
+ {
+ const PeerDownloader* pd = *i;
+ // if there is one which isn't choked
+ if (!pd->isChoked())
+ return false;
+ i++;
+ }
+ return true;
+ }
+
+ void ChunkDownload::updateHash()
+ {
+ // update the hash until where we can
+ Uint32 nn = num_pieces_in_hash;
+ while (pieces.get(nn) && nn < num)
+ nn++;
+
+ for (Uint32 i = num_pieces_in_hash;i < nn;i++)
+ {
+ const Uint8* data = chunk->getData() + i * MAX_PIECE_LEN;
+ hash_gen.update(data,i == num - 1 ? last_size : MAX_PIECE_LEN);
+ }
+ num_pieces_in_hash = nn;
+ }
+
+ bool ChunkDownload::usingContinuousHashing() const
+ {
+ // if the pieces are larger then 1 MB we will be using the continuous hashing feature
+ return pieces.getNumBits() > 64;
+ }
+}
+#include "chunkdownload.moc"
diff --git a/libktorrent/torrent/chunkdownload.h b/libktorrent/torrent/chunkdownload.h
new file mode 100644
index 0000000..4119a5b
--- /dev/null
+++ b/libktorrent/torrent/chunkdownload.h
@@ -0,0 +1,207 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCHUNKDOWNLOAD_H
+#define BTCHUNKDOWNLOAD_H
+
+#include <set>
+#include <qobject.h>
+#include <qptrlist.h>
+#include <util/timer.h>
+#include <util/ptrmap.h>
+#include <util/sha1hashgen.h>
+#include <interfaces/chunkdownloadinterface.h>
+#include <util/bitset.h>
+#include "globals.h"
+#include "peerid.h"
+
+
+namespace bt
+{
+
+ class File;
+ class Chunk;
+ class Piece;
+ class Peer;
+ class Request;
+ class PeerDownloader;
+ class DownloadStatus;
+
+ struct ChunkDownloadHeader
+ {
+ Uint32 index;
+ Uint32 num_bits;
+ Uint32 buffered;
+ };
+
+
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Handles the download off one Chunk off a Peer
+ *
+ * This class handles the download of one Chunk.
+ */
+ class ChunkDownload : public QObject,public kt::ChunkDownloadInterface
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, set the chunk and the PeerManager.
+ * @param chunk The Chunk
+ */
+ ChunkDownload(Chunk* chunk);
+
+ virtual ~ChunkDownload();
+
+ /// Get the chunk
+ Chunk* getChunk() {return chunk;}
+
+ /// Get the total number of pieces
+ Uint32 getTotalPieces() const {return num;}
+
+ /// Get the number of pieces downloaded
+ Uint32 getPiecesDownloaded() const {return num_downloaded;}
+
+ /// Get the number of bytes downloaded.
+ Uint32 bytesDownloaded() const;
+
+ /// Get the index of the chunk
+ Uint32 getChunkIndex() const;
+
+ /// Get the current peer
+ const Peer* getCurrentPeer() const;
+
+ /// Get the PeerID of the current peer
+ QString getCurrentPeerID() const;
+
+ /// Get the download speed
+ Uint32 getDownloadSpeed() const;
+
+ /// Get download stats
+ void getStats(Stats & s);
+
+ /// See if a chunkdownload is idle (i.e. has no downloaders)
+ bool isIdle() const {return pdown.count() == 0;}
+
+ /**
+ * A Piece has arived.
+ * @param p The Piece
+ * @param ok Wether or not the piece was needed
+ * @return true If Chunk is complete
+ */
+ bool piece(const Piece & p,bool & ok);
+
+ /**
+ * Assign the downloader to download from.
+ * @param pd The downloader
+ * @return true if the peer was asigned, false if not
+ */
+ bool assignPeer(PeerDownloader* pd);
+
+ Uint32 getNumDownloaders() const {return pdown.count();}
+
+ /**
+ * A Peer has been killed. We need to remove it's
+ * PeerDownloader.
+ * @param pd The PeerDownloader
+ */
+ void peerKilled(PeerDownloader* pd);
+
+ /**
+ * Save to a File
+ * @param file The File
+ */
+ void save(File & file);
+
+ /**
+ * Load from a File
+ * @param file The File
+ */
+ bool load(File & file,ChunkDownloadHeader & hdr);
+
+ /**
+ * Cancel all requests.
+ */
+ void cancelAll();
+
+ /**
+ * When a Chunk is downloaded, this function checks if all
+ * pieces are delivered by the same peer and if so sets
+ * that peers' ID.
+ * @param pid The peers' ID (!= PeerID)
+ * @return true if there is only one downloader
+ */
+ bool getOnlyDownloader(Uint32 & pid);
+
+ /// See if a PeerDownloader is assigned to this chunk
+ bool containsPeer(PeerDownloader *pd) {return pdown.contains(pd);}
+
+ /// See if the download is choked (i.e. all downloaders are choked)
+ bool isChoked() const;
+
+ /// Release all PD's and clear the requested chunks
+ void releaseAllPDs();
+
+ /// Send requests to peers
+ void update();
+
+ /// See if this CD hasn't been active in the last update
+ bool needsToBeUpdated() const {return timer.getElapsedSinceUpdate() > 60 * 1000;}
+
+ /// Get the SHA1 hash of the downloaded chunk
+ SHA1Hash getHash() const {return hash_gen.get();}
+
+ /// Are we using the continous hashing feature for this chunk
+ bool usingContinuousHashing() const;
+
+ private slots:
+ void sendRequests(PeerDownloader* pd);
+ void sendCancels(PeerDownloader* pd);
+ void endgameCancel(const Piece & p);
+ void onTimeout(const Request & r);
+ void onRejected(const Request & r);
+
+ private:
+ void notDownloaded(const Request & r,bool reject);
+ void updateHash();
+
+ private:
+ BitSet pieces;
+ QValueList<Uint32> piece_queue;
+ Chunk* chunk;
+ Uint32 num;
+ Uint32 num_downloaded;
+ Uint32 last_size;
+ Timer timer;
+ QPtrList<PeerDownloader> pdown;
+ PtrMap<Uint32,DownloadStatus> dstatus;
+ std::set<Uint32> piece_providers;
+
+
+ SHA1HashGen hash_gen;
+ Uint32 num_pieces_in_hash;
+
+ friend File & operator << (File & out,const ChunkDownload & cd);
+ friend File & operator >> (File & in,ChunkDownload & cd);
+ };
+}
+
+#endif
diff --git a/libktorrent/torrent/chunkmanager.cpp b/libktorrent/torrent/chunkmanager.cpp
new file mode 100644
index 0000000..08aac97
--- /dev/null
+++ b/libktorrent/torrent/chunkmanager.cpp
@@ -0,0 +1,1157 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <algorithm>
+#include <util/file.h>
+#include <util/array.h>
+#include <qstringlist.h>
+#include "chunkmanager.h"
+#include "torrent.h"
+#include <util/error.h>
+#include <util/bitset.h>
+#include <util/fileops.h>
+#include "singlefilecache.h"
+#include "multifilecache.h"
+#include <util/log.h>
+#include <util/functions.h>
+#include "globals.h"
+
+#include <klocale.h>
+
+namespace bt
+{
+
+ Uint32 ChunkManager::max_chunk_size_for_data_check = 0;
+
+
+ ChunkManager::ChunkManager(
+ Torrent & tor,
+ const QString & tmpdir,
+ const QString & datadir,
+ bool custom_output_name)
+ : tor(tor),chunks(tor.getNumChunks()),
+ bitset(tor.getNumChunks()),excluded_chunks(tor.getNumChunks()),only_seed_chunks(tor.getNumChunks()),todo(tor.getNumChunks())
+ {
+ during_load = false;
+ only_seed_chunks.setAll(false);
+ todo.setAll(true);
+ if (tor.isMultiFile())
+ cache = new MultiFileCache(tor,tmpdir,datadir,custom_output_name);
+ else
+ cache = new SingleFileCache(tor,tmpdir,datadir);
+
+ index_file = tmpdir + "index";
+ file_info_file = tmpdir + "file_info";
+ file_priority_file = tmpdir + "file_priority";
+ Uint64 tsize = tor.getFileLength(); // total size
+ Uint64 csize = tor.getChunkSize(); // chunk size
+ Uint64 lsize = tsize - (csize * (tor.getNumChunks() - 1)); // size of last chunk
+
+ for (Uint32 i = 0;i < tor.getNumChunks();i++)
+ {
+ if (i + 1 < tor.getNumChunks())
+ chunks.insert(i,new Chunk(i,csize));
+ else
+ chunks.insert(i,new Chunk(i,lsize));
+ }
+ chunks.setAutoDelete(true);
+ chunks_left = 0;
+ recalc_chunks_left = true;
+ corrupted_count = recheck_counter = 0;
+
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ connect(&tf,SIGNAL(downloadPriorityChanged(TorrentFile*, Priority, Priority )),
+ this,SLOT(downloadPriorityChanged(TorrentFile*, Priority, Priority )));
+
+ if (tf.getPriority() != NORMAL_PRIORITY)
+ {
+ downloadPriorityChanged(&tf,tf.getPriority(),tf.getOldPriority());
+ }
+ }
+
+ if(tor.isMultiFile())
+ {
+ for(Uint32 i=0; i<tor.getNumFiles(); ++i)
+ {
+ bt::TorrentFile & file = tor.getFile(i);
+ if (!file.isMultimedia() || file.getPriority() == bt::ONLY_SEED_PRIORITY)
+ continue;
+
+ if (file.getFirstChunk() == file.getLastChunk())
+ {
+ // prioritise whole file
+ prioritise(file.getFirstChunk(),file.getLastChunk(),PREVIEW_PRIORITY);
+ }
+ else
+ {
+ Uint32 chunkOffset;
+ chunkOffset = ((file.getLastChunk() - file.getFirstChunk()) / 100) + 1;
+ prioritise(file.getFirstChunk(), file.getFirstChunk()+chunkOffset, PREVIEW_PRIORITY);
+ if (file.getLastChunk() - file.getFirstChunk() > chunkOffset)
+ {
+ prioritise(file.getLastChunk() - chunkOffset, file.getLastChunk(), PREVIEW_PRIORITY);
+ }
+ }
+ }
+ }
+ else
+ {
+ if(tor.isMultimedia())
+ {
+ Uint32 chunkOffset;
+ chunkOffset = (tor.getNumChunks() / 100) + 1;
+
+ prioritise(0,chunkOffset,PREVIEW_PRIORITY);
+ if (tor.getNumChunks() > chunkOffset)
+ {
+ prioritise(tor.getNumChunks() - chunkOffset, tor.getNumChunks() - 1,PREVIEW_PRIORITY);
+ }
+ }
+ }
+ }
+
+
+ ChunkManager::~ChunkManager()
+ {
+ delete cache;
+ }
+
+ QString ChunkManager::getDataDir() const
+ {
+ return cache->getDataDir();
+ }
+
+ void ChunkManager::changeDataDir(const QString & data_dir)
+ {
+ cache->changeTmpDir(data_dir);
+ index_file = data_dir + "index";
+ file_info_file = data_dir + "file_info";
+ file_priority_file = data_dir + "file_priority";
+ }
+
+ KIO::Job* ChunkManager::moveDataFiles(const QString & ndir)
+ {
+ return cache->moveDataFiles(ndir);
+ }
+
+ void ChunkManager::moveDataFilesCompleted(KIO::Job* job)
+ {
+ cache->moveDataFilesCompleted(job);
+ }
+
+ void ChunkManager::changeOutputPath(const QString & output_path)
+ {
+ cache->changeOutputPath(output_path);
+ }
+
+ void ChunkManager::loadIndexFile()
+ {
+ during_load = true;
+ loadPriorityInfo();
+
+ File fptr;
+ if (!fptr.open(index_file,"rb"))
+ {
+ // no index file, so assume it's empty
+ bt::Touch(index_file,true);
+ Out(SYS_DIO|LOG_IMPORTANT) << "Can't open index file : " << fptr.errorString() << endl;
+ during_load = false;
+ return;
+ }
+
+ if (fptr.seek(File::END,0) != 0)
+ {
+ fptr.seek(File::BEGIN,0);
+
+ while (!fptr.eof())
+ {
+ NewChunkHeader hdr;
+ fptr.read(&hdr,sizeof(NewChunkHeader));
+ Chunk* c = getChunk(hdr.index);
+ if (c)
+ {
+ c->setStatus(Chunk::ON_DISK);
+ bitset.set(hdr.index,true);
+ todo.set(hdr.index,false);
+ recalc_chunks_left = true;
+ }
+ }
+ }
+ tor.updateFilePercentage(bitset);
+ during_load = false;
+ }
+
+ void ChunkManager::saveIndexFile()
+ {
+ File fptr;
+ if (!fptr.open(index_file,"wb"))
+ throw Error(i18n("Cannot open index file %1 : %2").arg(index_file).arg(fptr.errorString()));
+
+ for (unsigned int i = 0;i < tor.getNumChunks();i++)
+ {
+ Chunk* c = getChunk(i);
+ if (c->getStatus() != Chunk::NOT_DOWNLOADED)
+ {
+ NewChunkHeader hdr;
+ hdr.index = i;
+ fptr.write(&hdr,sizeof(NewChunkHeader));
+ }
+ }
+ savePriorityInfo();
+ }
+
+ void ChunkManager::createFiles(bool check_priority)
+ {
+ if (!bt::Exists(index_file))
+ {
+ File fptr;
+ fptr.open(index_file,"wb");
+ }
+ cache->create();
+ if (check_priority)
+ {
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ connect(&tf,SIGNAL(downloadPriorityChanged(TorrentFile*, Priority, Priority )),
+ this,SLOT(downloadPriorityChanged(TorrentFile*, Priority, Priority )));
+
+ if (tf.getPriority() != NORMAL_PRIORITY)
+ {
+ downloadPriorityChanged(&tf,tf.getPriority(),tf.getOldPriority());
+ }
+ }
+ }
+ }
+
+ bool ChunkManager::hasMissingFiles(QStringList & sl)
+ {
+ return cache->hasMissingFiles(sl);
+ }
+
+ Chunk* ChunkManager::getChunk(unsigned int i)
+ {
+ if (i >= chunks.count())
+ return 0;
+ else
+ return chunks[i];
+ }
+
+ void ChunkManager::start()
+ {
+ cache->open();
+ }
+
+ void ChunkManager::stop()
+ {
+ // unmmap all chunks which can
+ for (Uint32 i = 0;i < bitset.getNumBits();i++)
+ {
+ Chunk* c = chunks[i];
+ if (c->getStatus() == Chunk::MMAPPED)
+ {
+ cache->save(c);
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ }
+ else if (c->getStatus() == Chunk::BUFFERED)
+ {
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ }
+ }
+ cache->close();
+ }
+
+ Chunk* ChunkManager::grabChunk(unsigned int i)
+ {
+ if (i >= chunks.size())
+ return 0;
+
+ Chunk* c = chunks[i];
+ if (c->getStatus() == Chunk::NOT_DOWNLOADED || c->isExcluded())
+ {
+ return 0;
+ }
+ else if (c->getStatus() == Chunk::ON_DISK)
+ {
+ // load the chunk if it is on disk
+ cache->load(c);
+ loaded.insert(i,bt::GetCurrentTime());
+ bool check_allowed = (max_chunk_size_for_data_check == 0 || tor.getChunkSize() <= max_chunk_size_for_data_check);
+
+ // when no corruptions have been found, only check once every 5 chunks
+ if (check_allowed && recheck_counter < 5 && corrupted_count == 0)
+ check_allowed = false;
+
+ if (c->getData() && check_allowed)
+ {
+ recheck_counter = 0;
+ if (!c->checkHash(tor.getHash(i)))
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Chunk " << i
+ << " has been found invalid, redownloading" << endl;
+
+ resetChunk(i);
+ tor.updateFilePercentage(i,bitset);
+ saveIndexFile();
+ recalc_chunks_left = true;
+ corrupted_count++;
+ corrupted(i);
+ return 0;
+ }
+ }
+ else
+ {
+ recheck_counter++;
+ }
+ }
+
+ loaded.insert(i,bt::GetCurrentTime());
+ return c;
+ }
+
+ void ChunkManager::releaseChunk(unsigned int i)
+ {
+ if (i >= chunks.size())
+ return;
+
+ Chunk* c = chunks[i];
+ if (!c->taken())
+ {
+ if (c->getStatus() == Chunk::MMAPPED)
+ cache->save(c);
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ loaded.remove(i);
+ }
+ }
+
+ void ChunkManager::resetChunk(unsigned int i)
+ {
+ if (i >= chunks.size())
+ return;
+
+ Chunk* c = chunks[i];
+ if (c->getStatus() == Chunk::MMAPPED)
+ cache->save(c);
+ c->clear();
+ c->setStatus(Chunk::NOT_DOWNLOADED);
+ bitset.set(i,false);
+ todo.set(i,!excluded_chunks.get(i) && !only_seed_chunks.get(i));
+ loaded.remove(i);
+ tor.updateFilePercentage(i,bitset);
+ }
+
+ void ChunkManager::checkMemoryUsage()
+ {
+ Uint32 num_removed = 0;
+ QMap<Uint32,TimeStamp>::iterator i = loaded.begin();
+ while (i != loaded.end())
+ {
+ Chunk* c = chunks[i.key()];
+ // get rid of chunk if nobody asked for it in the last 5 seconds
+ if (!c->taken() && bt::GetCurrentTime() - i.data() > 5000)
+ {
+ if (c->getStatus() == Chunk::MMAPPED)
+ cache->save(c);
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ QMap<Uint32,TimeStamp>::iterator j = i;
+ i++;
+ loaded.erase(j);
+ num_removed++;
+ }
+ else
+ {
+ i++;
+ }
+ }
+ // Uint32 num_in_mem = loaded.count();
+ // Out() << QString("Cleaned %1 chunks, %2 still in memory").arg(num_removed).arg(num_in_mem) << endl;
+ }
+
+ void ChunkManager::saveChunk(unsigned int i,bool update_index)
+ {
+ if (i >= chunks.size())
+ return;
+
+ Chunk* c = chunks[i];
+ if (!c->isExcluded())
+ {
+ cache->save(c);
+
+ // update the index file
+ if (update_index)
+ {
+ bitset.set(i,true);
+ todo.set(i,false);
+ recalc_chunks_left = true;
+ writeIndexFileEntry(c);
+ tor.updateFilePercentage(i,bitset);
+ }
+ }
+ else
+ {
+ c->clear();
+ c->setStatus(Chunk::NOT_DOWNLOADED);
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning: attempted to save a chunk which was excluded" << endl;
+ }
+ }
+
+ void ChunkManager::writeIndexFileEntry(Chunk* c)
+ {
+ File fptr;
+ if (!fptr.open(index_file,"r+b"))
+ {
+ // no index file, so assume it's empty
+ bt::Touch(index_file,true);
+ Out(SYS_DIO|LOG_IMPORTANT) << "Can't open index file : " << fptr.errorString() << endl;
+ // try again
+ if (!fptr.open(index_file,"r+b"))
+ // panick if it failes
+ throw Error(i18n("Cannot open index file %1 : %2").arg(index_file).arg(fptr.errorString()));
+ }
+
+
+ fptr.seek(File::END,0);
+ NewChunkHeader hdr;
+ hdr.index = c->getIndex();
+ fptr.write(&hdr,sizeof(NewChunkHeader));
+ }
+
+ Uint32 ChunkManager::onlySeedChunks() const
+ {
+ return only_seed_chunks.numOnBits();
+ }
+
+ bool ChunkManager::completed() const
+ {
+ return todo.numOnBits() == 0 && bitset.numOnBits() > 0;
+ }
+
+ Uint64 ChunkManager::bytesLeft() const
+ {
+ Uint32 num_left = bitset.getNumBits() - bitset.numOnBits();
+ Uint32 last = chunks.size() - 1;
+ if (last < chunks.size() && !bitset.get(last))
+ {
+ Chunk* c = chunks[last];
+ if (c)
+ return (num_left - 1)*tor.getChunkSize() + c->getSize();
+ else
+ return num_left*tor.getChunkSize();
+ }
+ else
+ {
+ return num_left*tor.getChunkSize();
+ }
+ }
+
+ Uint64 ChunkManager::bytesLeftToDownload() const
+ {
+ Uint32 num_left = todo.numOnBits();
+ Uint32 last = chunks.size() - 1;
+ if (last < chunks.size() && todo.get(last))
+ {
+ Chunk* c = chunks[last];
+ if (c)
+ return (num_left - 1)*tor.getChunkSize() + c->getSize();
+ else
+ return num_left*tor.getChunkSize();
+ }
+ else
+ {
+ return num_left*tor.getChunkSize();
+ }
+ }
+
+ Uint32 ChunkManager::chunksLeft() const
+ {
+ if (!recalc_chunks_left)
+ return chunks_left;
+
+ Uint32 num = 0;
+ Uint32 tot = chunks.size();
+ for (Uint32 i = 0;i < tot;i++)
+ {
+ const Chunk* c = chunks[i];
+ if (!bitset.get(i) && !c->isExcluded())
+ num++;
+ }
+ chunks_left = num;
+ recalc_chunks_left = false;
+ return num;
+ }
+
+ bool ChunkManager::haveAllChunks() const
+ {
+ return bitset.numOnBits() == bitset.getNumBits();
+ }
+
+ Uint64 ChunkManager::bytesExcluded() const
+ {
+ Uint64 excl = 0;
+ if (excluded_chunks.get(tor.getNumChunks() - 1))
+ {
+ Chunk* c = chunks[tor.getNumChunks() - 1];
+ Uint32 num = excluded_chunks.numOnBits() - 1;
+ excl = tor.getChunkSize() * num + c->getSize();
+ }
+ else
+ {
+ excl = tor.getChunkSize() * excluded_chunks.numOnBits();
+ }
+
+ if (only_seed_chunks.get(tor.getNumChunks() - 1))
+ {
+ Chunk* c = chunks[tor.getNumChunks() - 1];
+ Uint32 num = only_seed_chunks.numOnBits() - 1;
+ excl += tor.getChunkSize() * num + c->getSize();
+ }
+ else
+ {
+ excl += tor.getChunkSize() * only_seed_chunks.numOnBits();
+ }
+ return excl;
+ }
+
+ Uint32 ChunkManager::chunksExcluded() const
+ {
+ return excluded_chunks.numOnBits() + only_seed_chunks.numOnBits();
+ }
+
+ Uint32 ChunkManager::chunksDownloaded() const
+ {
+ return bitset.numOnBits();
+ }
+
+ void ChunkManager::debugPrintMemUsage()
+ {
+ Out(SYS_DIO|LOG_DEBUG) << "Active Chunks : " << loaded.count()<< endl;
+ }
+
+ void ChunkManager::prioritise(Uint32 from,Uint32 to,Priority priority)
+ {
+ if (from > to)
+ std::swap(from,to);
+
+ Uint32 i = from;
+ while (i <= to && i < chunks.count())
+ {
+ Chunk* c = chunks[i];
+ c->setPriority(priority);
+
+ if (priority == ONLY_SEED_PRIORITY)
+ {
+ only_seed_chunks.set(i,true);
+ todo.set(i,false);
+ }
+ else if (priority == EXCLUDED)
+ {
+ only_seed_chunks.set(i,false);
+ todo.set(i,false);
+ }
+ else
+ {
+ only_seed_chunks.set(i,false);
+ todo.set(i,!bitset.get(i));
+ }
+
+ i++;
+ }
+ updateStats();
+ }
+
+ void ChunkManager::exclude(Uint32 from,Uint32 to)
+ {
+ if (from > to)
+ std::swap(from,to);
+
+ Uint32 i = from;
+ while (i <= to && i < chunks.count())
+ {
+ Chunk* c = chunks[i];
+ c->setExclude(true);
+ excluded_chunks.set(i,true);
+ only_seed_chunks.set(i,false);
+ todo.set(i,false);
+ bitset.set(i,false);
+ i++;
+ }
+ recalc_chunks_left = true;
+ excluded(from,to);
+ updateStats();
+ }
+
+ void ChunkManager::include(Uint32 from,Uint32 to)
+ {
+ if (from > to)
+ std::swap(from,to);
+
+ Uint32 i = from;
+ while (i <= to && i < chunks.count())
+ {
+ Chunk* c = chunks[i];
+ c->setExclude(false);
+ excluded_chunks.set(i,false);
+ if (!bitset.get(i))
+ todo.set(i,true);
+ i++;
+ }
+ recalc_chunks_left = true;
+ updateStats();
+ included(from,to);
+ }
+
+ void ChunkManager::saveFileInfo()
+ {
+ // saves which TorrentFiles do not need to be downloaded
+ File fptr;
+ if (!fptr.open(file_info_file,"wb"))
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning : Can't save chunk_info file : " << fptr.errorString() << endl;
+ return;
+ }
+
+ // first write the number of excluded ones
+ // don't know this yet, so write 0 for the time being
+ Uint32 tmp = 0;
+ fptr.write(&tmp,sizeof(Uint32));
+
+ Uint32 i = 0;
+ Uint32 cnt = 0;
+ while (i < tor.getNumFiles())
+ {
+ if (tor.getFile(i).doNotDownload())
+ {
+ fptr.write(&i,sizeof(Uint32));
+ cnt++;
+ }
+ i++;
+ }
+
+ // go back to the beginning and write the number of files
+ fptr.seek(File::BEGIN,0);
+ fptr.write(&cnt,sizeof(Uint32));
+ fptr.flush();
+ }
+
+ void ChunkManager::loadFileInfo()
+ {
+ if (during_load)
+ return;
+
+ File fptr;
+ if (!fptr.open(file_info_file,"rb"))
+ return;
+
+ Uint32 num = 0,tmp = 0;
+ // first read the number of dnd files
+ if (fptr.read(&num,sizeof(Uint32)) != sizeof(Uint32))
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning : error reading chunk_info file" << endl;
+ return;
+ }
+
+ for (Uint32 i = 0;i < num;i++)
+ {
+ if (fptr.read(&tmp,sizeof(Uint32)) != sizeof(Uint32))
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning : error reading chunk_info file" << endl;
+ return;
+ }
+
+ bt::TorrentFile & tf = tor.getFile(tmp);
+ if (!tf.isNull())
+ {
+ Out(SYS_DIO|LOG_DEBUG) << "Excluding : " << tf.getPath() << endl;
+ tf.setDoNotDownload(true);
+ }
+ }
+ }
+
+ void ChunkManager::savePriorityInfo()
+ {
+ if (during_load)
+ return;
+
+ //save priority info and call saveFileInfo
+ saveFileInfo();
+ File fptr;
+ if (!fptr.open(file_priority_file,"wb"))
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning : Can't save chunk_info file : " << fptr.errorString() << endl;
+ return;
+ }
+
+ try
+ {
+ // first write the number of excluded ones
+ // don't know this yet, so write 0 for the time being
+ Uint32 tmp = 0;
+ fptr.write(&tmp,sizeof(Uint32));
+
+ Uint32 i = 0;
+ Uint32 cnt = 0;
+ while (i < tor.getNumFiles())
+ {
+ const TorrentFile & tf = tor.getFile(i);
+ if (tf.getPriority() != NORMAL_PRIORITY)
+ {
+ tmp = tf.getPriority();
+ fptr.write(&i,sizeof(Uint32));
+ fptr.write(&tmp,sizeof(Uint32));
+ cnt+=2;
+ }
+ i++;
+ }
+
+ // go back to the beginning and write the number of items
+ fptr.seek(File::BEGIN,0);
+ fptr.write(&cnt,sizeof(Uint32));
+ fptr.flush();
+ }
+ catch (bt::Error & err)
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Failed to save priority file " << err.toString() << endl;
+ bt::Delete(file_priority_file,true);
+ }
+ }
+
+ void ChunkManager::loadPriorityInfo()
+ {
+ //load priority info and if that fails load file info
+ File fptr;
+ if (!fptr.open(file_priority_file,"rb"))
+ {
+ loadFileInfo();
+ return;
+ }
+
+ Uint32 num = 0;
+ // first read the number of lines
+ if (fptr.read(&num,sizeof(Uint32)) != sizeof(Uint32) || num > 2*tor.getNumFiles())
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning : error reading chunk_info file" << endl;
+ loadFileInfo();
+ return;
+ }
+
+ Array<Uint32> buf(num);
+ if (fptr.read(buf,sizeof(Uint32)*num) != sizeof(Uint32)*num)
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning : error reading chunk_info file" << endl;
+ loadFileInfo();
+ return;
+ }
+
+ fptr.close();
+
+ for (Uint32 i = 0;i < num;i += 2)
+ {
+ Uint32 idx = buf[i];
+ if (idx >= tor.getNumFiles())
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Warning : error reading chunk_info file" << endl;
+ loadFileInfo();
+ return;
+ }
+
+ bt::TorrentFile & tf = tor.getFile(idx);
+
+ if (!tf.isNull())
+ {
+ // numbers are to be compatible with old chunk info files
+ switch(buf[i+1])
+ {
+ case FIRST_PRIORITY:
+ case 3:
+ tf.setPriority(FIRST_PRIORITY);
+ break;
+ case NORMAL_PRIORITY:
+ case 2:
+ tf.setPriority(NORMAL_PRIORITY);
+ break;
+ case EXCLUDED:
+ case 0:
+ //tf.setDoNotDownload(true);
+ tf.setPriority(EXCLUDED);
+ break;
+ case ONLY_SEED_PRIORITY:
+ case -1:
+ tf.setPriority(ONLY_SEED_PRIORITY);
+ break;
+ default:
+ tf.setPriority(LAST_PRIORITY);
+ break;
+ }
+ }
+ }
+ }
+
+ void ChunkManager::downloadStatusChanged(TorrentFile* tf,bool download)
+ {
+ Uint32 first = tf->getFirstChunk();
+ Uint32 last = tf->getLastChunk();
+ if (download)
+ {
+ // include the chunks
+ include(first,last);
+
+ // if it is a multimedia file, prioritise first and last chunks of file
+ if (tf->isMultimedia())
+ {
+ Uint32 chunkOffset;
+ chunkOffset = ((last - first) / 100) + 1;
+
+ prioritise(first,first+chunkOffset,PREVIEW_PRIORITY);
+ if (last - first > 2)
+ {
+ prioritise(last - chunkOffset, last, PREVIEW_PRIORITY);
+ //prioritise(last -1,last, PREVIEW_PRIORITY);
+ }
+ }
+ }
+ else
+ {
+ // Out(SYS_DIO|LOG_DEBUG) << "Excluding chunks " << first << " to " << last << endl;
+ // first and last chunk may be part of multiple files
+ // so we can't just exclude them
+ QValueList<Uint32> files,last_files;
+
+ // get list of files where first chunk lies in
+ tor.calcChunkPos(first,files);
+ tor.calcChunkPos(last,last_files);
+ // check for exceptional case which causes very long loops
+ if (first == last && files.count() > 1)
+ {
+ cache->downloadStatusChanged(tf,download);
+ savePriorityInfo();
+ return;
+ }
+
+ // go over all chunks from first to last and mark them as not downloaded
+ // (first and last not included)
+ for (Uint32 i = first + 1;i < last;i++)
+ resetChunk(i);
+
+ // if the first chunk only lies in one file, reset it
+ if (files.count() == 1 && first != 0)
+ {
+ // Out(SYS_DIO|LOG_DEBUG) << "Resetting first " << first << endl;
+ resetChunk(first);
+ }
+
+ // if the last chunk only lies in one file reset it
+ if (last != first && last_files.count() == 1)
+ {
+ // Out(SYS_DIO|LOG_DEBUG) << "Resetting last " << last << endl;
+ resetChunk(last);
+ }
+
+ Priority maxp = ONLY_SEED_PRIORITY;
+ bool reprioritise_border_chunk = false;
+ bool modified = false;
+
+ // if one file in the list needs to be downloaded,increment first
+ for (QValueList<Uint32>::iterator i = files.begin();i != files.end();i++)
+ {
+ if (*i == tf->getIndex())
+ continue;
+
+ const TorrentFile & other = tor.getFile(*i);
+ if (!other.doNotDownload())
+ {
+ if (first != last && !modified)
+ {
+ first++;
+ reprioritise_border_chunk = true;
+ modified = true;
+ }
+
+ if (other.getPriority() > maxp)
+ maxp = other.getPriority();
+ }
+ }
+
+ // in case we have incremented first, we better reprioritise the border chunk
+ if (reprioritise_border_chunk)
+ prioritise(first-1,first-1,maxp);
+
+ maxp = ONLY_SEED_PRIORITY;
+ reprioritise_border_chunk = false;
+ modified = false;
+
+ // if one file in the list needs to be downloaded,decrement last
+ for (QValueList<Uint32>::iterator i = last_files.begin();i != last_files.end();i++)
+ {
+ if (*i == tf->getIndex())
+ continue;
+
+ const TorrentFile & other = tor.getFile(*i);
+ if (!other.doNotDownload())
+ {
+ if (first != last && last > 0 && !modified)
+ {
+ last--;
+ reprioritise_border_chunk = true;
+ modified = true;
+ }
+
+ if (other.getPriority() > maxp)
+ maxp = other.getPriority();
+ }
+ }
+
+ if (reprioritise_border_chunk)
+ prioritise(last+1,last+1,maxp);
+
+ // last smaller then first is not normal, so just return
+ if (last < first)
+ {
+ cache->downloadStatusChanged(tf,download);
+ savePriorityInfo();
+ return;
+ }
+
+ // Out(SYS_DIO|LOG_DEBUG) << "exclude " << first << " to " << last << endl;
+ exclude(first,last);
+ }
+ // alert the cache but first put things in critical operation mode
+ cache->downloadStatusChanged(tf,download);
+ savePriorityInfo();
+ }
+
+ void ChunkManager::downloadPriorityChanged(TorrentFile* tf,Priority newpriority,Priority oldpriority)
+ {
+ if (newpriority == EXCLUDED)
+ {
+ downloadStatusChanged(tf, false);
+ return;
+ }
+ if (oldpriority == EXCLUDED)
+ {
+ downloadStatusChanged(tf, true);
+ return;
+ }
+
+ savePriorityInfo();
+
+ Uint32 first = tf->getFirstChunk();
+ Uint32 last = tf->getLastChunk();
+
+ // first and last chunk may be part of multiple files
+ // so we can't just exclude them
+ QValueList<Uint32> files;
+
+ // get list of files where first chunk lies in
+ tor.calcChunkPos(first,files);
+
+ Chunk* c = chunks[first];
+ // if one file in the list needs to be downloaded,increment first
+ for (QValueList<Uint32>::iterator i = files.begin();i != files.end();i++)
+ {
+ Priority np = tor.getFile(*i).getPriority();
+ if (np > newpriority && *i != tf->getIndex())
+ {
+ // make sure we don't go past last
+ if (first == last)
+ return;
+
+ first++;
+ break;
+ }
+ }
+
+ files.clear();
+ // get list of files where last chunk lies in
+ tor.calcChunkPos(last,files);
+ c = chunks[last];
+ // if one file in the list needs to be downloaded,decrement last
+ for (QValueList<Uint32>::iterator i = files.begin();i != files.end();i++)
+ {
+ Priority np = tor.getFile(*i).getPriority();
+ if (np > newpriority && *i != tf->getIndex())
+ {
+ // make sure we don't wrap around
+ if (last == 0 || last == first)
+ return;
+
+ last--;
+ break;
+ }
+ }
+
+ // last smaller then first is not normal, so just return
+ if (last < first)
+ {
+ return;
+ }
+
+
+ prioritise(first,last,newpriority);
+ if (newpriority == ONLY_SEED_PRIORITY)
+ excluded(first,last);
+ }
+
+ bool ChunkManager::prepareChunk(Chunk* c,bool allways)
+ {
+ if (!allways && c->getStatus() != Chunk::NOT_DOWNLOADED)
+ return false;
+
+ return cache->prep(c);
+ }
+
+ QString ChunkManager::getOutputPath() const
+ {
+ return cache->getOutputPath();
+ }
+
+ void ChunkManager::preallocateDiskSpace(PreallocationThread* prealloc)
+ {
+ cache->preallocateDiskSpace(prealloc);
+ }
+
+ void ChunkManager::dataChecked(const BitSet & ok_chunks)
+ {
+ // go over all chunks at check each of them
+ for (Uint32 i = 0;i < chunks.count();i++)
+ {
+ Chunk* c = chunks[i];
+ if (ok_chunks.get(i) && !bitset.get(i))
+ {
+ // We think we do not hae a chunk, but we do have it
+ bitset.set(i,true);
+ todo.set(i,false);
+ // the chunk must be on disk
+ c->setStatus(Chunk::ON_DISK);
+ tor.updateFilePercentage(i,bitset);
+ }
+ else if (!ok_chunks.get(i) && bitset.get(i))
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Previously OK chunk " << i << " is corrupt !!!!!" << endl;
+ // We think we have a chunk, but we don't
+ bitset.set(i,false);
+ todo.set(i,!only_seed_chunks.get(i) && !excluded_chunks.get(i));
+ if (c->getStatus() == Chunk::ON_DISK)
+ {
+ c->setStatus(Chunk::NOT_DOWNLOADED);
+ tor.updateFilePercentage(i,bitset);
+ }
+ else if (c->getStatus() == Chunk::MMAPPED || c->getStatus() == Chunk::BUFFERED)
+ {
+ resetChunk(i);
+ }
+ else
+ {
+ tor.updateFilePercentage(i,bitset);
+ }
+ }
+ }
+ recalc_chunks_left = true;
+ try
+ {
+ saveIndexFile();
+ }
+ catch (bt::Error & err)
+ {
+ Out(SYS_DIO|LOG_DEBUG) << "Failed to save index file : " << err.toString() << endl;
+ }
+ catch (...)
+ {
+ Out(SYS_DIO|LOG_DEBUG) << "Failed to save index file : unkown exception" << endl;
+ }
+ chunksLeft();
+ corrupted_count = 0;
+ }
+
+ bool ChunkManager::hasExistingFiles() const
+ {
+ return cache->hasExistingFiles();
+ }
+
+
+ void ChunkManager::recreateMissingFiles()
+ {
+ createFiles();
+ if (tor.isMultiFile())
+ {
+ // loop over all files and mark all chunks of all missing files as
+ // not downloaded
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (!tf.isMissing())
+ continue;
+
+ for (Uint32 j = tf.getFirstChunk(); j <= tf.getLastChunk();j++)
+ resetChunk(j);
+ tf.setMissing(false);
+ }
+ }
+ else
+ {
+ // reset all chunks in case of single file torrent
+ for (Uint32 j = 0; j < tor.getNumChunks();j++)
+ resetChunk(j);
+ }
+ saveIndexFile();
+ recalc_chunks_left = true;
+ chunksLeft();
+ }
+
+ void ChunkManager::dndMissingFiles()
+ {
+ // createFiles(); // create them again
+ // loop over all files and mark all chunks of all missing files as
+ // not downloaded
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (!tf.isMissing())
+ continue;
+
+ for (Uint32 j = tf.getFirstChunk(); j <= tf.getLastChunk();j++)
+ resetChunk(j);
+ tf.setMissing(false);
+ tf.setDoNotDownload(true); // set do not download
+ }
+ savePriorityInfo();
+ saveIndexFile();
+ recalc_chunks_left = true;
+ chunksLeft();
+ }
+
+ void ChunkManager::deleteDataFiles()
+ {
+ cache->deleteDataFiles();
+ }
+
+ Uint64 ChunkManager::diskUsage()
+ {
+ return cache->diskUsage();
+ }
+
+}
+
+#include "chunkmanager.moc"
diff --git a/libktorrent/torrent/chunkmanager.h b/libktorrent/torrent/chunkmanager.h
new file mode 100644
index 0000000..daa2300
--- /dev/null
+++ b/libktorrent/torrent/chunkmanager.h
@@ -0,0 +1,366 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCHUNKMANAGER_H
+#define BTCHUNKMANAGER_H
+
+#include <qmap.h>
+#include <qstring.h>
+#include <qobject.h>
+#include <qptrvector.h>
+#include <util/bitset.h>
+#include "chunk.h"
+#include "globals.h"
+
+class QStringList;
+
+namespace KIO
+{
+ class Job;
+}
+
+namespace bt
+{
+ class Torrent;
+ class Cache;
+ class TorrentFile;
+ class PreallocationThread;
+
+ struct NewChunkHeader
+ {
+ unsigned int index; // the Chunks index
+ unsigned int deprecated; // offset in cache file
+ };
+
+ /**
+ * @author Joris Guisson
+ *
+ * Manages all Chunk's and the cache file, where all the chunk's are stored.
+ * It also manages a separate index file, where the position of each piece
+ * in the cache file is stored.
+ *
+ * The chunks are stored in the cache file in the correct order. Eliminating
+ * the need for a file reconstruction algorithm for single files.
+ */
+ class ChunkManager : public QObject
+ {
+ Q_OBJECT
+
+ Torrent & tor;
+ QString index_file,file_info_file,file_priority_file;
+ QPtrVector<Chunk> chunks;
+ Cache* cache;
+ QMap<Uint32,TimeStamp> loaded; // loaded chunks and when they were loaded
+ BitSet bitset;
+ BitSet excluded_chunks;
+ BitSet only_seed_chunks;
+ BitSet todo;
+ mutable Uint32 chunks_left;
+ mutable bool recalc_chunks_left;
+ Uint32 corrupted_count;
+ Uint32 recheck_counter;
+ bool during_load;
+ public:
+ ChunkManager(Torrent & tor,
+ const QString & tmpdir,
+ const QString & datadir,
+ bool custom_output_name);
+ virtual ~ChunkManager();
+
+ /// Get the torrent
+ const Torrent & getTorrent() const {return tor;}
+
+ /// Get the data dir
+ QString getDataDir() const;
+
+ /// Get the actual output path
+ QString getOutputPath() const;
+
+ void changeOutputPath(const QString& output_path);
+
+ /// Remove obsolete chunks
+ void checkMemoryUsage();
+
+ /**
+ * Change the data dir.
+ * @param data_dir
+ */
+ void changeDataDir(const QString & data_dir);
+
+ /**
+ * Move the data files of the torrent.
+ * @param ndir The new directory
+ * @return The job doing the move
+ */
+ KIO::Job* moveDataFiles(const QString & ndir);
+
+ /**
+ * The move data files job has finished
+ * @param job The move job
+ */
+ void moveDataFilesCompleted(KIO::Job* job);
+
+ /**
+ * Loads the index file.
+ * @throw Error When it can be loaded
+ */
+ void loadIndexFile();
+
+ /**
+ * Create the cache file, and index files.
+ * @param check_priority Make sure chunk priorities and dnd status of files match
+ * @throw Error When it can be created
+ */
+ void createFiles(bool check_priority = false);
+
+ /**
+ * Test all files and see if they are not missing.
+ * If so put them in a list
+ */
+ bool hasMissingFiles(QStringList & sl);
+
+ /**
+ * Preallocate diskspace for all files
+ * @param prealloc The thread doing the preallocation
+ */
+ void preallocateDiskSpace(PreallocationThread* prealloc);
+
+ /**
+ * Open the necessary files when the download gets started.
+ */
+ void start();
+
+ /**
+ * Closes files when the download gets stopped.
+ */
+ void stop();
+
+ /**
+ * Get's the i'th Chunk.
+ * @param i The Chunk's index
+ * @return The Chunk, or 0 when i is out of bounds
+ */
+ Chunk* getChunk(unsigned int i);
+
+ /**
+ * Get's the i'th Chunk. Makes sure that the Chunk's data
+ * is in memory. If the Chunk hasn't been downloaded yet 0
+ * is returned. Whenever the Chunk needs to be uploaded, call
+ * this function. This changes the status to MMAPPED or BUFFERED.
+ * @param i The Chunk's index
+ * @return The Chunk, or 0 when i is out of bounds
+ */
+ Chunk* grabChunk(unsigned int i);
+
+ /**
+ * Prepare a chunk for downloading
+ * @param c The Chunk
+ * @param allways Always do this, even if the chunk is not NOT_DOWNLOADED
+ * @return true if ok, false if the chunk is not NOT_DOWNLOADED
+ */
+ bool prepareChunk(Chunk* c,bool allways = false);
+
+ /**
+ * The upload is done, and the Chunk is no longer needed.
+ * The Chunk's data might be cleared, if we are using up to much
+ * memory.
+ * @param i The Chunk's index
+ */
+ void releaseChunk(unsigned int i);
+
+ /**
+ * Reset a chunk as if it were never downloaded.
+ * @param i The chunk
+ */
+ void resetChunk(unsigned int i);
+
+ /**
+ * Save the i'th Chunk to the cache_file.
+ * Also changes the Chunk's status to ON_DISK.
+ * The Chunk's data is immediately cleared.
+ * @param i The Chunk's index
+ * @param update_index Update the index or not
+ */
+ void saveChunk(unsigned int i,bool update_index = true);
+
+ /**
+ * Calculates the number of bytes left for the tracker. Does include
+ * excluded chunks (this should be used for the tracker).
+ * @return The number of bytes to download + the number of bytes excluded
+ */
+ Uint64 bytesLeft() const;
+
+ /**
+ * Calculates the number of bytes left to download.
+ */
+ Uint64 bytesLeftToDownload() const;
+
+ /**
+ * Calculates the number of bytes which have been excluded.
+ * @return The number of bytes excluded
+ */
+ Uint64 bytesExcluded() const;
+
+ /**
+ * Calculates the number of chunks left to download.
+ * Does not include excluded chunks.
+ * @return The number of chunks to download
+ */
+ Uint32 chunksLeft() const;
+
+ /**
+ * Check if we have all chunks, this is not the same as
+ * chunksLeft() == 0, it does not look at excluded chunks.
+ * @return true if all chunks have been downloaded
+ */
+ bool haveAllChunks() const;
+
+ /**
+ * Get the number of chunks which have been excluded.
+ * @return The number of excluded chunks
+ */
+ Uint32 chunksExcluded() const;
+
+ /**
+ * Get the number of downloaded chunks
+ * @return
+ */
+ Uint32 chunksDownloaded() const;
+
+ /**
+ * Get the number of only seed chunks.
+ */
+ Uint32 onlySeedChunks() const;
+
+ /**
+ * Get a BitSet of the status of all Chunks
+ */
+ const BitSet & getBitSet() const {return bitset;}
+
+ /**
+ * Get the excluded bitset
+ */
+ const BitSet & getExcludedBitSet() const {return excluded_chunks;}
+
+ /**
+ * Get the only seed bitset.
+ */
+ const BitSet & getOnlySeedBitSet() const {return only_seed_chunks;}
+
+ /// Get the number of chunks into the file.
+ Uint32 getNumChunks() const {return chunks.count();}
+
+ /// Print memory usage to log file
+ void debugPrintMemUsage();
+
+ /**
+ * Make sure that a range will get priority over other chunks.
+ * @param from First chunk in range
+ * @param to Last chunk in range
+ */
+ void prioritise(Uint32 from,Uint32 to, Priority priority);
+
+ /**
+ * Make sure that a range will not be downloaded.
+ * @param from First chunk in range
+ * @param to Last chunk in range
+ */
+ void exclude(Uint32 from,Uint32 to);
+
+ /**
+ * Make sure that a range will be downloaded.
+ * Does the opposite of exclude.
+ * @param from First chunk in range
+ * @param to Last chunk in range
+ */
+ void include(Uint32 from,Uint32 to);
+
+
+ /**
+ * Data has been checked, and these chunks are OK.
+ * The ChunkManager will update it's internal structures
+ * @param ok_chunks The ok_chunks
+ */
+ void dataChecked(const BitSet & ok_chunks);
+
+ /// Test if the torrent has existing files, only works the first time a torrent is loaded
+ bool hasExistingFiles() const;
+
+ /// Recreates missing files
+ void recreateMissingFiles();
+
+ /// Set missing files as do not download
+ void dndMissingFiles();
+
+ /// Delete all data files
+ void deleteDataFiles();
+
+ /// Are all not deselected chunks downloaded.
+ bool completed() const;
+
+ /// Set the maximum chunk size for a data check, 0 means alllways check
+ static void setMaxChunkSizeForDataCheck(Uint32 mcs) {max_chunk_size_for_data_check = mcs;}
+
+ /// Get the current disk usage of all the files in this torrent
+ Uint64 diskUsage();
+ signals:
+ /**
+ * Emitted when a range of chunks has been excluded
+ * @param from First chunk in range
+ * @param to Last chunk in range
+ */
+ void excluded(Uint32 from,Uint32 to);
+
+ /**
+ * Emitted when a range of chunks has been included back.
+ * @param from First chunk in range
+ * @param to Last chunk in range
+ */
+ void included(Uint32 from,Uint32 to);
+
+ /**
+ * Emitted when chunks get excluded or included, so
+ * that the statistics can be updated.
+ */
+ void updateStats();
+
+ /**
+ * A corrupted chunk has been found during uploading.
+ * @param chunk The chunk
+ */
+ void corrupted(Uint32 chunk);
+
+ private:
+ void saveIndexFile();
+ void writeIndexFileEntry(Chunk* c);
+ void saveFileInfo();
+ void loadFileInfo();
+ void savePriorityInfo();
+ void loadPriorityInfo();
+
+ private slots:
+ void downloadStatusChanged(TorrentFile* tf,bool download);
+ void downloadPriorityChanged(TorrentFile* tf,Priority newpriority,Priority oldpriority);
+
+ static Uint32 max_chunk_size_for_data_check;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/chunkselector.cpp b/libktorrent/torrent/chunkselector.cpp
new file mode 100644
index 0000000..b1c42fa
--- /dev/null
+++ b/libktorrent/torrent/chunkselector.cpp
@@ -0,0 +1,185 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <vector>
+#include <algorithm>
+#include <util/log.h>
+#include <util/bitset.h>
+#include "chunkcounter.h"
+#include "chunkselector.h"
+#include "chunkmanager.h"
+#include "downloader.h"
+#include "peerdownloader.h"
+#include "globals.h"
+#include "peer.h"
+#include "peermanager.h"
+
+namespace bt
+{
+ struct RareCmp
+ {
+ ChunkManager & cman;
+ ChunkCounter & cc;
+ bool warmup;
+
+ RareCmp(ChunkManager & cman,ChunkCounter & cc,bool warmup) : cman(cman),cc(cc),warmup(warmup) {}
+
+ bool operator()(Uint32 a,Uint32 b)
+ {
+ // do some sanity checks
+ if (a >= cman.getNumChunks() || b >= cman.getNumChunks())
+ return false;
+
+ // the sorting is done on two criteria, priority and rareness
+ Priority pa = cman.getChunk(a)->getPriority();
+ Priority pb = cman.getChunk(b)->getPriority();
+ if (pa == pb)
+ return normalCmp(a,b); // if both have same priority compare on rareness
+ else if (pa > pb) // pa has priority over pb, so select pa
+ return true;
+ else // pb has priority over pa, so select pb
+ return false;
+ }
+
+ bool normalCmp(Uint32 a,Uint32 b)
+ {
+ // during warmup mode choose most common chunks
+ if (!warmup)
+ return cc.get(a) < cc.get(b);
+ else
+ return cc.get(a) > cc.get(b);
+ }
+ };
+
+ ChunkSelector::ChunkSelector(ChunkManager & cman,Downloader & downer,PeerManager & pman)
+ : cman(cman),downer(downer),pman(pman)
+ {
+ std::vector<Uint32> tmp;
+ for (Uint32 i = 0;i < cman.getNumChunks();i++)
+ {
+ if (!cman.getBitSet().get(i))
+ {
+ tmp.push_back(i);
+ }
+ }
+ std::random_shuffle(tmp.begin(),tmp.end());
+ // std::list does not support random_shuffle so we use a vector as a temporary storage
+ // for the random_shuffle
+ chunks.insert(chunks.begin(),tmp.begin(),tmp.end());
+ sort_timer.update();
+ }
+
+
+ ChunkSelector::~ChunkSelector()
+ {}
+
+
+ bool ChunkSelector::select(PeerDownloader* pd,Uint32 & chunk)
+ {
+ const BitSet & bs = cman.getBitSet();
+
+
+ // sort the chunks every 2 seconds
+ if (sort_timer.getElapsedSinceUpdate() > 2000)
+ {
+ bool warmup = cman.getNumChunks() - cman.chunksLeft() <= 4;
+// dataChecked(bs);
+ chunks.sort(RareCmp(cman,pman.getChunkCounter(),warmup));
+ sort_timer.update();
+ }
+
+ std::list<Uint32>::iterator itr = chunks.begin();
+ while (itr != chunks.end())
+ {
+ Uint32 i = *itr;
+ Chunk* c = cman.getChunk(*itr);
+
+ // if we have the chunk remove it from the list
+ if (bs.get(i))
+ {
+ std::list<Uint32>::iterator tmp = itr;
+ itr++;
+ chunks.erase(tmp);
+ }
+ else
+ {
+ // pd has to have the selected chunk and it needs to be not excluded
+ if (pd->hasChunk(i) && !downer.areWeDownloading(i) &&
+ !c->isExcluded() && !c->isExcludedForDownloading())
+ {
+ // we have a chunk
+ chunk = i;
+ return true;
+ }
+ itr++;
+ }
+ }
+
+ return false;
+ }
+
+ void ChunkSelector::dataChecked(const BitSet & ok_chunks)
+ {
+ for (Uint32 i = 0;i < ok_chunks.getNumBits();i++)
+ {
+ bool in_chunks = std::find(chunks.begin(),chunks.end(),i) != chunks.end();
+ if (in_chunks && ok_chunks.get(i))
+ {
+ // if we have the chunk, remove it from the chunks list
+ chunks.remove(i);
+ }
+ else if (!in_chunks && !ok_chunks.get(i))
+ {
+ // if we don't have the chunk, add it to the list if it wasn't allrready in there
+ chunks.push_back(i);
+ }
+ }
+ }
+
+ void ChunkSelector::reincluded(Uint32 from, Uint32 to)
+ {
+ // lets do a safety check first
+ if (from >= cman.getNumChunks() || to >= cman.getNumChunks())
+ {
+ Out(SYS_DIO|LOG_NOTICE) << "Internal error in chunkselector" << endl;
+ return;
+ }
+
+ for (Uint32 i = from;i <= to;i++)
+ {
+ bool in_chunks = std::find(chunks.begin(),chunks.end(),i) != chunks.end();
+ if (!in_chunks && cman.getChunk(i)->getStatus() != Chunk::ON_DISK)
+ {
+ // Out(SYS_DIO|LOG_DEBUG) << "ChunkSelector::reIncluded " << i << endl;
+ chunks.push_back(i);
+ }
+ }
+ }
+
+ void ChunkSelector::reinsert(Uint32 chunk)
+ {
+ bool in_chunks = std::find(chunks.begin(),chunks.end(),chunk) != chunks.end();
+ if (!in_chunks)
+ chunks.push_back(chunk);
+ }
+
+
+}
+
diff --git a/libktorrent/torrent/chunkselector.h b/libktorrent/torrent/chunkselector.h
new file mode 100644
index 0000000..3ba2f8a
--- /dev/null
+++ b/libktorrent/torrent/chunkselector.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCHUNKSELECTOR_H
+#define BTCHUNKSELECTOR_H
+
+#include <list>
+#include <util/timer.h>
+
+namespace bt
+{
+ class BitSet;
+ class PeerDownloader;
+ class ChunkManager;
+ class Downloader;
+ class PeerManager;
+ /**
+ * @author Joris Guisson
+ *
+ * Selects which Chunks to download.
+ */
+ class ChunkSelector
+ {
+ ChunkManager & cman;
+ Downloader & downer;
+ PeerManager & pman;
+ std::list<Uint32> chunks;
+ Timer sort_timer;
+ public:
+ ChunkSelector(ChunkManager & cman,Downloader & downer,PeerManager &pman);
+ virtual ~ChunkSelector();
+
+ /**
+ * Select which chunk to download for a PeerDownloader.
+ * @param pd The PeerDownloader
+ * @param chunk Index of chunk gets stored here
+ * @return true upon succes, false otherwise
+ */
+ bool select(PeerDownloader* pd,Uint32 & chunk);
+
+ /**
+ * Data has been checked, and these chunks are OK.
+ * @param ok_chunks The ok_chunks
+ */
+ void dataChecked(const BitSet & ok_chunks);
+
+ /**
+ * A range of chunks has been reincluded.
+ * @param from The first chunk
+ * @param to The last chunk
+ */
+ void reincluded(Uint32 from, Uint32 to);
+
+ /**
+ * Reinsert a chunk.
+ * @param chunk The chunk
+ */
+ void reinsert(Uint32 chunk);
+ };
+
+}
+
+#endif
+
diff --git a/libktorrent/torrent/dndfile.cpp b/libktorrent/torrent/dndfile.cpp
new file mode 100644
index 0000000..deace69
--- /dev/null
+++ b/libktorrent/torrent/dndfile.cpp
@@ -0,0 +1,268 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <util/file.h>
+#include <util/error.h>
+#include <util/fileops.h>
+#include <util/sha1hash.h>
+#include "dndfile.h"
+
+namespace bt
+{
+ const Uint32 DND_FILE_HDR_MAGIC = 0xD1234567;
+
+ struct DNDFileHeader
+ {
+ Uint32 magic;
+ Uint32 first_size;
+ Uint32 last_size;
+ Uint8 data_sha1[20];
+ };
+
+ DNDFile::DNDFile(const QString & path) : path(path)
+ {}
+
+
+ DNDFile::~DNDFile()
+ {}
+
+ void DNDFile::changePath(const QString & npath)
+ {
+ path = npath;
+ }
+
+ void DNDFile::checkIntegrity()
+ {
+ File fptr;
+ if (!fptr.open(path,"rb"))
+ {
+ create();
+ return;
+ }
+
+ DNDFileHeader hdr;
+ if (fptr.read(&hdr,sizeof(DNDFileHeader)) != sizeof(DNDFileHeader))
+ {
+ create();
+ return;
+ }
+
+ if (hdr.magic != DND_FILE_HDR_MAGIC && bt::FileSize(path) != sizeof(DNDFileHeader) + hdr.first_size + hdr.last_size)
+ {
+ create();
+ return;
+ }
+
+#if 0
+ if (hdr.first_size > 0 || hdr.last_size > 0)
+ {
+ // check hash
+ Uint32 data_size = hdr.first_size + hdr.last_size;
+ Uint8* buf = new Uint8[data_size];
+ if (fptr.read(buf,data_size) != data_size)
+ {
+ delete [] buf;
+ create();
+ return;
+ }
+
+ if (SHA1Hash::generate(buf,data_size) != SHA1Hash(hdr.data_sha1))
+ {
+ delete [] buf;
+ create();
+ return;
+ }
+
+ delete [] buf;
+ }
+#endif
+ }
+
+ void DNDFile::create()
+ {
+ DNDFileHeader hdr;
+ hdr.magic = DND_FILE_HDR_MAGIC;
+ hdr.first_size = 0;
+ hdr.last_size = 0;
+ memset(hdr.data_sha1,0,20);
+
+ File fptr;
+ if (!fptr.open(path,"wb"))
+ throw Error(i18n("Cannot create file %1 : %2").arg(path).arg(fptr.errorString()));
+
+ fptr.write(&hdr,sizeof(DNDFileHeader));
+ fptr.close();
+ }
+
+
+
+ Uint32 DNDFile::readFirstChunk(Uint8* buf,Uint32 off,Uint32 buf_size)
+ {
+ File fptr;
+ if (!fptr.open(path,"rb"))
+ {
+ create();
+ return 0;
+ }
+
+ DNDFileHeader hdr;
+ if (fptr.read(&hdr,sizeof(DNDFileHeader)) != sizeof(DNDFileHeader))
+ {
+ create();
+ return 0;
+ }
+
+ if (hdr.first_size == 0)
+ return 0;
+
+ if (hdr.first_size + off > buf_size)
+ return 0;
+
+ return fptr.read(buf + off,hdr.first_size);
+ }
+
+ Uint32 DNDFile::readLastChunk(Uint8* buf,Uint32 off,Uint32 buf_size)
+ {
+ File fptr;
+ if (!fptr.open(path,"rb"))
+ {
+ create();
+ return 0;
+ }
+
+ DNDFileHeader hdr;
+ if (fptr.read(&hdr,sizeof(DNDFileHeader)) != sizeof(DNDFileHeader))
+ {
+ create();
+ return 0;
+ }
+
+ if (hdr.last_size == 0)
+ return 0;
+
+ if (hdr.last_size + off > buf_size)
+ return 0;
+
+ fptr.seek(File::BEGIN,sizeof(DNDFileHeader) + hdr.first_size);
+ return fptr.read(buf + off,hdr.last_size);
+ }
+
+ void DNDFile::writeFirstChunk(const Uint8* buf,Uint32 fc_size)
+ {
+ File fptr;
+ if (!fptr.open(path,"r+b"))
+ {
+ create();
+ if (!fptr.open(path,"r+b"))
+ {
+ throw Error(i18n("Failed to write first chunk to DND file : %1").arg(fptr.errorString()));
+ }
+ }
+
+ DNDFileHeader hdr;
+ fptr.read(&hdr,sizeof(DNDFileHeader));
+ if (hdr.last_size == 0)
+ {
+ hdr.first_size = fc_size;
+ fptr.seek(File::BEGIN,0);
+ // update hash first
+ // SHA1Hash h = SHA1Hash::generate(buf,fc_size);
+ // memcpy(hdr.data_sha1,h.getData(),20);
+ // write header
+ fptr.write(&hdr,sizeof(DNDFileHeader));
+ // write data
+ fptr.write(buf,fc_size);
+ }
+ else
+ {
+ hdr.first_size = fc_size;
+ Uint8* tmp = new Uint8[hdr.first_size + hdr.last_size];
+ try
+ {
+
+ // put everything in tmp buf
+ memcpy(tmp,buf,hdr.first_size);
+ fptr.seek(File::BEGIN,sizeof(DNDFileHeader) + hdr.first_size);
+ fptr.read(tmp + hdr.first_size,hdr.last_size);
+
+ // update the hash of the header
+ // SHA1Hash h = SHA1Hash::generate(tmp,hdr.first_size + hdr.last_size);
+ // memcpy(hdr.data_sha1,h.getData(),20);
+
+ // write header + data
+ fptr.seek(File::BEGIN,0);
+ fptr.write(&hdr,sizeof(DNDFileHeader));
+ fptr.write(tmp,hdr.first_size + hdr.last_size);
+ delete [] tmp;
+
+ }
+ catch (...)
+ {
+ delete [] tmp;
+ throw;
+ }
+ }
+ }
+
+
+ void DNDFile::writeLastChunk(const Uint8* buf,Uint32 lc_size)
+ {
+ File fptr;
+ if (!fptr.open(path,"r+b"))
+ {
+ create();
+ if (!fptr.open(path,"r+b"))
+ {
+ throw Error(i18n("Failed to write last chunk to DND file : %1").arg(fptr.errorString()));
+ }
+ }
+
+ DNDFileHeader hdr;
+ fptr.read(&hdr,sizeof(DNDFileHeader));
+ hdr.last_size = lc_size;
+ Uint8* tmp = new Uint8[hdr.first_size + hdr.last_size];
+ try
+ {
+ // put everything in tmp buf
+ memcpy(tmp + hdr.first_size,buf,lc_size);
+ if (hdr.first_size > 0)
+ {
+ fptr.seek(File::BEGIN,sizeof(DNDFileHeader));
+ fptr.read(tmp,hdr.first_size);
+ }
+
+ // update the hash of the header
+ // SHA1Hash h = SHA1Hash::generate(tmp,hdr.first_size + hdr.last_size);
+ // memcpy(hdr.data_sha1,h.getData(),20);
+
+ // write header + data
+ fptr.seek(File::BEGIN,0);
+ fptr.write(&hdr,sizeof(DNDFileHeader));
+ fptr.write(tmp,hdr.first_size + hdr.last_size);
+ delete [] tmp;
+ }
+ catch (...)
+ {
+ delete [] tmp;
+ throw;
+ }
+ }
+
+}
diff --git a/libktorrent/torrent/dndfile.h b/libktorrent/torrent/dndfile.h
new file mode 100644
index 0000000..a7a7e7b
--- /dev/null
+++ b/libktorrent/torrent/dndfile.h
@@ -0,0 +1,89 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTDNDFILE_H
+#define BTDNDFILE_H
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace bt
+{
+
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Special file where we keep the first and last chunk of a file which is marked as do not download.
+ * THe first and last chunk of a file will most certainly be partial chunks.
+ */
+ class DNDFile
+ {
+ public:
+ DNDFile(const QString & path);
+ virtual ~DNDFile();
+
+ /// Change the path of the file
+ void changePath(const QString & npath);
+
+ /**
+ * CHeck integrity of the file, create it if it doesn't exist.
+ */
+ void checkIntegrity();
+
+ /**
+ * Read the (partial)first chunk into a buffer.
+ * @param buf The buffer
+ * @param off OFfset into the buffer
+ * @param buf_size Size of the buffer
+ */
+ Uint32 readFirstChunk(Uint8* buf,Uint32 off,Uint32 buf_size);
+
+ /**
+ * Read the (partial)last chunk into a buffer.
+ * @param buf The buffer
+ * @param off OFfset into the buffer
+ * @param buf_size Size of the buffer
+ */
+ Uint32 readLastChunk(Uint8* buf,Uint32 off,Uint32 buf_size);
+
+ /**
+ * Write the partial first chunk.
+ * @param buf The buffer
+ * @param fc_size Size to write
+ */
+ void writeFirstChunk(const Uint8* buf,Uint32 fc_size);
+
+ /**
+ * Write the partial last chunk.
+ * @param buf The buffer
+ * @param lc_size Size to write
+ */
+ void writeLastChunk(const Uint8* buf,Uint32 lc_size);
+
+ private:
+ void create();
+
+ private:
+ QString path;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/downloadcap.cpp b/libktorrent/torrent/downloadcap.cpp
new file mode 100644
index 0000000..73e0cbb
--- /dev/null
+++ b/libktorrent/torrent/downloadcap.cpp
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#if 0
+#include <math.h>
+#include <util/log.h>
+#include "downloadcap.h"
+#include "globals.h"
+
+namespace bt
+{
+ DownloadCap DownloadCap::self;
+
+ const Uint32 SLOT_SIZE = 5*1024;
+
+ DownloadCap::DownloadCap() : Cap(true)
+ {
+ }
+
+ DownloadCap::~ DownloadCap()
+ {
+ }
+
+
+
+}
+#endif
diff --git a/libktorrent/torrent/downloadcap.h b/libktorrent/torrent/downloadcap.h
new file mode 100644
index 0000000..2bda73c
--- /dev/null
+++ b/libktorrent/torrent/downloadcap.h
@@ -0,0 +1,48 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTDOWNLOADCAP_H
+#define BTDOWNLOADCAP_H
+
+#if 0
+#include <qvaluelist.h>
+#include <util/timer.h>
+#include "globals.h"
+#include "cap.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ */
+ class DownloadCap : public Cap
+ {
+ static DownloadCap self;
+
+ DownloadCap();
+ public:
+ ~DownloadCap();
+
+ static DownloadCap & instance() {return self;}
+ };
+
+}
+#endif
+#endif
diff --git a/libktorrent/torrent/downloader.cpp b/libktorrent/torrent/downloader.cpp
new file mode 100644
index 0000000..b8acdc7
--- /dev/null
+++ b/libktorrent/torrent/downloader.cpp
@@ -0,0 +1,688 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/file.h>
+#include <util/log.h>
+#include "downloader.h"
+#include "chunkmanager.h"
+#include "torrent.h"
+#include "peermanager.h"
+#include <util/error.h>
+#include "chunkdownload.h"
+#include <util/sha1hash.h>
+#include <util/array.h>
+#include "peer.h"
+#include "piece.h"
+#include "peerdownloader.h"
+#include <interfaces/functions.h>
+#include <interfaces/monitorinterface.h>
+#include "packetwriter.h"
+#include "chunkselector.h"
+#include "ipblocklist.h"
+#include "ktversion.h"
+
+namespace bt
+{
+
+
+
+ Downloader::Downloader(Torrent & tor,PeerManager & pman,ChunkManager & cman)
+ : tor(tor),pman(pman),cman(cman),downloaded(0),tmon(0)
+ {
+ chunk_selector = new ChunkSelector(cman,*this,pman);
+ Uint64 total = tor.getFileLength();
+ downloaded = (total - cman.bytesLeft());
+ curr_chunks_downloaded = 0;
+ unnecessary_data = 0;
+
+ current_chunks.setAutoDelete(true);
+ connect(&pman,SIGNAL(newPeer(Peer* )),this,SLOT(onNewPeer(Peer* )));
+ connect(&pman,SIGNAL(peerKilled(Peer* )),this,SLOT(onPeerKilled(Peer*)));
+ }
+
+
+ Downloader::~Downloader()
+ {
+ delete chunk_selector;
+ }
+
+ void Downloader::pieceRecieved(const Piece & p)
+ {
+ if (cman.completed())
+ return;
+
+ ChunkDownload* cd = 0;
+
+ for (CurChunkItr j = current_chunks.begin();j != current_chunks.end();++j)
+ {
+ if (p.getIndex() != j->first)
+ continue;
+
+ cd = j->second;
+ break;
+ }
+
+ if (!cd)
+ {
+ unnecessary_data += p.getLength();
+ Out(SYS_DIO|LOG_DEBUG) <<
+ "Unnecessary piece, total unnecessary data : " << kt::BytesToString(unnecessary_data) << endl;
+ return;
+ }
+
+ // if the chunk is not in memory, reload it
+ if (cd->getChunk()->getStatus() == Chunk::ON_DISK)
+ {
+ cman.prepareChunk(cd->getChunk(),true);
+ }
+
+ bool ok = false;
+
+ if (cd->piece(p,ok))
+ {
+ if (tmon)
+ tmon->downloadRemoved(cd);
+
+ if (ok)
+ downloaded += p.getLength();
+
+ if (!finished(cd))
+ {
+ // if the chunk fails don't count the bytes downloaded
+ if (cd->getChunk()->getSize() > downloaded)
+ downloaded = 0;
+ else
+ downloaded -= cd->getChunk()->getSize();
+ }
+ current_chunks.erase(p.getIndex());
+ update(); // run an update to assign new pieces
+ }
+ else
+ {
+ if (ok)
+ downloaded += p.getLength();
+
+ // save to disk again, if it is idle
+ if (cd->isIdle() && cd->getChunk()->getStatus() == Chunk::MMAPPED)
+ {
+ cman.saveChunk(cd->getChunk()->getIndex(),false);
+ }
+ }
+
+ if (!ok)
+ {
+ unnecessary_data += p.getLength();
+ Out(SYS_DIO|LOG_DEBUG) <<
+ "Unnecessary piece, total unnecessary data : " << kt::BytesToString(unnecessary_data) << endl;
+ }
+ }
+
+ void Downloader::update()
+ {
+ if (cman.completed())
+ return;
+
+ /*
+ Normal update should now handle all modes properly.
+ */
+ normalUpdate();
+
+ // now see if there aren't any timed out pieces
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();i++)
+ {
+ Peer* p = pman.getPeer(i);
+ p->getPeerDownloader()->checkTimeouts();
+ }
+ }
+
+
+ void Downloader::normalUpdate()
+ {
+ for (CurChunkItr j = current_chunks.begin();j != current_chunks.end();++j)
+ {
+ ChunkDownload* cd = j->second;
+ if (cd->isIdle()) // idle chunks do not need to be in memory
+ {
+ Chunk* c = cd->getChunk();
+ if (c->getStatus() == Chunk::MMAPPED)
+ {
+ cman.saveChunk(cd->getChunk()->getIndex(),false);
+ }
+ }
+ else if (cd->isChoked())
+ {
+ cd->releaseAllPDs();
+ Chunk* c = cd->getChunk();
+ if (c->getStatus() == Chunk::MMAPPED)
+ {
+ cman.saveChunk(cd->getChunk()->getIndex(),false);
+ }
+ }
+ else if (cd->needsToBeUpdated())
+ {
+ cd->update();
+ }
+ }
+
+ for (Uint32 i = 0; i < pman.getNumConnectedPeers();++i)
+ {
+ PeerDownloader* pd = pman.getPeer(i)->getPeerDownloader();
+
+ if (pd->isNull())
+ continue;
+
+ bool ok =
+ (pd->getNumGrabbed() < pd->getMaxChunkDownloads() ||
+ pd->isNearlyDone()) &&
+ pd->canAddRequest();
+
+
+ if (ok)
+ {
+ if (!pd->isChoked())
+ downloadFrom(pd);
+
+ pd->setNearlyDone(false);
+ }
+ }
+ }
+
+ Uint32 Downloader::maxMemoryUsage()
+ {
+ Uint32 max = 1024 * 1024;
+ switch (mem_usage)
+ {
+ case 1: // Medium
+ max *= 60; // 60 MB
+ break;
+ case 2: // High
+ max *= 80; // 90 MB
+ break;
+ case 0: // LOW
+ default:
+ max *= 40; // 30 MB
+ break;
+ }
+ return max;
+ }
+
+ Uint32 Downloader::numNonIdle()
+ {
+ Uint32 num_non_idle = 0;
+ for (CurChunkItr j = current_chunks.begin();j != current_chunks.end();++j)
+ {
+ ChunkDownload* cd = j->second;
+ if (!cd->isIdle())
+ num_non_idle++;
+ }
+ return num_non_idle;
+ }
+
+ ChunkDownload* Downloader::selectCD(PeerDownloader* pd,Uint32 num)
+ {
+ ChunkDownload* sel = 0;
+ Uint32 sel_left = 0xFFFFFFFF;
+
+ for (CurChunkItr j = current_chunks.begin();j != current_chunks.end();++j)
+ {
+ ChunkDownload* cd = j->second;
+ if (pd->isChoked() || !pd->hasChunk(cd->getChunk()->getIndex()))
+ continue;
+
+ if (cd->getNumDownloaders() == num)
+ {
+ // lets favor the ones which are nearly finished
+ if (!sel || cd->getTotalPieces() - cd->getPiecesDownloaded() < sel_left)
+ {
+ sel = cd;
+ sel_left = sel->getTotalPieces() - sel->getPiecesDownloaded();
+ }
+ }
+ }
+ return sel;
+ }
+
+ bool Downloader::findDownloadForPD(PeerDownloader* pd,bool warmup)
+ {
+ ChunkDownload* sel = 0;
+
+ // first see if there are ChunkDownload's which need a PeerDownloader
+ sel = selectCD(pd,0);
+
+ if (!sel && warmup)
+ {
+ // if we couldn't find one, try to select another
+ // which only has one downloader
+ // so that during warmup, there are at the most 2 downloaders
+ // assigned to one peer
+ sel = selectCD(pd,1);
+ }
+
+ if (sel)
+ {
+ // if it is on disk, reload it
+ if (sel->getChunk()->getStatus() == Chunk::ON_DISK)
+ cman.prepareChunk(sel->getChunk(),true);
+
+ sel->assignPeer(pd);
+ return true;
+ }
+
+ return false;
+ }
+
+ ChunkDownload* Downloader::selectWorst(PeerDownloader* pd)
+ {
+ ChunkDownload* cdmin = NULL;
+ for (CurChunkItr j = current_chunks.begin();j != current_chunks.end();++j)
+ {
+ ChunkDownload* cd = j->second;
+ if (!pd->hasChunk(cd->getChunk()->getIndex()) || cd->containsPeer(pd))
+ continue;
+
+ if (!cdmin)
+ cdmin = cd;
+ else if (cd->getDownloadSpeed() < cdmin->getDownloadSpeed())
+ cdmin = cd;
+ else if (cd->getNumDownloaders() < cdmin->getNumDownloaders())
+ cdmin = cd;
+ }
+
+ return cdmin;
+ }
+
+ void Downloader::downloadFrom(PeerDownloader* pd)
+ {
+ // calculate the max memory usage
+ Uint32 max = maxMemoryUsage();
+ // calculate number of non idle chunks
+ Uint32 num_non_idle = numNonIdle();
+
+ // first see if we can use an existing dowload
+ if (findDownloadForPD(pd,cman.getNumChunks() - cman.chunksLeft() <= 4))
+ return;
+
+ bool limit_exceeded = num_non_idle * tor.getChunkSize() >= max;
+
+ Uint32 chunk = 0;
+ if (!limit_exceeded && chunk_selector->select(pd,chunk))
+ {
+ Chunk* c = cman.getChunk(chunk);
+ if (cman.prepareChunk(c))
+ {
+ ChunkDownload* cd = new ChunkDownload(c);
+ current_chunks.insert(chunk,cd);
+ cd->assignPeer(pd);
+ if (tmon)
+ tmon->downloadStarted(cd);
+ }
+ }
+ else if (pd->getNumGrabbed() == 0)
+ {
+ // If the peer hasn't got a chunk we want,
+ ChunkDownload *cdmin = selectWorst(pd);
+
+ if (cdmin)
+ {
+ // if it is on disk, reload it
+ if (cdmin->getChunk()->getStatus() == Chunk::ON_DISK)
+ {
+ cman.prepareChunk(cdmin->getChunk(),true);
+ }
+
+ cdmin->assignPeer(pd);
+ }
+ }
+ }
+
+
+ bool Downloader::areWeDownloading(Uint32 chunk) const
+ {
+ return current_chunks.find(chunk) != 0;
+ }
+
+ void Downloader::onNewPeer(Peer* peer)
+ {
+ PeerDownloader* pd = peer->getPeerDownloader();
+ connect(pd,SIGNAL(downloaded(const Piece& )),
+ this,SLOT(pieceRecieved(const Piece& )));
+ }
+
+ void Downloader::onPeerKilled(Peer* peer)
+ {
+ PeerDownloader* pd = peer->getPeerDownloader();
+ if (pd)
+ {
+ for (CurChunkItr i = current_chunks.begin();i != current_chunks.end();++i)
+ {
+ ChunkDownload* cd = i->second;
+ cd->peerKilled(pd);
+ }
+ }
+ }
+
+ bool Downloader::finished(ChunkDownload* cd)
+ {
+ Chunk* c = cd->getChunk();
+ // verify the data
+ SHA1Hash h;
+ if (cd->usingContinuousHashing())
+ h = cd->getHash();
+ else
+ h = SHA1Hash::generate(c->getData(),c->getSize());
+
+ if (tor.verifyHash(h,c->getIndex()))
+ {
+ // hash ok so save it
+ try
+ {
+ cman.saveChunk(c->getIndex());
+ Out(SYS_GEN|LOG_NOTICE) << "Chunk " << c->getIndex() << " downloaded " << endl;
+ // tell everybody we have the Chunk
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();i++)
+ {
+ pman.getPeer(i)->getPacketWriter().sendHave(c->getIndex());
+ }
+ }
+ catch (Error & e)
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Error " << e.toString() << endl;
+ emit ioError(e.toString());
+ return false;
+ }
+ }
+ else
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Hash verification error on chunk " << c->getIndex() << endl;
+ Out(SYS_GEN|LOG_IMPORTANT) << "Is : " << h << endl;
+ Out(SYS_GEN|LOG_IMPORTANT) << "Should be : " << tor.getHash(c->getIndex()) << endl;
+
+ cman.resetChunk(c->getIndex());
+ chunk_selector->reinsert(c->getIndex());
+ Uint32 pid;
+ if (cd->getOnlyDownloader(pid))
+ {
+ Peer* p = pman.findPeer(pid);
+ if (!p)
+ return false;
+ QString IP(p->getIPAddresss());
+ Out(SYS_GEN|LOG_NOTICE) << "Peer " << IP << " sent bad data" << endl;
+ IPBlocklist & ipfilter = IPBlocklist::instance();
+ ipfilter.insert( IP );
+ p->kill();
+ }
+ return false;
+ }
+ return true;
+ }
+
+ void Downloader::clearDownloads()
+ {
+ for (CurChunkItr i = current_chunks.begin();i != current_chunks.end();++i)
+ {
+ Uint32 ch = i->first;
+ Chunk* c = i->second->getChunk();
+ if (c->getStatus() == Chunk::MMAPPED)
+ cman.saveChunk(ch,false);
+
+ c->setStatus(Chunk::NOT_DOWNLOADED);
+ }
+ current_chunks.clear();
+ }
+
+ Uint32 Downloader::downloadRate() const
+ {
+ // sum of the download rate of each peer
+ Uint32 rate = 0;
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();i++)
+ {
+ Peer* p = pman.getPeer(i);
+ rate += p->getDownloadRate();
+ }
+ return rate;
+ }
+
+ void Downloader::setMonitor(kt::MonitorInterface* tmo)
+ {
+ tmon = tmo;
+ if (!tmon)
+ return;
+
+ for (CurChunkItr i = current_chunks.begin();i != current_chunks.end();++i)
+ {
+ ChunkDownload* cd = i->second;
+ tmon->downloadStarted(cd);
+ }
+ }
+
+
+
+ void Downloader::saveDownloads(const QString & file)
+ {
+ File fptr;
+ if (!fptr.open(file,"wb"))
+ return;
+
+ // Save all the current downloads to a file
+ CurrentChunksHeader hdr;
+ hdr.magic = CURRENT_CHUNK_MAGIC;
+ hdr.major = kt::MAJOR;
+ hdr.minor = kt::MINOR;
+ hdr.num_chunks = current_chunks.count();
+ fptr.write(&hdr,sizeof(CurrentChunksHeader));
+
+// Out() << "sizeof(CurrentChunksHeader)" << sizeof(CurrentChunksHeader) << endl;
+ Out() << "Saving " << current_chunks.count() << " chunk downloads" << endl;
+ for (CurChunkItr i = current_chunks.begin();i != current_chunks.end();++i)
+ {
+ ChunkDownload* cd = i->second;
+ cd->save(fptr);
+ }
+ }
+
+ void Downloader::loadDownloads(const QString & file)
+ {
+ // don't load stuff if download is finished
+ if (cman.completed())
+ return;
+
+ // Load all partial downloads
+ File fptr;
+ if (!fptr.open(file,"rb"))
+ return;
+
+ // recalculate downloaded bytes
+ downloaded = (tor.getFileLength() - cman.bytesLeft());
+
+ CurrentChunksHeader chdr;
+ fptr.read(&chdr,sizeof(CurrentChunksHeader));
+ if (chdr.magic != CURRENT_CHUNK_MAGIC)
+ {
+ Out() << "Warning : current_chunks file corrupted" << endl;
+ return;
+ }
+
+ Out() << "Loading " << chdr.num_chunks << " active chunk downloads" << endl;
+ for (Uint32 i = 0;i < chdr.num_chunks;i++)
+ {
+ ChunkDownloadHeader hdr;
+ // first read header
+ fptr.read(&hdr,sizeof(ChunkDownloadHeader));
+ Out() << "Loading chunk " << hdr.index << endl;
+ if (hdr.index >= tor.getNumChunks())
+ {
+ Out() << "Warning : current_chunks file corrupted, invalid index " << hdr.index << endl;
+ return;
+ }
+
+ if (!cman.getChunk(hdr.index) || current_chunks.contains(hdr.index))
+ {
+ Out() << "Illegal chunk " << hdr.index << endl;
+ return;
+ }
+ Chunk* c = cman.getChunk(hdr.index);
+ if (!c->isExcluded() && cman.prepareChunk(c))
+ {
+ ChunkDownload* cd = new ChunkDownload(c);
+ bool ret = false;
+ try
+ {
+ ret = cd->load(fptr,hdr);
+ }
+ catch (...)
+ {
+ ret = false;
+ }
+
+ if (!ret)
+ {
+ delete cd;
+ }
+ else
+ {
+ current_chunks.insert(hdr.index,cd);
+ downloaded += cd->bytesDownloaded();
+
+ if (tmon)
+ tmon->downloadStarted(cd);
+ }
+ }
+ }
+
+ // reset curr_chunks_downloaded to 0
+ curr_chunks_downloaded = 0;
+ }
+
+ Uint32 Downloader::getDownloadedBytesOfCurrentChunksFile(const QString & file)
+ {
+ // Load all partial downloads
+ File fptr;
+ if (!fptr.open(file,"rb"))
+ return 0;
+
+ // read the number of chunks
+ CurrentChunksHeader chdr;
+ fptr.read(&chdr,sizeof(CurrentChunksHeader));
+ if (chdr.magic != CURRENT_CHUNK_MAGIC)
+ {
+ Out() << "Warning : current_chunks file corrupted" << endl;
+ return 0;
+ }
+ Uint32 num_bytes = 0;
+
+ // load all chunks and calculate how much is downloaded
+ for (Uint32 i = 0;i < chdr.num_chunks;i++)
+ {
+ // read the chunkdownload header
+ ChunkDownloadHeader hdr;
+ fptr.read(&hdr,sizeof(ChunkDownloadHeader));
+
+ Chunk* c = cman.getChunk(hdr.index);
+ if (!c)
+ return num_bytes;
+
+ Uint32 last_size = c->getSize() % MAX_PIECE_LEN;
+ if (last_size == 0)
+ last_size = MAX_PIECE_LEN;
+
+ // create the bitset and read it
+ BitSet bs(hdr.num_bits);
+ fptr.read(bs.getData(),bs.getNumBytes());
+
+ for (Uint32 j = 0;j < hdr.num_bits;j++)
+ {
+ if (bs.get(j))
+ num_bytes += j == hdr.num_bits - 1 ?
+ last_size : MAX_PIECE_LEN;
+ }
+
+ if (hdr.buffered)
+ fptr.seek(File::CURRENT,c->getSize());
+ }
+ curr_chunks_downloaded = num_bytes;
+ return num_bytes;
+ }
+
+ bool Downloader::isFinished() const
+ {
+ return cman.completed();
+ }
+
+ void Downloader::onExcluded(Uint32 from,Uint32 to)
+ {
+ for (Uint32 i = from;i <= to;i++)
+ {
+ ChunkDownload* cd = current_chunks.find(i);
+ // let only seed chunks finish
+ if (!cd || cman.getChunk(i)->getPriority() == ONLY_SEED_PRIORITY)
+ continue;
+
+ cd->cancelAll();
+ cd->releaseAllPDs();
+ if (tmon)
+ tmon->downloadRemoved(cd);
+ current_chunks.erase(i);
+ cman.resetChunk(i); // reset chunk it is not fully downloaded yet
+ }
+ }
+
+ void Downloader::onIncluded(Uint32 from,Uint32 to)
+ {
+ chunk_selector->reincluded(from,to);
+ }
+
+ void Downloader::corrupted(Uint32 chunk)
+ {
+ chunk_selector->reinsert(chunk);
+ }
+
+ Uint32 Downloader::mem_usage = 0;
+
+ void Downloader::setMemoryUsage(Uint32 m)
+ {
+ mem_usage = m;
+// PeerDownloader::setMemoryUsage(m);
+ }
+
+ void Downloader::dataChecked(const BitSet & ok_chunks)
+ {
+ for (Uint32 i = 0;i < ok_chunks.getNumBits();i++)
+ {
+ ChunkDownload* cd = current_chunks.find(i);
+ if (ok_chunks.get(i) && cd)
+ {
+ // we have a chunk and we are downloading it so kill it
+ cd->releaseAllPDs();
+ if (tmon)
+ tmon->downloadRemoved(cd);
+
+ current_chunks.erase(i);
+ }
+ }
+ chunk_selector->dataChecked(ok_chunks);
+ }
+
+ void Downloader::recalcDownloaded()
+ {
+ Uint64 total = tor.getFileLength();
+ downloaded = (total - cman.bytesLeft());
+ }
+}
+
+#include "downloader.moc"
diff --git a/libktorrent/torrent/downloader.h b/libktorrent/torrent/downloader.h
new file mode 100644
index 0000000..5b39eeb
--- /dev/null
+++ b/libktorrent/torrent/downloader.h
@@ -0,0 +1,221 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTDOWNLOADER_H
+#define BTDOWNLOADER_H
+
+#include <qobject.h>
+#include <util/ptrmap.h>
+#include "globals.h"
+
+namespace kt
+{
+ class MonitorInterface;
+}
+
+
+namespace bt
+{
+ class BitSet;
+ class Torrent;
+ class ChunkManager;
+ class PeerManager;
+ class Peer;
+ class Chunk;
+ class ChunkDownload;
+ class PeerDownloader;
+ class Piece;
+ class Request;
+ class ChunkSelector;
+
+ typedef PtrMap<Uint32,ChunkDownload>::iterator CurChunkItr;
+ typedef PtrMap<Uint32,ChunkDownload>::const_iterator CurChunkCItr;
+
+ #define CURRENT_CHUNK_MAGIC 0xABCDEF00
+
+ struct CurrentChunksHeader
+ {
+ Uint32 magic; // CURRENT_CHUNK_MAGIC
+ Uint32 major;
+ Uint32 minor;
+ Uint32 num_chunks;
+ };
+
+ /**
+ * @author Joris Guisson
+ * @brief Manages the downloading
+ *
+ * This class manages the downloading of the file. It should
+ * regurarly be updated.
+ */
+ class Downloader : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor.
+ * @param tor The Torrent
+ * @param pman The PeerManager
+ * @param cman The ChunkManager
+ */
+ Downloader(Torrent & tor,PeerManager & pman,ChunkManager & cman);
+ virtual ~Downloader();
+
+ /// Get the number of bytes we have downloaded
+ Uint64 bytesDownloaded() const {return downloaded + curr_chunks_downloaded;}
+
+ /// Get the current dowload rate
+ Uint32 downloadRate() const;
+
+ /// Get the number of chunks we are dowloading
+ Uint32 numActiveDownloads() const {return current_chunks.count();}
+
+ /// See if the download is finished.
+ bool isFinished() const;
+
+ /**
+ * Clear all downloads. Deletes all active downloads.
+ */
+ void clearDownloads();
+
+ CurChunkCItr beginDownloads() const {return current_chunks.begin();}
+ CurChunkCItr endDownloads() const {return current_chunks.end();}
+
+ /**
+ * See if we are downloading a Chunk
+ * @param chunk ID of Chunk
+ * @return true if we are, false if not
+ */
+ bool areWeDownloading(Uint32 chunk) const;
+
+ /**
+ * Save the current downloads.
+ * @param file The file to save to
+ */
+ void saveDownloads(const QString & file);
+
+ /**
+ * Load the current downloads.
+ * @param file The file to load from
+ */
+ void loadDownloads(const QString & file);
+
+ /**
+ * Get the number of bytes already downloaded in the current_chunks file.
+ * @param file The path of the current_chunks file
+ * @return The bytes already downloading
+ */
+ Uint32 getDownloadedBytesOfCurrentChunksFile(const QString & file);
+
+ /**
+ * A corrupted chunk has been detected, make sure we redownload it.
+ * @param chunk The chunk
+ */
+ void corrupted(Uint32 chunk);
+ public slots:
+ /**
+ * Update the downloader.
+ */
+ void update();
+
+ /**
+ * We got a new connection.
+ * @param peer The Peer
+ */
+ void onNewPeer(Peer* peer);
+
+ /**
+ * A Peer has disconnected.
+ * @param peer The Peer
+ */
+ void onPeerKilled(Peer* peer);
+
+ /**
+ * Set the TorrentMonitor.
+ * @param tmo
+ */
+ void setMonitor(kt::MonitorInterface* tmo);
+
+ static void setMemoryUsage(Uint32 m);
+
+ /**
+ * Data has been checked, and these chunks are OK.
+ * @param ok_chunks The ok_chunks
+ */
+ void dataChecked(const BitSet & ok_chunks);
+
+ /**
+ * Recalculate the number of bytes downloaded.
+ */
+ void recalcDownloaded();
+
+ private slots:
+ void pieceRecieved(const Piece & p);
+ bool finished(ChunkDownload* c);
+
+ /**
+ * Kill all ChunkDownload's which have been excluded.
+ * @param from First chunk of range
+ * @param to Last chunk of range
+ */
+ void onExcluded(Uint32 from,Uint32 to);
+
+ /**
+ * Make sure chunk selector is back OK, when chunks are included back again.
+ * @param from First chunk
+ * @param to Last chunk
+ */
+ void onIncluded(Uint32 from,Uint32 to);
+
+ signals:
+ /**
+ * An error occurred while we we're writing or reading from disk.
+ * @param msg Message
+ */
+ void ioError(const QString & msg);
+
+ private:
+ void downloadFrom(PeerDownloader* pd);
+ void normalUpdate();
+ Uint32 maxMemoryUsage();
+ Uint32 numNonIdle();
+ bool findDownloadForPD(PeerDownloader* pd,bool warmup);
+ ChunkDownload* selectCD(PeerDownloader* pd,Uint32 num);
+ ChunkDownload* selectWorst(PeerDownloader* pd);
+
+ private:
+ Torrent & tor;
+ PeerManager & pman;
+ ChunkManager & cman;
+ Uint64 downloaded;
+ Uint64 curr_chunks_downloaded;
+ Uint64 unnecessary_data;
+ PtrMap<Uint32,ChunkDownload> current_chunks;
+ ChunkSelector* chunk_selector;
+
+ kt::MonitorInterface* tmon;
+ static Uint32 mem_usage;
+ };
+
+
+
+}
+
+#endif
diff --git a/libktorrent/torrent/globals.cpp b/libktorrent/torrent/globals.cpp
new file mode 100644
index 0000000..0221c17
--- /dev/null
+++ b/libktorrent/torrent/globals.cpp
@@ -0,0 +1,97 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/error.h>
+#include <net/portlist.h>
+#include <kademlia/dht.h>
+
+#include "globals.h"
+#include "server.h"
+
+namespace bt
+{
+
+ Globals* Globals::inst = 0;
+
+ Globals::Globals()
+ {
+ plist = new net::PortList();
+ debug_mode = false;
+ log = new Log();
+ server = 0;
+ dh_table = new dht::DHT();
+ }
+
+ Globals::~ Globals()
+ {
+ delete server;
+ delete log;
+ delete dh_table;
+ delete plist;
+ }
+
+ Globals & Globals::instance()
+ {
+ if (!inst)
+ inst = new Globals();
+ return *inst;
+ }
+
+ void Globals::cleanup()
+ {
+ delete inst;
+ inst = 0;
+ }
+
+ void Globals::initLog(const QString & file)
+ {
+ log->setOutputFile(file);
+ log->setOutputToConsole(debug_mode);
+ }
+
+ void Globals::initServer(Uint16 port)
+ {
+ if (server)
+ {
+ delete server;
+ server = 0;
+ }
+
+ server = new Server(port);
+ }
+
+ void Globals::shutdownServer()
+ {
+ if (server)
+ {
+ server->close();
+ }
+ }
+
+ Log& Globals::getLog(unsigned int arg)
+ {
+ log->setFilter(arg);
+ return *log;
+ }
+
+
+}
+
diff --git a/libktorrent/torrent/globals.h b/libktorrent/torrent/globals.h
new file mode 100644
index 0000000..7cfe3f5
--- /dev/null
+++ b/libktorrent/torrent/globals.h
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTGLOBALS_H
+#define BTGLOBALS_H
+
+#include <util/constants.h>
+
+class QString;
+
+namespace net
+{
+ class PortList;
+}
+
+namespace dht
+{
+ class DHTBase;
+}
+
+namespace bt
+{
+ class Log;
+ class Server;
+
+
+
+ class Globals
+ {
+ public:
+ virtual ~Globals();
+
+ void initLog(const QString & file);
+ void initServer(Uint16 port);
+ void setDebugMode(bool on) {debug_mode = on;}
+ bool isDebugModeSet() const {return debug_mode;}
+ void shutdownServer();
+
+ Log & getLog(unsigned int arg);
+ Server & getServer() {return *server;}
+ dht::DHTBase & getDHT() {return *dh_table;}
+ net::PortList & getPortList() {return *plist;}
+
+ static Globals & instance();
+ static void cleanup();
+ private:
+ Globals();
+
+ bool debug_mode;
+ Log* log;
+ Server* server;
+ dht::DHTBase* dh_table;
+ net::PortList* plist;
+
+ friend Log& Out(unsigned int arg);
+
+ static Globals* inst;
+
+ };
+}
+
+#endif
diff --git a/libktorrent/torrent/httptracker.cpp b/libktorrent/torrent/httptracker.cpp
new file mode 100644
index 0000000..b220bc0
--- /dev/null
+++ b/libktorrent/torrent/httptracker.cpp
@@ -0,0 +1,462 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <config.h>
+
+#include <kurl.h>
+#include <klocale.h>
+#include <qhostaddress.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <util/error.h>
+#include <util/waitjob.h>
+#include <interfaces/exitoperation.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <kio/scheduler.h>
+#include "bnode.h"
+#include "httptracker.h"
+#include "torrentcontrol.h"
+#include "bdecoder.h"
+#include "peermanager.h"
+#include "server.h"
+#include "globals.h"
+#include "settings.h"
+
+
+using namespace kt;
+
+namespace bt
+{
+
+ HTTPTracker::HTTPTracker(const KURL & url,kt::TorrentInterface* tor,const PeerID & id,int tier)
+ : Tracker(url,tor,id,tier)
+ {
+ active_job = 0;
+
+ interval = 5 * 60; // default interval 5 minutes
+ failures = 0;
+ seeders = leechers = 0;
+ }
+
+
+ HTTPTracker::~HTTPTracker()
+ {
+ }
+
+ void HTTPTracker::start()
+ {
+ event = "started";
+ doRequest();
+ }
+
+ void HTTPTracker::stop(WaitJob* wjob)
+ {
+ if (!started)
+ return;
+
+ event = "stopped";
+ doRequest(wjob);
+ started = false;
+ }
+
+ void HTTPTracker::completed()
+ {
+ event = "completed";
+ doRequest();
+ event = QString::null;
+ }
+
+ void HTTPTracker::manualUpdate()
+ {
+ if (!started)
+ event = "started";
+ doRequest();
+ }
+
+ void HTTPTracker::scrape()
+ {
+ if (!url.isValid())
+ {
+ Out(SYS_TRK|LOG_NOTICE) << "Invalid tracker url, canceling scrape" << endl;
+ return;
+ }
+
+ if (!url.fileName(false).startsWith("announce"))
+ {
+ Out(SYS_TRK|LOG_NOTICE) << "Tracker " << url << " does not support scraping" << endl;
+ return;
+ }
+
+ KURL scrape_url = url;
+ scrape_url.setFileName(url.fileName(false).replace("announce","scrape"));
+
+ QString epq = scrape_url.encodedPathAndQuery();
+ const SHA1Hash & info_hash = tor->getInfoHash();
+ if (scrape_url.queryItems().count() > 0)
+ epq += "&info_hash=" + info_hash.toURLString();
+ else
+ epq += "?info_hash=" + info_hash.toURLString();
+ scrape_url.setEncodedPathAndQuery(epq);
+
+ Out(SYS_TRK|LOG_NOTICE) << "Doing scrape request to url : " << scrape_url.prettyURL() << endl;
+ KIO::MetaData md;
+ setupMetaData(md);
+
+ KIO::StoredTransferJob* j = KIO::storedGet(scrape_url,false,false);
+ // set the meta data
+ j->setMetaData(md);
+ KIO::Scheduler::scheduleJob(j);
+
+ connect(j,SIGNAL(result(KIO::Job* )),this,SLOT(onScrapeResult( KIO::Job* )));
+ }
+
+ void HTTPTracker::onScrapeResult(KIO::Job* j)
+ {
+ if (j->error())
+ {
+ Out(SYS_TRK|LOG_IMPORTANT) << "Scrape failed : " << j->errorString() << endl;
+ return;
+ }
+
+ KIO::StoredTransferJob* st = (KIO::StoredTransferJob*)j;
+ BDecoder dec(st->data(),false,0);
+ BNode* n = 0;
+
+ try
+ {
+ n = dec.decode();
+ }
+ catch (bt::Error & err)
+ {
+ Out(SYS_TRK|LOG_IMPORTANT) << "Invalid scrape data " << err.toString() << endl;
+ return;
+ }
+
+ if (n && n->getType() == BNode::DICT)
+ {
+ BDictNode* d = (BDictNode*)n;
+ d = d->getDict("files");
+ if (d)
+ {
+ d = d->getDict(tor->getInfoHash().toByteArray());
+ if (d)
+ {
+ BValueNode* vn = d->getValue("complete");
+ if (vn && vn->data().getType() == Value::INT)
+ {
+ seeders = vn->data().toInt();
+ }
+
+
+ vn = d->getValue("incomplete");
+ if (vn && vn->data().getType() == Value::INT)
+ {
+ leechers = vn->data().toInt();
+ }
+
+ Out(SYS_TRK|LOG_DEBUG) << "Scrape : leechers = " << leechers
+ << ", seeders = " << seeders << endl;
+ }
+ }
+ }
+
+ delete n;
+ }
+
+ void HTTPTracker::doRequest(WaitJob* wjob)
+ {
+ const TorrentStats & s = tor->getStats();
+
+ KURL u = url;
+ if (!url.isValid())
+ {
+ requestPending();
+ QTimer::singleShot(500,this,SLOT(emitInvalidURLFailure()));
+ return;
+ }
+
+ Uint16 port = Globals::instance().getServer().getPortInUse();;
+
+ u.addQueryItem("peer_id",peer_id.toString());
+ u.addQueryItem("port",QString::number(port));
+ u.addQueryItem("uploaded",QString::number(s.trk_bytes_uploaded));
+ u.addQueryItem("downloaded",QString::number(s.trk_bytes_downloaded));
+
+ if (event == "completed")
+ u.addQueryItem("left","0"); // need to send 0 when we are completed
+ else
+ u.addQueryItem("left",QString::number(s.bytes_left));
+
+ u.addQueryItem("compact","1");
+ if (event != "stopped")
+ u.addQueryItem("numwant","100");
+ else
+ u.addQueryItem("numwant","0");
+
+ u.addQueryItem("key",QString::number(key));
+ QString cip = Tracker::getCustomIP();
+ if (!cip.isNull())
+ u.addQueryItem("ip",cip);
+
+ if (event != QString::null)
+ u.addQueryItem("event",event);
+ QString epq = u.encodedPathAndQuery();
+ const SHA1Hash & info_hash = tor->getInfoHash();
+ epq += "&info_hash=" + info_hash.toURLString();
+
+
+ u.setEncodedPathAndQuery(epq);
+
+ if (active_job)
+ {
+ announce_queue.append(u);
+ Out(SYS_TRK|LOG_NOTICE) << "Announce ongoing, queueing announce" << endl;
+ }
+ else
+ {
+ doAnnounce(u);
+ // if there is a wait job, add this job to the waitjob
+ if (wjob)
+ wjob->addExitOperation(new kt::ExitJobOperation(active_job));
+ }
+ }
+
+ bool HTTPTracker::updateData(const QByteArray & data)
+ {
+//#define DEBUG_PRINT_RESPONSE
+#ifdef DEBUG_PRINT_RESPONSE
+ Out() << "Data : " << endl;
+ Out() << QString(data) << endl;
+#endif
+ // search for dictionary, there might be random garbage infront of the data
+ Uint32 i = 0;
+ while (i < data.size())
+ {
+ if (data[i] == 'd')
+ break;
+ i++;
+ }
+
+ if (i == data.size())
+ {
+ failures++;
+ requestFailed(i18n("Invalid response from tracker"));
+ return false;
+ }
+
+ BDecoder dec(data,false,i);
+ BNode* n = 0;
+ try
+ {
+ n = dec.decode();
+ }
+ catch (...)
+ {
+ failures++;
+ requestFailed(i18n("Invalid data from tracker"));
+ return false;
+ }
+
+ if (!n || n->getType() != BNode::DICT)
+ {
+ failures++;
+ requestFailed(i18n("Invalid response from tracker"));
+ return false;
+ }
+
+ BDictNode* dict = (BDictNode*)n;
+ if (dict->getData("failure reason"))
+ {
+ BValueNode* vn = dict->getValue("failure reason");
+ QString msg = vn->data().toString();
+ delete n;
+ failures++;
+ requestFailed(msg);
+ return false;
+ }
+
+ BValueNode* vn = dict->getValue("interval");
+
+ // if no interval is specified, use 5 minutes
+ if (vn)
+ interval = vn->data().toInt();
+ else
+ interval = 5 * 60;
+
+ vn = dict->getValue("incomplete");
+ if (vn)
+ leechers = vn->data().toInt();
+
+ vn = dict->getValue("complete");
+ if (vn)
+ seeders = vn->data().toInt();
+
+ BListNode* ln = dict->getList("peers");
+ if (!ln)
+ {
+ // no list, it might however be a compact response
+ vn = dict->getValue("peers");
+ if (!vn)
+ {
+ delete n;
+ failures++;
+ requestFailed(i18n("Invalid response from tracker"));
+ return false;
+ }
+
+ QByteArray arr = vn->data().toByteArray();
+ for (Uint32 i = 0;i < arr.size();i+=6)
+ {
+ Uint8 buf[6];
+ for (int j = 0;j < 6;j++)
+ buf[j] = arr[i + j];
+
+ addPeer(QHostAddress(ReadUint32(buf,0)).toString(),ReadUint16(buf,4));
+ }
+ }
+ else
+ {
+ for (Uint32 i = 0;i < ln->getNumChildren();i++)
+ {
+ BDictNode* dict = dynamic_cast<BDictNode*>(ln->getChild(i));
+
+ if (!dict)
+ continue;
+
+ BValueNode* ip_node = dict->getValue("ip");
+ BValueNode* port_node = dict->getValue("port");
+
+ if (!ip_node || !port_node)
+ continue;
+
+ addPeer(ip_node->data().toString(),port_node->data().toInt());
+ }
+ }
+
+ delete n;
+ return true;
+ }
+
+
+ void HTTPTracker::onAnnounceResult(KIO::Job* j)
+ {
+ if (j->error())
+ {
+ KIO::StoredTransferJob* st = (KIO::StoredTransferJob*)j;
+ KURL u = st->url();
+ active_job = 0;
+
+ Out(SYS_TRK|LOG_IMPORTANT) << "Error : " << st->errorString() << endl;
+ if (u.queryItem("event") != "stopped")
+ {
+ failures++;
+ requestFailed(j->errorString());
+ }
+ else
+ {
+ stopDone();
+ }
+ }
+ else
+ {
+ KIO::StoredTransferJob* st = (KIO::StoredTransferJob*)j;
+ KURL u = st->url();
+ active_job = 0;
+
+ if (u.queryItem("event") != "stopped")
+ {
+ try
+ {
+ if (updateData(st->data()))
+ {
+ failures = 0;
+ peersReady(this);
+ requestOK();
+ if (u.queryItem("event") == "started")
+ started = true;
+ }
+ }
+ catch (bt::Error & err)
+ {
+ failures++;
+ requestFailed(i18n("Invalid response from tracker"));
+ }
+ event = QString::null;
+ }
+ else
+ {
+ failures = 0;
+ stopDone();
+ }
+ }
+ doAnnounceQueue();
+ }
+
+ void HTTPTracker::emitInvalidURLFailure()
+ {
+ failures++;
+ requestFailed(i18n("Invalid tracker URL"));
+ }
+
+ void HTTPTracker::setupMetaData(KIO::MetaData & md)
+ {
+ md["UserAgent"] = "ktorrent/" VERSION;
+ md["SendLanguageSettings"] = "false";
+ md["Cookies"] = "none";
+ // md["accept"] = "text/plain";
+ md["accept"] = "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2";
+ if (Settings::doNotUseKDEProxy())
+ {
+ // set the proxy if the doNotUseKDEProxy ix enabled (URL must be valid to)
+ KURL url = KURL::fromPathOrURL(Settings::httpTrackerProxy());
+ if (url.isValid())
+ md["UseProxy"] = url.pathOrURL();
+ else
+ md["UseProxy"] = QString::null;
+ }
+ }
+
+ void HTTPTracker::doAnnounceQueue()
+ {
+ if (announce_queue.empty())
+ return;
+
+ KURL u = announce_queue.front();
+ announce_queue.pop_front();
+ doAnnounce(u);
+ }
+
+ void HTTPTracker::doAnnounce(const KURL & u)
+ {
+ Out(SYS_TRK|LOG_NOTICE) << "Doing tracker request to url : " << u.prettyURL() << endl;
+ KIO::MetaData md;
+ setupMetaData(md);
+ KIO::StoredTransferJob* j = KIO::storedGet(u,false,false);
+ // set the meta data
+ j->setMetaData(md);
+ KIO::Scheduler::scheduleJob(j);
+
+ connect(j,SIGNAL(result(KIO::Job* )),this,SLOT(onAnnounceResult( KIO::Job* )));
+
+ active_job = j;
+ requestPending();
+ }
+}
+#include "httptracker.moc"
diff --git a/libktorrent/torrent/httptracker.h b/libktorrent/torrent/httptracker.h
new file mode 100644
index 0000000..8ac7e69
--- /dev/null
+++ b/libktorrent/torrent/httptracker.h
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTHTTPTRACKER_H
+#define BTHTTPTRACKER_H
+
+#include <qtimer.h>
+#include "tracker.h"
+
+namespace KIO
+{
+ class Job;
+ class MetaData;
+}
+
+namespace bt
+{
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Communicates with the tracker
+ *
+ * This class uses the HTTP protocol to communicate with the tracker.
+ */
+ class HTTPTracker : public Tracker
+ {
+ Q_OBJECT
+ public:
+ HTTPTracker(const KURL & url,kt::TorrentInterface* tor,const PeerID & id,int tier);
+ virtual ~HTTPTracker();
+
+ virtual void start();
+ virtual void stop(WaitJob* wjob = 0);
+ virtual void completed();
+ virtual void manualUpdate();
+ virtual Uint32 failureCount() const {return failures;}
+ virtual void scrape();
+
+ private slots:
+ void onAnnounceResult(KIO::Job* j);
+ void onScrapeResult(KIO::Job* j);
+ void emitInvalidURLFailure();
+
+ private:
+ void doRequest(WaitJob* wjob = 0);
+ bool updateData(const QByteArray & data);
+ void setupMetaData(KIO::MetaData & md);
+ void doAnnounceQueue();
+ void doAnnounce(const KURL & u);
+
+ private:
+ KIO::Job* active_job;
+ KURL::List announce_queue;
+ QString event;
+ Uint32 failures;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/ipblocklist.cpp b/libktorrent/torrent/ipblocklist.cpp
new file mode 100644
index 0000000..de30968
--- /dev/null
+++ b/libktorrent/torrent/ipblocklist.cpp
@@ -0,0 +1,400 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 "ipblocklist.h"
+#include <qmap.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <util/constants.h>
+#include <util/log.h>
+#include "globals.h"
+#include <interfaces/ipblockinginterface.h>
+
+
+namespace bt
+{
+ Uint32 toUint32(const QString& ip, bool* ok)
+ {
+ bool test;
+ *ok = true;
+
+ Uint32 ret = ip.section('.',0,0).toULongLong(&test);
+ if(!test) *ok=false;
+ ret <<= 8;
+ ret |= ip.section('.',1,1).toULong(&test);
+ if(!test) *ok=false;
+ ret <<= 8;
+ ret |= ip.section('.',2,2).toULong(&test);
+ if(!test) *ok=false;
+ ret <<= 8;
+ ret |= ip.section('.',3,3).toULong(&test);
+ if(!test) *ok=false;
+
+ if(*ok)
+ {
+ // Out() << "IP: " << ip << " parsed: " << ret << endl;
+ return ret;
+ }
+ else
+ {
+ // Out() << "Could not parse IP " << ip << ". IP blocklist might not be working." << endl;
+ return 0;
+ }
+ }
+
+ IPBlocklist::IPBlocklist()
+ {
+ this->pluginInterface = 0;
+ insert("0.0.0.0",3);
+ addRange("3.*.*.*");
+ }
+
+ IPBlocklist::IPBlocklist(const IPBlocklist & ) {}
+
+ void IPBlocklist::insert( QString ip, int state )
+ {
+ bool ok;
+ Uint32 ipi = toUint32(ip, &ok);
+ if(!ok)
+ return;
+ IPKey key(ipi,0xFFFFFFFF); //-- you can test ranges here. Just specify your mask.
+ insertRangeIP(key, state);
+ Out(SYS_IPF|LOG_NOTICE) << "IP " << ip << " banned." << endl;
+ }
+
+ void IPBlocklist::addRange(QString ip)
+ {
+ bool ok;
+ int tmp = 0;
+ Uint32 addr = 0;
+ Uint32 mask = 0xFFFFFFFF;
+
+ tmp = ip.section('.',0,0).toInt(&ok);
+ if(!ok)
+ {
+ if(ip.section('.',0,0) == "*")
+ mask &= 0x00FFFFFF;
+ else return; //illegal character
+ }
+ else
+ addr = tmp;
+
+ tmp = ip.section('.',1,1).toInt(&ok);
+ if(!ok)
+ {
+ addr <<= 8;
+ if(ip.section('.',1,1) == "*")
+ mask &= 0xFF00FFFF;
+ else return; //illegal character
+ }
+ else
+ {
+ addr <<= 8;
+ addr |= tmp;
+ }
+
+ tmp = ip.section('.',2,2).toInt(&ok);
+ if(!ok)
+ {
+ addr <<= 8;
+ if(ip.section('.',2,2) == "*")
+ mask &= 0xFFFF00FF;
+ else return; //illegal character
+ }
+ else
+ {
+ addr <<= 8;
+ addr |= tmp;
+ }
+
+ tmp = ip.section('.',3,3).toInt(&ok);
+ if(!ok)
+ {
+ addr <<= 8;
+ if(ip.section('.',3,3) == "*")
+ mask &=0xFFFFFF00;
+ else return; //illegal character
+ }
+ else
+ {
+ addr <<= 8;
+ addr |= tmp;
+ }
+
+ IPKey key(addr, mask);
+ this->insertRangeIP(key);
+ }
+
+ void IPBlocklist::insertRangeIP(IPKey& key, int state)
+ {
+// Out() << "Blocked range: " << key.m_ip << " - " << key.m_mask << endl;
+ QMap<IPKey, int>::iterator it;
+ if ((it = m_peers.find(key)) != m_peers.end())
+ {
+
+ if(it.key().m_mask != key.m_mask)
+ {
+ int st = it.data();
+ IPKey key1(key.m_ip, it.key().m_mask | key.m_mask);
+ m_peers.insert(key1, state+st);
+ return;
+ }
+ m_peers[key]+= state;
+ }
+ else
+ m_peers.insert(key,state);
+ }
+
+ void IPBlocklist::removeRange(QString ip)
+ {
+ bool ok;
+ int tmp = 0;
+ Uint32 addr = 0;
+ Uint32 mask = 0xFFFFFFFF;
+
+ tmp = ip.section('.',0,0).toInt(&ok);
+ if(!ok)
+ {
+ if(ip.section('.',0,0) == "*")
+ mask &= 0x00FFFFFF;
+ else return; //illegal character
+ }
+ else
+ addr = tmp;
+
+ tmp = ip.section('.',1,1).toInt(&ok);
+ if(!ok)
+ {
+ addr <<= 8;
+ if(ip.section('.',1,1) == "*")
+ mask &= 0xFF00FFFF;
+ else return; //illegal character
+ }
+ else
+ {
+ addr <<= 8;
+ addr |= tmp;
+ }
+
+ tmp = ip.section('.',2,2).toInt(&ok);
+ if(!ok)
+ {
+ addr <<= 8;
+ if(ip.section('.',2,2) == "*")
+ mask &= 0xFFFF00FF;
+ else return; //illegal character
+ }
+ else
+ {
+ addr <<= 8;
+ addr |= tmp;
+ }
+
+ tmp = ip.section('.',3,3).toInt(&ok);
+ if(!ok)
+ {
+ addr <<= 8;
+ if(ip.section('.',3,3) == "*")
+ mask &=0xFFFFFF00;
+ else return; //illegal character
+ }
+ else
+ {
+ addr <<= 8;
+ addr |= tmp;
+ }
+
+ IPKey key(addr, mask);
+
+ QMap<IPKey, int>::iterator it = m_peers.find(key);
+ if (it == m_peers.end())
+ return;
+
+ m_peers.remove(key);
+ }
+
+ void IPBlocklist::setPluginInterfacePtr( kt::IPBlockingInterface* ptr )
+ {
+ this->pluginInterface = ptr;
+ }
+
+ bool IPBlocklist::isBlocked(const QString& ip )
+ {
+ //First check local filter list
+ if(isBlockedLocal(ip))
+ {
+ Out(SYS_IPF|LOG_NOTICE) << "IP " << ip << " is blacklisted. Connection denied." << endl;
+ return true;
+ }
+
+ //Then we ask plugin
+ if(isBlockedPlugin(ip))
+ {
+ Out(SYS_IPF|LOG_NOTICE) << "IP " << ip << " is blacklisted. Connection denied." << endl;
+ return true;
+ }
+
+ return false;
+ }
+
+ bool IPBlocklist::isBlockedLocal(const QString& ip )
+ {
+ bool ok;
+ Uint32 ipi = toUint32(ip,&ok);
+ if (!ok)
+ return false;
+ IPKey key(ipi);
+
+ QMap<IPKey, int>::iterator it;
+ it = m_peers.find(key);
+ if (it==m_peers.end())
+ return false;
+
+ return m_peers[key] >= 3;
+ }
+
+ bool IPBlocklist::isBlockedPlugin(const QString& ip )
+ {
+ if (pluginInterface == 0) //the plugin is not loaded
+ return false;
+ else
+ return pluginInterface->isBlockedIP(ip);
+ }
+
+ QStringList* IPBlocklist::getBlocklist()
+ {
+ QStringList* ret = new QStringList();
+ QMap<IPKey,int>::iterator it = m_peers.begin();
+ for( ;it!=m_peers.end();++it)
+ {
+ IPKey key = it.key();
+ *ret << key.toString();
+ }
+
+ return ret;
+ }
+
+ void IPBlocklist::setBlocklist(QStringList* list)
+ {
+ m_peers.clear();
+ for (QStringList::Iterator it = list->begin(); it != list->end(); ++it )
+ addRange(*it);
+ }
+
+ /*** IPKey *****************************************************************************************************************/
+
+ IPKey::IPKey()
+ {
+ m_ip = 0;
+ m_mask = 0xFFFFFFFF;
+ }
+
+ IPKey::IPKey(QString& ip, Uint32 mask)
+ : m_mask(mask)
+ {
+ bool ok;
+ this->m_ip = toUint32(ip, &ok);
+ }
+
+ IPKey::IPKey(const IPKey& ip)
+ {
+ m_ip = ip.m_ip;
+ m_mask = ip.m_mask;
+ }
+
+ IPKey::IPKey(Uint32 ip, Uint32 mask)
+ : m_ip(ip), m_mask(mask)
+ {}
+
+ QString IPKey::toString()
+ {
+ Uint32 tmp, tmpmask;
+ Uint32 ip = m_ip;
+ Uint32 mask = m_mask;
+ QString out;
+
+ tmp = ip;
+ tmpmask = mask;
+ tmp &= 0x000000FF;
+ tmpmask &= 0x000000FF;
+ if(tmpmask == 0)
+ out.prepend("*");
+ else
+ out.prepend(QString("%1").arg(tmp));
+ ip >>= 8;
+ mask >>= 8;
+ tmp = ip;
+ tmpmask = mask;
+ tmp &= 0x000000FF;
+ tmpmask &= 0x000000FF;
+ if(tmpmask == 0)
+ out.prepend("*.");
+ else
+ out.prepend(QString("%1.").arg(tmp));
+ ip >>= 8;
+ mask >>= 8;
+ tmp = ip;
+ tmpmask = mask;
+ tmp &= 0x000000FF;
+ tmpmask &= 0x000000FF;
+ if(tmpmask == 0)
+ out.prepend("*.");
+ else
+ out.prepend(QString("%1.").arg(tmp));
+ ip >>= 8;
+ mask >>= 8;
+ tmp = ip;
+ tmpmask = mask;
+ tmp &= 0x000000FF;
+ tmpmask &= 0x000000FF;
+ if(tmpmask == 0)
+ out.prepend("*.");
+ else
+ out.prepend(QString("%1.").arg(tmp));
+
+ return out;
+ }
+
+ bool IPKey::operator ==(const IPKey& ip) const
+ {
+ return (m_ip & m_mask) == m_mask & ip.m_ip;
+ }
+
+ bool IPKey::operator !=(const IPKey& ip) const
+ {
+ return (m_ip & m_mask) != m_mask & ip.m_ip;
+ }
+
+ bool IPKey::operator < (const IPKey& ip) const
+ {
+ return (m_ip & m_mask) < (m_mask & ip.m_ip);
+ }
+
+ IPKey& IPKey::operator =(const IPKey& ip)
+ {
+ m_ip = ip.m_ip;
+ m_mask = ip.m_mask;
+ return *this;
+ }
+
+ IPKey::~ IPKey()
+ {}
+}
diff --git a/libktorrent/torrent/ipblocklist.h b/libktorrent/torrent/ipblocklist.h
new file mode 100644
index 0000000..b30a856
--- /dev/null
+++ b/libktorrent/torrent/ipblocklist.h
@@ -0,0 +1,175 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 IPBLOCKLIST_H
+#define IPBLOCKLIST_H
+
+#include <interfaces/ipblockinginterface.h>
+
+#include <qmap.h>
+#include <qstringlist.h>
+#include <util/constants.h>
+
+class QString;
+
+namespace bt
+{
+ class IPKey
+ {
+ public:
+ IPKey();
+ IPKey(QString& ip, Uint32 mask = 0xFFFFFFFF);
+ IPKey(Uint32 ip, Uint32 mask = 0xFFFFFFFF);
+ IPKey(const IPKey& ip);
+ ~IPKey();
+
+ bool operator== (const IPKey& ip) const;
+ bool operator!= (const IPKey& ip) const;
+ bool operator < (const IPKey & ip) const;
+ IPKey& operator= (const IPKey& ip);
+
+ QString toString();
+
+ Uint32 m_ip;
+ Uint32 m_mask;
+ };
+
+ /**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief Keeps track of blocked peers
+ *
+ * This class is used for keeping the IP addresses list of peers that
+ * have sent bad chunks.
+ *
+ * Peers that have sent >= 3 bad chunks are blocked.
+ */
+ class IPBlocklist
+ {
+ IPBlocklist();
+ IPBlocklist(const IPBlocklist & );
+ const IPBlocklist& operator=(const IPBlocklist&);
+
+ public:
+
+ inline static IPBlocklist & instance()
+ {
+ static IPBlocklist singleton;
+ return singleton;
+ }
+
+ /**
+ * @brief Adds ip address to the list.
+ * It also increases the number of times this IP appeared in the list.
+ * @param ip QString containing the peer IP address
+ * @param state int number of bad chunks client from ip sent. Basically this parameter
+ * is used only to permanently block some IP (by setting this param to 3)
+ */
+ void insert(QString ip, int state=1);
+
+ /**
+ * @brief Adds IP range to the list
+ * It is used for blocking plugin. For single IP use insert() instead.
+ * @param ip QString peer IP address. Uses ''*" for ranges.
+ **/
+ void addRange(QString ip);
+
+
+ /**
+ * @brief Removes IP range from list
+ * It is used for blocking plugin.
+ * @param ip QString peer IP address. Uses ''*" for ranges.
+ **/
+ void removeRange(QString ip);
+
+ /**
+ * Checks if IP is in the blocking list
+ * @param ip - IP address to check
+ * @returns true if IP is blocked
+ */
+ bool isBlocked(const QString& ip);
+
+ /**
+ * @brief Sets the pointer to the IPBlockingInterface (IPBlocking plugin)
+ * Call this function from IPBlocking plugin when it gets loaded.
+ * @arg ptr - pointer to be set
+ */
+ void setPluginInterfacePtr(kt::IPBlockingInterface* ptr);
+
+ /**
+ * @brief Unsets the interface pointer
+ * Call this when IPBlockingPlugin gets unloaded or deleted
+ */
+ void unsetPluginInterfacePtr() { pluginInterface = 0; }
+
+
+ /**
+ * @brief This function will fill QStringList with all banned peer IP addresses.
+ * @return QStringList filled with blacklisted peers.
+ * It will create a new QStringList object so don't forget to delete it after using.
+ */
+ QStringList* getBlocklist();
+
+
+ /**
+ * @brief This function will load blacklisted peers to IPFilter.
+ * @param list QStringList containing all banned peers.
+ * @note This function will remove current peers from blocklist before setting new list!!!
+ */
+ void setBlocklist(QStringList* list);
+
+ private:
+
+ /**
+ * Pointer to the IPBlocking plugin which implements IPBlockingInterface
+ * Used to provide a way to use this plugin functions from within this class
+ */
+ kt::IPBlockingInterface* pluginInterface;
+
+ /**
+ * @param IPKey - Key: Peer IP address and bit mask if it is a range
+ * @param int - Number of bad chunks sent.
+ **/
+ QMap<IPKey, int> m_peers;
+
+ /**
+ * @brief Adds IP range to the list.
+ * @param key IPKey that represents this IP range
+ * @param state int Number of 'warnings' for the range.
+ * Default is 3 - that means range is blocked permanently.
+ */
+ void insertRangeIP(IPKey& key, int state=3);
+
+
+ /**
+ * Checks if IP is listed in local database (IPBlocklist::m_peers)
+ * @return TRUE if IP is to be blocked
+ */
+ bool isBlockedLocal(const QString& ip);
+
+ /**
+ * Checks if IP is listed in plugins antip2p file
+ * @return TRUE if IP is to be blocked
+ */
+ bool isBlockedPlugin(const QString& ip);
+ };
+}
+
+#endif
+
diff --git a/libktorrent/torrent/movedatafilesjob.cpp b/libktorrent/torrent/movedatafilesjob.cpp
new file mode 100644
index 0000000..c0c24e7
--- /dev/null
+++ b/libktorrent/torrent/movedatafilesjob.cpp
@@ -0,0 +1,103 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include "movedatafilesjob.h"
+
+namespace bt
+{
+
+ MoveDataFilesJob::MoveDataFilesJob() : KIO::Job(false),err(false),active_job(0)
+ {}
+
+
+ MoveDataFilesJob::~MoveDataFilesJob()
+ {}
+
+ void MoveDataFilesJob::addMove(const QString & src,const QString & dst)
+ {
+ todo.insert(src,dst);
+ }
+
+ void MoveDataFilesJob::onJobDone(KIO::Job* j)
+ {
+ if (j->error() || err)
+ {
+ if (!err)
+ m_error = KIO::ERR_INTERNAL;
+
+ active_job = 0;
+ if (j->error())
+ j->showErrorDialog();
+
+ // shit happened cancel all previous moves
+ err = true;
+ recover();
+ }
+ else
+ {
+ success.insert(active_src,active_dst);
+ active_src = active_dst = QString::null;
+ active_job = 0;
+ startMoving();
+ }
+ }
+
+ void MoveDataFilesJob::onCanceled(KIO::Job* j)
+ {
+ m_error = KIO::ERR_USER_CANCELED;
+ active_job = 0;
+ err = true;
+ recover();
+ }
+
+ void MoveDataFilesJob::startMoving()
+ {
+ if (todo.isEmpty())
+ {
+ m_error = 0;
+ emitResult();
+ return;
+ }
+
+ QMap<QString,QString>::iterator i = todo.begin();
+ active_job = KIO::move(KURL::fromPathOrURL(i.key()),KURL::fromPathOrURL(i.data()),false);
+ active_src = i.key();
+ active_dst = i.data();
+ Out(SYS_GEN|LOG_DEBUG) << "Moving " << active_src << " -> " << active_dst << endl;
+ connect(active_job,SIGNAL(result(KIO::Job*)),this,SLOT(onJobDone(KIO::Job*)));
+ connect(active_job,SIGNAL(canceled(KIO::Job*)),this,SLOT(onCanceled(KIO::Job*)));
+ todo.erase(i);
+ }
+
+ void MoveDataFilesJob::recover()
+ {
+ if (success.isEmpty())
+ {
+ emitResult();
+ return;
+ }
+ QMap<QString,QString>::iterator i = success.begin();
+ active_job = KIO::move(KURL::fromPathOrURL(i.data()),KURL::fromPathOrURL(i.key()),false);
+ connect(active_job,SIGNAL(result(KIO::Job*)),this,SLOT(onJobDone(KIO::Job*)));
+ connect(active_job,SIGNAL(canceled(KIO::Job*)),this,SLOT(onCanceled(KIO::Job*)));
+ success.erase(i);
+ }
+}
+#include "movedatafilesjob.moc"
diff --git a/libktorrent/torrent/movedatafilesjob.h b/libktorrent/torrent/movedatafilesjob.h
new file mode 100644
index 0000000..b0002d9
--- /dev/null
+++ b/libktorrent/torrent/movedatafilesjob.h
@@ -0,0 +1,68 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTMOVEDATAFILESJOB_H
+#define BTMOVEDATAFILESJOB_H
+
+#include <kio/job.h>
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ * KIO::Job to move all the files of a torrent.
+ */
+ class MoveDataFilesJob : public KIO::Job
+ {
+ Q_OBJECT
+ public:
+ MoveDataFilesJob();
+ virtual ~MoveDataFilesJob();
+
+ /**
+ * Add a move to the todo list.
+ * @param src File to move
+ * @param dst Where to move it to
+ */
+ void addMove(const QString & src,const QString & dst);
+
+ /**
+ * Start moving the files.
+ */
+ void startMoving();
+
+ private slots:
+ void onJobDone(KIO::Job* j);
+ void onCanceled(KIO::Job* j);
+
+ private:
+ void recover();
+
+ private:
+ bool err;
+ KIO::Job* active_job;
+ QString active_src,active_dst;
+ QMap<QString,QString> todo;
+ QMap<QString,QString> success;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/multifilecache.cpp b/libktorrent/torrent/multifilecache.cpp
new file mode 100644
index 0000000..c6af92c
--- /dev/null
+++ b/libktorrent/torrent/multifilecache.cpp
@@ -0,0 +1,867 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <errno.h>
+#include <qdir.h>
+#include <qstringlist.h>
+#include <qfileinfo.h>
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <util/file.h>
+#include <util/fileops.h>
+#include <util/functions.h>
+#include <util/error.h>
+#include <util/log.h>
+#include "torrent.h"
+#include "cache.h"
+#include "multifilecache.h"
+#include "globals.h"
+#include "chunk.h"
+#include "cachefile.h"
+#include "dndfile.h"
+#include "preallocationthread.h"
+#include "movedatafilesjob.h"
+
+
+
+namespace bt
+{
+ static Uint64 FileOffset(Chunk* c,const TorrentFile & f,Uint64 chunk_size);
+ static Uint64 FileOffset(Uint32 cindex,const TorrentFile & f,Uint64 chunk_size);
+ static void DeleteEmptyDirs(const QString & output_dir,const QString & fpath);
+
+
+ MultiFileCache::MultiFileCache(Torrent& tor,const QString & tmpdir,const QString & datadir,bool custom_output_name) : Cache(tor, tmpdir,datadir)
+ {
+ cache_dir = tmpdir + "cache" + bt::DirSeparator();
+ if (datadir.length() == 0)
+ this->datadir = guessDataDir();
+ if (!custom_output_name)
+ output_dir = this->datadir + tor.getNameSuggestion() + bt::DirSeparator();
+ else
+ output_dir = this->datadir;
+ files.setAutoDelete(true);
+ }
+
+
+ MultiFileCache::~MultiFileCache()
+ {}
+
+ QString MultiFileCache::guessDataDir()
+ {
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (tf.doNotDownload())
+ continue;
+
+ QString p = cache_dir + tf.getPath();
+ QFileInfo fi(p);
+ if (!fi.isSymLink())
+ continue;
+
+ QString dst = fi.readLink();
+ QString tmp = tor.getNameSuggestion() + bt::DirSeparator() + tf.getPath();
+ dst = dst.left(dst.length() - tmp.length());
+ if (dst.length() == 0)
+ continue;
+
+ if (!dst.endsWith(bt::DirSeparator()))
+ dst += bt::DirSeparator();
+ Out() << "Guessed outputdir to be " << dst << endl;
+ return dst;
+ }
+
+ return QString::null;
+ }
+
+ QString MultiFileCache::getOutputPath() const
+ {
+ return output_dir;
+ }
+
+ void MultiFileCache::close()
+ {
+ files.clear();
+ }
+
+ void MultiFileCache::open()
+ {
+ QString dnd_dir = tmpdir + "dnd" + bt::DirSeparator();
+ // open all files
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ CacheFile* fd = 0;
+ DNDFile* dfd = 0;
+ try
+ {
+ if (!tf.doNotDownload())
+ {
+ if (files.contains(i))
+ files.erase(i);
+
+ fd = new CacheFile();
+ fd->open(cache_dir + tf.getPath(),tf.getSize());
+ files.insert(i,fd);
+ }
+ else
+ {
+ if (dnd_files.contains(i))
+ dnd_files.erase(i);
+
+ dfd = new DNDFile(dnd_dir + tf.getPath() + ".dnd");
+ dfd->checkIntegrity();
+ dnd_files.insert(i,dfd);
+ }
+ }
+ catch (...)
+ {
+ delete fd;
+ fd = 0;
+ delete dfd;
+ dfd = 0;
+ throw;
+ }
+ }
+ }
+
+ void MultiFileCache::changeTmpDir(const QString& ndir)
+ {
+ Cache::changeTmpDir(ndir);
+ cache_dir = tmpdir + "cache/";
+ QString dnd_dir = tmpdir + "dnd" + bt::DirSeparator();
+
+ // change paths for individual files, it should not
+ // be a problem to move these files when they are open
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (tf.doNotDownload())
+ {
+ DNDFile* dfd = dnd_files.find(i);
+ if (dfd)
+ dfd->changePath(dnd_dir + tf.getPath() + ".dnd");
+ }
+ else
+ {
+ CacheFile* fd = files.find(i);
+ if (fd)
+ fd->changePath(cache_dir + tf.getPath());
+ }
+ }
+ }
+
+ void MultiFileCache::changeOutputPath(const QString & outputpath)
+ {
+ output_dir = outputpath;
+ if (!output_dir.endsWith(bt::DirSeparator()))
+ output_dir += bt::DirSeparator();
+
+ datadir = output_dir;
+
+ if (!bt::Exists(cache_dir))
+ MakeDir(cache_dir);
+
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (!tf.doNotDownload())
+ {
+ QString fpath = tf.getPath();
+ if (bt::Exists(output_dir + fpath))
+ {
+ bt::Delete(cache_dir + fpath,true); // delete any existing symlinks
+ // create new one
+ bt::SymLink(output_dir + fpath,cache_dir + fpath,true);
+ }
+ }
+ }
+ }
+
+ KIO::Job* MultiFileCache::moveDataFiles(const QString & ndir)
+ {
+ if (!bt::Exists(ndir))
+ bt::MakeDir(ndir);
+
+ QString nd = ndir;
+ if (!nd.endsWith(bt::DirSeparator()))
+ nd += bt::DirSeparator();
+
+ try
+ {
+ MoveDataFilesJob* mvd = new MoveDataFilesJob();
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (tf.doNotDownload())
+ continue;
+
+ // check if every directory along the path exists, and if it doesn't
+ // create it
+ QStringList sl = QStringList::split(bt::DirSeparator(),nd + tf.getPath());
+ QString odir = bt::DirSeparator();
+ for (Uint32 i = 0;i < sl.count() - 1;i++)
+ {
+ odir += sl[i] + bt::DirSeparator();
+ if (!bt::Exists(odir))
+ {
+ bt::MakeDir(odir);
+ }
+ }
+
+ mvd->addMove(output_dir + tf.getPath(),nd + tf.getPath());
+ }
+
+ mvd->startMoving();
+ return mvd;
+ }
+ catch (bt::Error & err)
+ {
+ throw; // rethrow error
+ }
+ return 0;
+ }
+
+ void MultiFileCache::moveDataFilesCompleted(KIO::Job* job)
+ {
+ if (!job->error())
+ {
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ // check for empty directories and delete them
+ DeleteEmptyDirs(output_dir,tf.getPath());
+ }
+ }
+ }
+
+ void MultiFileCache::create()
+ {
+ if (!bt::Exists(cache_dir))
+ MakeDir(cache_dir);
+ if (!bt::Exists(output_dir))
+ MakeDir(output_dir);
+ if (!bt::Exists(tmpdir + "dnd"))
+ bt::MakeDir(tmpdir + "dnd");
+
+ // update symlinks
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ touch(tf);
+ }
+ }
+
+ void MultiFileCache::touch(TorrentFile & tf)
+ {
+ QString fpath = tf.getPath();
+ bool dnd = tf.doNotDownload();
+ // first split fpath by / separator
+ QStringList sl = QStringList::split(bt::DirSeparator(),fpath);
+ // create all necessary subdirs
+ QString ctmp = cache_dir;
+ QString otmp = output_dir;
+ QString dtmp = tmpdir + "dnd" + bt::DirSeparator();
+ for (Uint32 i = 0;i < sl.count() - 1;i++)
+ {
+ otmp += sl[i];
+ ctmp += sl[i];
+ dtmp += sl[i];
+ // we need to make the same directory structure in the cache,
+ // the output_dir and the dnd directory
+ if (!bt::Exists(ctmp))
+ MakeDir(ctmp);
+ if (!bt::Exists(otmp))
+ MakeDir(otmp);
+ if (!bt::Exists(dtmp))
+ MakeDir(dtmp);
+ otmp += bt::DirSeparator();
+ ctmp += bt::DirSeparator();
+ dtmp += bt::DirSeparator();
+ }
+
+
+ bt::Delete(cache_dir + fpath,true); // delete any existing symlinks
+
+ // then make the file
+ QString tmp = dnd ? tmpdir + "dnd" + bt::DirSeparator() : output_dir;
+ if (dnd)
+ {
+ // only symlink, when we open the files a default dnd file will be made if the file is corrupt or doesn't exist
+ bt::SymLink(tmp + fpath + ".dnd",cache_dir + fpath);
+ }
+ else
+ {
+ if (!bt::Exists(tmp + fpath))
+ {
+ bt::Touch(tmp + fpath);
+ }
+ else
+ {
+ preexisting_files = true;
+ tf.setPreExisting(true); // mark the file as preexisting
+ }
+
+ bt::SymLink(tmp + fpath,cache_dir + fpath);
+ }
+ }
+
+ void MultiFileCache::load(Chunk* c)
+ {
+ QValueList<Uint32> tflist;
+ tor.calcChunkPos(c->getIndex(),tflist);
+
+ // one file is simple, just mmap it
+ if (tflist.count() == 1)
+ {
+ const TorrentFile & f = tor.getFile(tflist.first());
+ CacheFile* fd = files.find(tflist.first());
+ if (!fd)
+ return;
+
+ if (Cache::mappedModeAllowed() && mmap_failures < 3)
+ {
+ Uint64 off = FileOffset(c,f,tor.getChunkSize());
+ Uint8* buf = (Uint8*)fd->map(c,off,c->getSize(),CacheFile::READ);
+ if (buf)
+ {
+ c->setData(buf,Chunk::MMAPPED);
+ // only return when the mapping is OK
+ // if mmap fails we will just load it buffered
+ return;
+ }
+ else
+ mmap_failures++;
+ }
+ }
+
+ Uint8* data = new Uint8[c->getSize()];
+ Uint64 read = 0; // number of bytes read
+ for (Uint32 i = 0;i < tflist.count();i++)
+ {
+ const TorrentFile & f = tor.getFile(tflist[i]);
+ CacheFile* fd = files.find(tflist[i]);
+ DNDFile* dfd = dnd_files.find(tflist[i]);
+
+ // first calculate offset into file
+ // only the first file can have an offset
+ // the following files will start at the beginning
+ Uint64 off = 0;
+ if (i == 0)
+ off = FileOffset(c,f,tor.getChunkSize());
+
+ Uint32 to_read = 0;
+ // then the amount of data we can read from this file
+ if (tflist.count() == 1)
+ to_read = c->getSize();
+ else if (i == 0)
+ to_read = f.getLastChunkSize();
+ else if (i == tflist.count() - 1)
+ to_read = c->getSize() - read;
+ else
+ to_read = f.getSize();
+
+
+ // read part of data
+ if (fd)
+ fd->read(data + read,to_read,off);
+ else if (dfd)
+ {
+ Uint32 ret = 0;
+ if (i == 0)
+ ret = dfd->readLastChunk(data,read,c->getSize());
+ else if (i == tflist.count() - 1)
+ ret = dfd->readFirstChunk(data,read,c->getSize());
+ else
+ ret = dfd->readFirstChunk(data,read,c->getSize());
+
+ if (ret > 0 && ret != to_read)
+ Out() << "Warning : MultiFileCache::load ret != to_read" << endl;
+ }
+ read += to_read;
+ }
+ c->setData(data,Chunk::BUFFERED);
+ }
+
+
+ bool MultiFileCache::prep(Chunk* c)
+ {
+ // find out in which files a chunk lies
+ QValueList<Uint32> tflist;
+ tor.calcChunkPos(c->getIndex(),tflist);
+
+// Out() << "Prep " << c->getIndex() << endl;
+ if (tflist.count() == 1)
+ {
+ // in one so just mmap it
+ Uint64 off = FileOffset(c,tor.getFile(tflist.first()),tor.getChunkSize());
+ CacheFile* fd = files.find(tflist.first());
+ Uint8* buf = 0;
+ if (fd && Cache::mappedModeAllowed() && mmap_failures < 3)
+ {
+ buf = (Uint8*)fd->map(c,off,c->getSize(),CacheFile::RW);
+ if (!buf)
+ mmap_failures++;
+ }
+
+ if (!buf)
+ {
+ // if mmap fails or is not possible use buffered mode
+ c->allocate();
+ c->setStatus(Chunk::BUFFERED);
+ }
+ else
+ {
+ c->setData(buf,Chunk::MMAPPED);
+ }
+ }
+ else
+ {
+ // just allocate it
+ c->allocate();
+ c->setStatus(Chunk::BUFFERED);
+ }
+ return true;
+ }
+
+ void MultiFileCache::save(Chunk* c)
+ {
+ QValueList<Uint32> tflist;
+ tor.calcChunkPos(c->getIndex(),tflist);
+
+ if (c->getStatus() == Chunk::MMAPPED)
+ {
+ // mapped chunks are easy
+ CacheFile* fd = files.find(tflist[0]);
+ if (!fd)
+ return;
+
+ fd->unmap(c->getData(),c->getSize());
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ return;
+ }
+
+ // Out() << "Writing to " << tflist.count() << " files " << endl;
+ Uint64 written = 0; // number of bytes written
+ for (Uint32 i = 0;i < tflist.count();i++)
+ {
+ const TorrentFile & f = tor.getFile(tflist[i]);
+ CacheFile* fd = files.find(tflist[i]);
+ DNDFile* dfd = dnd_files.find(tflist[i]);
+
+ // first calculate offset into file
+ // only the first file can have an offset
+ // the following files will start at the beginning
+ Uint64 off = 0;
+ Uint32 to_write = 0;
+ if (i == 0)
+ {
+ off = FileOffset(c,f,tor.getChunkSize());
+ }
+
+ // the amount of data we can write to this file
+ if (tflist.count() == 1)
+ to_write = c->getSize();
+ else if (i == 0)
+ to_write = f.getLastChunkSize();
+ else if (i == tflist.count() - 1)
+ to_write = c->getSize() - written;
+ else
+ to_write = f.getSize();
+
+ // Out() << "to_write " << to_write << endl;
+ // write the data
+ if (fd)
+ fd->write(c->getData() + written,to_write,off);
+ else if (dfd)
+ {
+ if (i == 0)
+ dfd->writeLastChunk(c->getData() + written,to_write);
+ else if (i == tflist.count() - 1)
+ dfd->writeFirstChunk(c->getData() + written,to_write);
+ else
+ dfd->writeFirstChunk(c->getData() + written,to_write);
+ }
+
+ written += to_write;
+ }
+
+ // set the chunk to on disk and clear it
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ }
+
+ void MultiFileCache::downloadStatusChanged(TorrentFile* tf, bool download)
+ {
+ bool dnd = !download;
+ QString dnd_dir = tmpdir + "dnd" + bt::DirSeparator();
+ // if it is dnd and it is already in the dnd tree do nothing
+ if (dnd && bt::Exists(dnd_dir + tf->getPath() + ".dnd"))
+ return;
+
+ // if it is !dnd and it is already in the output_dir tree do nothing
+ if (!dnd && bt::Exists(output_dir + tf->getPath()))
+ return;
+
+
+ DNDFile* dfd = 0;
+ CacheFile* fd = 0;
+ try
+ {
+
+ if (dnd && bt::Exists(dnd_dir + tf->getPath()))
+ {
+ // old download, we need to convert it
+ // save first and last chunk of the file
+ saveFirstAndLastChunk(tf,dnd_dir + tf->getPath(),dnd_dir + tf->getPath() + ".dnd");
+ // delete symlink
+ bt::Delete(cache_dir + tf->getPath());
+ bt::Delete(dnd_dir + tf->getPath()); // delete old dnd file
+ // recreate it
+ bt::SymLink(dnd_dir + tf->getPath() + ".dnd",cache_dir + tf->getPath());
+
+ files.erase(tf->getIndex());
+ dfd = new DNDFile(dnd_dir + tf->getPath() + ".dnd");
+ dfd->checkIntegrity();
+ dnd_files.insert(tf->getIndex(),dfd);
+ }
+ else if (dnd)
+ {
+ // save first and last chunk of the file
+ if (bt::Exists(output_dir + tf->getPath()))
+ saveFirstAndLastChunk(tf,output_dir + tf->getPath(),dnd_dir + tf->getPath() + ".dnd");
+
+ // delete symlink
+ bt::Delete(cache_dir + tf->getPath());
+ // delete data file
+ bt::Delete(output_dir + tf->getPath(),true);
+ // recreate it
+ bt::SymLink(dnd_dir + tf->getPath() + ".dnd",cache_dir + tf->getPath());
+
+ files.erase(tf->getIndex());
+ dfd = new DNDFile(dnd_dir + tf->getPath() + ".dnd");
+ dfd->checkIntegrity();
+ dnd_files.insert(tf->getIndex(),dfd);
+ }
+ else
+ {
+ // recreate the file
+ recreateFile(tf,dnd_dir + tf->getPath() + ".dnd",output_dir + tf->getPath());
+ // delete symlink and dnd file
+ bt::Delete(cache_dir + tf->getPath());
+ bt::Delete(dnd_dir + tf->getPath() + ".dnd");
+ // recreate it
+ bt::SymLink(output_dir + tf->getPath(),cache_dir + tf->getPath());
+ dnd_files.erase(tf->getIndex());
+
+ fd = new CacheFile();
+ fd->open(output_dir + tf->getPath(),tf->getSize());
+ files.insert(tf->getIndex(),fd);
+ }
+ }
+ catch (bt::Error & err)
+ {
+ delete fd;
+ delete dfd;
+ Out() << err.toString() << endl;
+ }
+ }
+
+
+
+ void MultiFileCache::saveFirstAndLastChunk(TorrentFile* tf,const QString & src_file,const QString & dst_file)
+ {
+ DNDFile out(dst_file);
+ File fptr;
+ if (!fptr.open(src_file,"rb"))
+ throw Error(i18n("Cannot open file %1 : %2").arg(src_file).arg(fptr.errorString()));
+
+ Uint32 cs = 0;
+ if (tf->getFirstChunk() == tor.getNumChunks() - 1)
+ {
+ cs = tor.getFileLength() % tor.getChunkSize();
+ if (cs == 0)
+ cs = tor.getChunkSize();
+ }
+ else
+ cs = tor.getChunkSize();
+
+ Uint8* tmp = new Uint8[tor.getChunkSize()];
+ try
+ {
+ fptr.read(tmp,cs - tf->getFirstChunkOffset());
+ out.writeFirstChunk(tmp,cs - tf->getFirstChunkOffset());
+
+ if (tf->getFirstChunk() != tf->getLastChunk())
+ {
+ Uint64 off = FileOffset(tf->getLastChunk(),*tf,tor.getChunkSize());
+ fptr.seek(File::BEGIN,off);
+ fptr.read(tmp,tf->getLastChunkSize());
+ out.writeLastChunk(tmp,tf->getLastChunkSize());
+ }
+ delete [] tmp;
+ }
+ catch (...)
+ {
+ delete [] tmp;
+ throw;
+ }
+ }
+
+ void MultiFileCache::recreateFile(TorrentFile* tf,const QString & dnd_file,const QString & output_file)
+ {
+ DNDFile dnd(dnd_file);
+
+ // create the output file
+ bt::Touch(output_file);
+ // truncate it
+ try
+ {
+ bool res = false;
+
+ #ifdef HAVE_XFS_XFS_H
+ if( (! res) && (Settings::fullDiskPreallocMethod() == 1) )
+ {
+ res = XfsPreallocate(output_file, tf->getSize());
+ }
+ #endif
+
+ if(! res)
+ {
+ bt::TruncateFile(output_file,tf->getSize());
+ }
+ }
+ catch (bt::Error & e)
+ {
+ // first attempt failed, must be fat so try that
+ if (!FatPreallocate(output_file,tf->getSize()))
+ {
+ throw Error(i18n("Cannot preallocate diskspace : %1").arg(strerror(errno)));
+ }
+ }
+
+ Uint32 cs = 0;
+ if (tf->getFirstChunk() == tor.getNumChunks() - 1)
+ {
+ cs = tor.getFileLength() % tor.getChunkSize();
+ if (cs == 0)
+ cs = tor.getChunkSize();
+ }
+ else
+ cs = tor.getChunkSize();
+
+ File fptr;
+ if (!fptr.open(output_file,"r+b"))
+ throw Error(i18n("Cannot open file %1 : %2").arg(output_file).arg(fptr.errorString()));
+
+
+ Uint32 ts = cs - tf->getFirstChunkOffset() > tf->getLastChunkSize() ?
+ cs - tf->getFirstChunkOffset() : tf->getLastChunkSize();
+ Uint8* tmp = new Uint8[ts];
+
+ try
+ {
+ dnd.readFirstChunk(tmp,0,cs - tf->getFirstChunkOffset());
+ fptr.write(tmp,cs - tf->getFirstChunkOffset());
+
+ if (tf->getFirstChunk() != tf->getLastChunk())
+ {
+ Uint64 off = FileOffset(tf->getLastChunk(),*tf,tor.getChunkSize());
+ fptr.seek(File::BEGIN,off);
+ dnd.readLastChunk(tmp,0,tf->getLastChunkSize());
+ fptr.write(tmp,tf->getLastChunkSize());
+ }
+ delete [] tmp;
+ }
+ catch (...)
+ {
+ delete [] tmp;
+ throw;
+ }
+ }
+
+ void MultiFileCache::preallocateDiskSpace(PreallocationThread* prealloc)
+ {
+ Out() << "MultiFileCache::preallocateDiskSpace" << endl;
+ PtrMap<Uint32,CacheFile>::iterator i = files.begin();
+ while (i != files.end())
+ {
+ CacheFile* cf = i->second;
+ if (!prealloc->isStopped())
+ {
+ cf->preallocate(prealloc);
+ }
+ else
+ {
+ // we got interrupted tell the thread we are not finished and return
+ prealloc->setNotFinished();
+ return;
+ }
+ i++;
+ }
+ }
+
+ bool MultiFileCache::hasMissingFiles(QStringList & sl)
+ {
+ bool ret = false;
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (tf.doNotDownload())
+ continue;
+
+ QString p = cache_dir + tf.getPath();
+ QFileInfo fi(p);
+ // always use symlink first, file might have been moved
+ if (!fi.exists())
+ {
+ ret = true;
+ p = fi.readLink();
+ if (p.isNull())
+ p = output_dir + tf.getPath();
+ sl.append(p);
+ tf.setMissing(true);
+ }
+ else
+ {
+ p = output_dir + tf.getPath();
+ // no symlink so try the actual file
+ if (!bt::Exists(p))
+ {
+ ret = true;
+ sl.append(p);
+ tf.setMissing(true);
+ }
+ }
+ }
+ return ret;
+ }
+
+ static void DeleteEmptyDirs(const QString & output_dir,const QString & fpath)
+ {
+ QStringList sl = QStringList::split(bt::DirSeparator(),fpath);
+ // remove the last, which is just the filename
+ sl.pop_back();
+
+ while (sl.count() > 0)
+ {
+ QString path = output_dir;
+ // reassemble the full directory path
+ for (QStringList::iterator itr = sl.begin(); itr != sl.end();itr++)
+ path += *itr + bt::DirSeparator();
+
+ QDir dir(path);
+ QStringList el = dir.entryList(QDir::All|QDir::System|QDir::Hidden);
+ el.remove(".");
+ el.remove("..");
+ if (el.count() == 0)
+ {
+ // no childern so delete the directory
+ Out(SYS_GEN|LOG_IMPORTANT) << "Deleting empty directory : " << path << endl;
+ bt::Delete(path,true);
+ sl.pop_back(); // remove the last so we can go one higher
+ }
+ else
+ {
+
+ // children, so we cannot delete any more directories higher up
+ return;
+ }
+ }
+
+ // now the output_dir itself
+ QDir dir(output_dir);
+ QStringList el = dir.entryList(QDir::All|QDir::System|QDir::Hidden);
+ el.remove(".");
+ el.remove("..");
+ if (el.count() == 0)
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Deleting empty directory : " << output_dir << endl;
+ bt::Delete(output_dir,true);
+ }
+ }
+
+ void MultiFileCache::deleteDataFiles()
+ {
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ QString fpath = tf.getPath();
+ if (!tf.doNotDownload())
+ {
+ // first delete the file
+ bt::Delete(output_dir + fpath);
+ }
+
+ // check for subdirectories
+ DeleteEmptyDirs(output_dir,fpath);
+ }
+ }
+
+ Uint64 MultiFileCache::diskUsage()
+ {
+ Uint64 sum = 0;
+
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ TorrentFile & tf = tor.getFile(i);
+ if (tf.doNotDownload())
+ continue;
+
+ try
+ {
+ CacheFile* cf = files.find(i);
+ if (cf)
+ {
+ sum += cf->diskUsage();
+ }
+ else
+ {
+ // doesn't exist yet, must be before open is called
+ // so create one and delete it right after
+ cf = new CacheFile();
+ cf->open(cache_dir + tf.getPath(),tf.getSize());
+ sum += cf->diskUsage();
+ delete cf;
+ }
+ }
+ catch (bt::Error & err) // make sure we catch any exceptions
+ {
+ Out(SYS_DIO|LOG_DEBUG) << "Error: " << err.toString() << endl;
+ }
+ }
+
+ return sum;
+ }
+
+ ///////////////////////////////
+
+ Uint64 FileOffset(Chunk* c,const TorrentFile & f,Uint64 chunk_size)
+ {
+ return FileOffset(c->getIndex(),f,chunk_size);
+ }
+
+ Uint64 FileOffset(Uint32 cindex,const TorrentFile & f,Uint64 chunk_size)
+ {
+ return f.fileOffset(cindex,chunk_size);
+ }
+
+}
diff --git a/libktorrent/torrent/multifilecache.h b/libktorrent/torrent/multifilecache.h
new file mode 100644
index 0000000..9c1280e
--- /dev/null
+++ b/libktorrent/torrent/multifilecache.h
@@ -0,0 +1,74 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTMULTIFILECACHE_H
+#define BTMULTIFILECACHE_H
+
+
+#include <util/ptrmap.h>
+#include "cache.h"
+#include "settings.h"
+
+namespace bt
+{
+ class DNDFile;
+ class CacheFile;
+
+ /**
+ * @author Joris Guisson
+ * @brief Cache for multi file torrents
+ *
+ * This class manages a multi file torrent cache. Everything gets stored in the
+ * correct files immediately.
+ */
+ class MultiFileCache : public Cache
+ {
+ QString cache_dir,output_dir;
+ PtrMap<Uint32,CacheFile> files;
+ PtrMap<Uint32,DNDFile> dnd_files;
+ public:
+ MultiFileCache(Torrent& tor,const QString & tmpdir,const QString & datadir,bool custom_output_name);
+ virtual ~MultiFileCache();
+
+ virtual void changeTmpDir(const QString& ndir);
+ virtual void create();
+ virtual void load(Chunk* c);
+ virtual void save(Chunk* c);
+ virtual bool prep(Chunk* c);
+ virtual void close();
+ virtual void open();
+ virtual QString getOutputPath() const;
+ virtual void changeOutputPath(const QString & outputpath);
+ virtual KIO::Job* moveDataFiles(const QString & ndir);
+ virtual void moveDataFilesCompleted(KIO::Job* job);
+ virtual void preallocateDiskSpace(PreallocationThread* prealloc);
+ virtual bool hasMissingFiles(QStringList & sl);
+ virtual void deleteDataFiles();
+ virtual Uint64 diskUsage();
+ private:
+ void touch(TorrentFile & tf);
+ virtual void downloadStatusChanged(TorrentFile*, bool);
+ QString guessDataDir();
+ void saveFirstAndLastChunk(TorrentFile* tf,const QString & src_file,const QString & dst_file);
+ void recreateFile(TorrentFile* tf,const QString & dnd_file,const QString & output_file);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/newchokealgorithm.cpp b/libktorrent/torrent/newchokealgorithm.cpp
new file mode 100644
index 0000000..875f356
--- /dev/null
+++ b/libktorrent/torrent/newchokealgorithm.cpp
@@ -0,0 +1,345 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#if 0
+#include <util/log.h>
+#include <util/timer.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include <interfaces/functions.h>
+#include "newchokealgorithm.h"
+#include "peermanager.h"
+#include "peer.h"
+#include "packetwriter.h"
+#include "peeruploader.h"
+
+
+using namespace kt;
+
+namespace bt
+{
+
+
+
+ NewChokeAlgorithm::NewChokeAlgorithm(): ChokeAlgorithm()
+ {
+ round_state = 1;
+ }
+
+
+ NewChokeAlgorithm::~NewChokeAlgorithm()
+ {}
+
+ int RevDownloadRateCmp(Peer* a,Peer* b)
+ {
+ if (b->getDownloadRate() > a->getDownloadRate())
+ return 1;
+ else if (a->getDownloadRate() > b->getDownloadRate())
+ return -1;
+ else
+ return 0;
+ }
+
+ void NewChokeAlgorithm::doChokingLeechingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats)
+ {
+ Uint32 num_peers = pman.getNumConnectedPeers();
+ if (num_peers == 0)
+ return;
+
+ Uint32 now = GetCurrentTime();
+ Peer* poup = pman.findPeer(opt_unchoked_peer_id);
+ Peer* unchokers[] = {0,0,0,0};
+
+ // first find the planned optimistic unchoked peer if we are in the correct round
+ if (round_state == 1 || poup == 0)
+ {
+ opt_unchoked_peer_id = findPlannedOptimisticUnchokedPeer(pman);
+ poup = pman.findPeer(opt_unchoked_peer_id);
+ }
+
+ PeerPtrList peers,other;
+ // now get all the peers who are interested and have sent us a piece in the
+ // last 30 seconds
+ for (Uint32 i = 0;i < num_peers;i++)
+ {
+ Peer* p = pman.getPeer(i);
+ if (!p)
+ continue;
+
+ if (!p->isSeeder())
+ {
+ if (p->isInterested() && now - p->getTimeSinceLastPiece() <= 30000)
+ peers.append(p);
+ else
+ other.append(p);
+ }
+ else
+ {
+ p->choke();
+ }
+ }
+
+ // sort them using a reverse download rate compare
+ // so that the fastest downloaders are in front
+ peers.setCompareFunc(RevDownloadRateCmp);
+ peers.sort();
+ other.setCompareFunc(RevDownloadRateCmp);
+ other.sort();
+
+ // get the first tree and punt them in the unchokers
+ for (Uint32 i = 0;i < 3;i++)
+ {
+ if (i < peers.count())
+ {
+ unchokers[i] = peers.at(i);
+ }
+ }
+
+ // see if poup if part of the first 3
+ // and if necessary replace it
+ bool poup_in_unchokers = false;
+ Uint32 attempts = 0;
+ do
+ {
+ poup_in_unchokers = false;
+ for (Uint32 i = 0;i < 3;i++)
+ {
+ if (unchokers[i] != poup)
+ continue;
+
+ opt_unchoked_peer_id = findPlannedOptimisticUnchokedPeer(pman);
+ poup = pman.findPeer(opt_unchoked_peer_id);
+ poup_in_unchokers = true;
+ break;
+ }
+ // we don't want to keep trying this forever, so limit it to 5 atttempts
+ attempts++;
+ }while (poup_in_unchokers && attempts < 5);
+
+ unchokers[3] = poup;
+
+ Uint32 other_idx = 0;
+ Uint32 peers_idx = 3;
+ // unchoke the 4 unchokers
+ for (Uint32 i = 0;i < 4;i++)
+ {
+ if (!unchokers[i])
+ {
+ // pick some other peer to unchoke
+ unchokers[i] = peers.at(peers_idx++);
+ if (unchokers[i] == poup) // it must not be equal to the poup
+ unchokers[i] = peers.at(peers_idx++);
+
+ // nobody in the peers list, try the others list
+ if (!unchokers[i])
+ unchokers[i] = other.at(other_idx++);
+ }
+
+ if (unchokers[i])
+ unchokers[i]->getPacketWriter().sendUnchoke();
+ }
+
+ // choke the rest
+ for (Uint32 i = 0;i < num_peers;i++)
+ {
+ Peer* p = pman.getPeer(i);
+ if (p == unchokers[0] || p == unchokers[1] || p == unchokers[2] || p == unchokers[3])
+ continue;
+ if (p)
+ p->choke();
+ }
+
+ round_state++;
+ if (round_state > 3)
+ round_state = 1;
+ }
+
+ Uint32 NewChokeAlgorithm::findPlannedOptimisticUnchokedPeer(PeerManager& pman)
+ {
+ Uint32 num_peers = pman.getNumConnectedPeers();
+ if (num_peers == 0)
+ return UNDEFINED_ID;
+
+ // find a random peer that is choked and interested
+ Uint32 start = rand() % num_peers;
+ Uint32 i = (start + 1) % num_peers;
+ while (i != start)
+ {
+ Peer* p = pman.getPeer(i);
+ if (p && p->isChoked() && p->isInterested() && !p->isSeeder())
+ return p->getID();
+ i = (i + 1) % num_peers;
+ }
+
+ // we do not expect to have 4 billion peers
+ return 0xFFFFFFFF;
+ }
+
+ //////////////////////////////////////////////
+
+ int NChokeCmp(Peer* a,Peer* b)
+ {
+ Uint32 now = GetCurrentTime();
+ // if they have pending upload requests or they were unchoked in the last 20 seconds,
+ // they are category 1
+ bool a_first_class = a->getPeerUploader()->getNumRequests() > 0 ||
+ (now - a->getUnchokeTime() <= 20000);
+ bool b_first_class = b->getPeerUploader()->getNumRequests() > 0 ||
+ (now - b->getUnchokeTime() <= 20000);
+
+ if (a_first_class && !b_first_class)
+ {
+ // category 1 come first
+ return -1;
+ }
+ else if (!a_first_class && b_first_class)
+ {
+ // category 1 come first
+ return 1;
+ }
+ else
+ {
+ // use upload rate to differentiate peers of the same class
+ if (a->getUploadRate() > b->getUploadRate())
+ return -1;
+ else if (b->getUploadRate() > a->getUploadRate())
+ return 1;
+ else
+ return 0;
+ }
+ }
+
+
+ void NewChokeAlgorithm::doChokingSeedingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats)
+ {
+ Uint32 num_peers = pman.getNumConnectedPeers();
+ if (num_peers == 0)
+ return;
+
+ // first get all unchoked and interested peers
+ PeerPtrList peers,others;
+ for (Uint32 i = 0;i < num_peers;i++)
+ {
+ Peer* p = pman.getPeer(i);
+ if (!p)
+ continue;
+
+ if (!p->isSeeder())
+ {
+ if (!p->isChoked() && p->isInterested())
+ peers.append(p);
+ else
+ others.append(p);
+ }
+ else
+ {
+ p->choke();
+ }
+ }
+
+ // sort them
+ peers.setCompareFunc(NChokeCmp);
+ peers.sort();
+ others.setCompareFunc(NChokeCmp);
+ others.sort();
+
+ // first round so take the 4 first peers
+ if (round_state == 1)
+ {
+ Uint32 num_unchoked = 0;
+ for (Uint32 i = 0;i < peers.count();i++)
+ {
+ Peer* p = peers.at(i);
+ if (!p)
+ continue;
+
+ if (num_unchoked < 4)
+ {
+ p->getPacketWriter().sendUnchoke();
+ num_unchoked++;
+ }
+ else
+ p->choke();
+ }
+ // go over the other peers and unchoke, if we do not have enough
+ for (Uint32 i = 0;i < others.count();i++)
+ {
+ Peer* p = others.at(i);
+ if (!p)
+ continue;
+
+ if (num_unchoked < 4)
+ {
+ p->getPacketWriter().sendUnchoke();
+ num_unchoked++;
+ }
+ else
+ p->choke();
+ }
+ }
+ else
+ {
+ Uint32 rnd = 0;
+ if (peers.count() > 3)
+ rnd = 3 + rand() % (peers.count() - 3);
+
+ Uint32 num_unchoked = 0;
+ // take the first 3 and a random one
+ for (Uint32 i = 0;i < peers.count();i++)
+ {
+ Peer* p = peers.at(i);
+ if (!p)
+ continue;
+
+ if (num_unchoked < 4 || i == rnd)
+ {
+ p->getPacketWriter().sendUnchoke();
+ num_unchoked++;
+ }
+ else
+ p->choke();
+ }
+
+ // go over the other peers and unchoke, if we do not have enough
+ for (Uint32 i = 0;i < others.count();i++)
+ {
+ Peer* p = others.at(i);
+ if (!p)
+ continue;
+
+ if (num_unchoked < 4 || i == rnd)
+ {
+ p->getPacketWriter().sendUnchoke();
+ num_unchoked++;
+ }
+ else
+ p->choke();
+ }
+ }
+
+ round_state++;
+ if (round_state > 3)
+ round_state = 1;
+ }
+
+
+
+}
+#endif
+
diff --git a/libktorrent/torrent/newchokealgorithm.h b/libktorrent/torrent/newchokealgorithm.h
new file mode 100644
index 0000000..9a0738a
--- /dev/null
+++ b/libktorrent/torrent/newchokealgorithm.h
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#if 0
+#ifndef BTNEWCHOKEALGORITHM_H
+#define BTNEWCHOKEALGORITHM_H
+
+#include <choker.h>
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ *
+ * The new choking algorithm.
+ */
+ class NewChokeAlgorithm : public ChokeAlgorithm
+ {
+ Uint32 round_state;
+ public:
+ NewChokeAlgorithm();
+ virtual ~NewChokeAlgorithm();
+
+ virtual void doChokingLeechingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats);
+ virtual void doChokingSeedingState(PeerManager & pman,ChunkManager & cman,const kt::TorrentStats & stats);
+ private:
+ void doChokingLeecherState(PeerManager& pman);
+ void doChokingSeederState(PeerManager& pman);
+
+ Uint32 findPlannedOptimisticUnchokedPeer(PeerManager& pman);
+ };
+
+}
+
+#endif
+#endif
+
diff --git a/libktorrent/torrent/oldchokealgorithm.cpp b/libktorrent/torrent/oldchokealgorithm.cpp
new file mode 100644
index 0000000..e24d63a
--- /dev/null
+++ b/libktorrent/torrent/oldchokealgorithm.cpp
@@ -0,0 +1,223 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <interfaces/functions.h>
+#include "oldchokealgorithm.h"
+#include "peer.h"
+#include "packetwriter.h"
+#include "peermanager.h"
+
+
+using namespace kt;
+
+namespace bt
+{
+ int UploadRateCmp(Peer* pa,Peer* pb)
+ {
+ return CompareVal(pa->getUploadRate(),pb->getUploadRate());
+ }
+
+ int DownloadRateCmp(Peer* pa,Peer* pb)
+ {
+ return CompareVal(pa->getDownloadRate(),pb->getDownloadRate());
+ }
+
+
+ OldChokeAlgorithm::OldChokeAlgorithm(): ChokeAlgorithm()
+ {
+ opt_unchoke_index = 0;
+ opt_unchoke = 1;
+ }
+
+
+ OldChokeAlgorithm::~OldChokeAlgorithm()
+ {}
+
+
+ void OldChokeAlgorithm::doChoking(PeerManager& pman, bool have_all)
+ {
+ if (pman.getNumConnectedPeers() == 0)
+ return;
+
+ downloaders.clear();
+ interested.clear();
+ not_interested.clear();
+
+ // first alert everybody that we're interested or not
+ sendInterested(pman,have_all);
+ // get who is interested and not
+ updateInterested(pman);
+ // them sort them;
+ if (have_all)
+ {
+ interested.setCompareFunc(DownloadRateCmp);
+ interested.sort();
+ not_interested.setCompareFunc(DownloadRateCmp);
+ not_interested.sort();
+ }
+ else
+ {
+ interested.setCompareFunc(UploadRateCmp);
+ interested.sort();
+ not_interested.setCompareFunc(UploadRateCmp);
+ not_interested.sort();
+ }
+ // determine the downloaders
+ updateDownloaders();
+ // unchoke the not_interested peers
+ // which have a faster upload rate then the downloaders
+ sendUnchokes(have_all);
+ // optimisticly unchoke somebody
+ optimisticUnchoke(pman);
+ }
+
+ void OldChokeAlgorithm::updateInterested(PeerManager& pman)
+ {
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();i++)
+ {
+ Peer* p = pman.getPeer(i);
+
+ if (p->getID() == opt_unchoked_peer_id)
+ continue;
+
+ if (p->isInterested())
+ {
+ interested.append(p);
+ }
+ else
+ {
+ not_interested.append(p);
+ }
+ }
+ }
+
+ void OldChokeAlgorithm::updateDownloaders()
+ {
+ QPtrList<Peer>::iterator itr = interested.begin();
+ int num = 0;
+ // send all downloaders an unchoke
+ for (;itr != interested.end();itr++)
+ {
+ Peer* p = *itr;
+
+ if (p->getID() == opt_unchoked_peer_id)
+ continue;
+
+ if (num < 4)
+ {
+ p->choke();
+ downloaders.append(p);
+ num++;
+ }
+ else
+ {
+ p->choke();
+ }
+ }
+ }
+
+ void OldChokeAlgorithm::sendInterested(PeerManager& pman,bool have_all)
+ {
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();i++)
+ {
+ Peer* p = pman.getPeer(i);
+ PacketWriter & pout = p->getPacketWriter();
+ // if we don't have the entire file, send an intereseted message,
+ // else we're not intereseted
+ if (have_all && p->areWeInterested())
+ pout.sendNotInterested();
+ else if (!have_all && !p->areWeInterested())
+ pout.sendInterested();
+ }
+ }
+
+ void OldChokeAlgorithm::sendUnchokes(bool have_all)
+ {
+ if (downloaders.count() == 0)
+ return;
+
+ QPtrList<Peer>::iterator itr = not_interested.begin();
+ // fd = fastest_downloader
+ Peer* fd = downloaders.first();
+ // send all downloaders an unchoke
+ for (;itr != not_interested.end();itr++)
+ {
+ Peer* p = *itr;
+ if (p->getID() == opt_unchoked_peer_id)
+ continue;
+
+ if ((have_all && p->getDownloadRate() > fd->getDownloadRate()) ||
+ (!have_all && p->getUploadRate() > fd->getUploadRate()))
+ {
+ p->getPacketWriter().sendUnchoke();
+ }
+ else
+ {
+ p->getPacketWriter().sendChoke();
+ }
+ }
+ }
+
+ void OldChokeAlgorithm::optimisticUnchoke(PeerManager& pman)
+ {
+ if (pman.getNumConnectedPeers() == 0)
+ return;
+
+ // only switch optimistic unchoked peer every 30 seconds
+ // (update interval of choker is 10 seconds)
+ if (opt_unchoke != 3)
+ {
+ opt_unchoke++;
+ return;
+ }
+
+ // Get current time
+ QTime now = QTime::currentTime();
+ QPtrList<Peer> peers; // list to store peers to select from
+
+ // recently connected peers == peers connected in the last 5 minutes
+ const int RECENTLY_CONNECT_THRESH = 5*60;
+
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();i++)
+ {
+ Peer* p = pman.getPeer(i);
+ if (p->getConnectTime().secsTo(now) < RECENTLY_CONNECT_THRESH)
+ {
+ // we favor recently connected peers 3 times over other peers
+ // so we add them 3 times to the list
+ peers.append(p);
+ peers.append(p);
+ peers.append(p);
+ }
+ else
+ {
+ // not recent, so just add one time
+ peers.append(p);
+ }
+ }
+
+ // draw a random one from the list and send it an unchoke
+ opt_unchoke_index = rand() % peers.count();
+ Peer* lucky_one = peers.at(opt_unchoke_index);
+ lucky_one->getPacketWriter().sendUnchoke();
+ opt_unchoked_peer_id = lucky_one->getID();
+ opt_unchoke = 1;
+ }
+
+}
diff --git a/libktorrent/torrent/oldchokealgorithm.h b/libktorrent/torrent/oldchokealgorithm.h
new file mode 100644
index 0000000..bc813a8
--- /dev/null
+++ b/libktorrent/torrent/oldchokealgorithm.h
@@ -0,0 +1,54 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTOLDCHOKEALGORITHM_H
+#define BTOLDCHOKEALGORITHM_H
+
+#include <choker.h>
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ *
+ * The old choking algorithm as it is described on wiki.theory.org.
+ */
+ class OldChokeAlgorithm : public ChokeAlgorithm
+ {
+ int opt_unchoke_index;
+ int opt_unchoke;
+
+ PeerPtrList downloaders,interested,not_interested;
+ public:
+ OldChokeAlgorithm();
+ virtual ~OldChokeAlgorithm();
+
+ virtual void doChoking(PeerManager& pman, bool have_all);
+ private:
+ void updateInterested(PeerManager& pman);
+ void updateDownloaders();
+ void sendInterested(PeerManager& pman,bool have_all);
+ void sendUnchokes(bool have_all);
+ void optimisticUnchoke(PeerManager& pman);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/packet.cpp b/libktorrent/torrent/packet.cpp
new file mode 100644
index 0000000..febede2
--- /dev/null
+++ b/libktorrent/torrent/packet.cpp
@@ -0,0 +1,175 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qstring.h>
+#include <string.h>
+#include <util/log.h>
+#include <util/bitset.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include "packet.h"
+#include "request.h"
+#include "chunk.h"
+#include "peer.h"
+
+namespace bt
+{
+
+ static Uint8* AllocPacket(Uint32 size,Uint8 type)
+ {
+ Uint8* data = new Uint8[size];
+ WriteUint32(data,0,size - 4);
+ data[4] = type;
+ return data;
+ }
+
+
+ Packet::Packet(Uint8 type) : data(0),size(0),written(0)
+ {
+ size = 5;
+ data = AllocPacket(size,type);
+ }
+
+ Packet::Packet(Uint16 port) : data(0),size(0),written(0)
+ {
+ size = 7;
+ data = AllocPacket(size,PORT);
+ WriteUint16(data,5,port);
+
+ }
+
+ Packet::Packet(Uint32 chunk,Uint8 type) : data(0),size(0),written(0)
+ {
+ size = 9;
+ data = AllocPacket(size,type);
+ WriteUint32(data,5,chunk);
+ }
+
+ Packet::Packet(const BitSet & bs) : data(0),size(0),written(0)
+ {
+ size = 5 + bs.getNumBytes();
+ data = AllocPacket(size,BITFIELD);
+ memcpy(data+5,bs.getData(),bs.getNumBytes());
+ }
+
+ Packet::Packet(const Request & r,Uint8 type) : data(0),size(0),written(0)
+ {
+ size = 17;
+ data = AllocPacket(size,type);
+ WriteUint32(data,5,r.getIndex());
+ WriteUint32(data,9,r.getOffset());
+ WriteUint32(data,13,r.getLength());
+ }
+
+ Packet::Packet(Uint32 index,Uint32 begin,Uint32 len,Chunk* ch) : data(0),size(0),written(0)
+ {
+ size = 13 + len;
+ data = AllocPacket(size,PIECE);
+ WriteUint32(data,5,index);
+ WriteUint32(data,9,begin);
+ memcpy(data+13,ch->getData() + begin,len);
+ }
+
+ Packet::Packet(Uint8 ext_id,const QByteArray & ext_data) : data(0),size(0),written(0)
+ {
+ size = 6 + ext_data.size();
+ data = AllocPacket(size,EXTENDED);
+ data[5] = ext_id;
+ memcpy(data + 6,ext_data.data(),ext_data.size());
+ }
+
+ Packet::~Packet()
+ {
+ delete [] data;
+ }
+
+ bool Packet::isPiece(const Request & req) const
+ {
+ if (data[4] == PIECE)
+ {
+ if (ReadUint32(data,5) != req.getIndex())
+ return false;
+
+ if (ReadUint32(data,9) != req.getOffset())
+ return false;
+
+ if (ReadUint32(data,13) != req.getLength())
+ return false;
+
+ return true;
+ }
+ return false;
+ }
+
+ Packet* Packet::makeRejectOfPiece()
+ {
+ if (getType() != PIECE)
+ return 0;
+
+ Uint32 idx = bt::ReadUint32(data,5);
+ Uint32 off = bt::ReadUint32(data,9);
+ Uint32 len = size - 13;
+
+ // Out(SYS_CON|LOG_DEBUG) << "Packet::makeRejectOfPiece " << idx << " " << off << " " << len << endl;
+ return new Packet(Request(idx,off,len,0),bt::REJECT_REQUEST);
+ }
+
+ /*
+ QString Packet::debugString() const
+ {
+ if (!data)
+ return QString::null;
+
+ switch (data[4])
+ {
+ case CHOKE : return QString("CHOKE %1 %2").arg(hdr_length).arg(data_length);
+ case UNCHOKE : return QString("UNCHOKE %1 %2").arg(hdr_length).arg(data_length);
+ case INTERESTED : return QString("INTERESTED %1 %2").arg(hdr_length).arg(data_length);
+ case NOT_INTERESTED : return QString("NOT_INTERESTED %1 %2").arg(hdr_length).arg(data_length);
+ case HAVE : return QString("HAVE %1 %2").arg(hdr_length).arg(data_length);
+ case BITFIELD : return QString("BITFIELD %1 %2").arg(hdr_length).arg(data_length);
+ case PIECE : return QString("PIECE %1 %2").arg(hdr_length).arg(data_length);
+ case REQUEST : return QString("REQUEST %1 %2").arg(hdr_length).arg(data_length);
+ case CANCEL : return QString("CANCEL %1 %2").arg(hdr_length).arg(data_length);
+ default: return QString("UNKNOWN %1 %2").arg(hdr_length).arg(data_length);
+ }
+ }
+ */
+ bool Packet::isOK() const
+ {
+ if (!data)
+ return false;
+
+ return true;
+ }
+
+ Uint32 Packet::putInOutputBuffer(Uint8* buf,Uint32 max_to_put,bool & piece)
+ {
+ piece = data[4] == PIECE;
+ Uint32 bw = size - written;
+ if (!bw) // nothing to write
+ return 0;
+
+ if (bw > max_to_put)
+ bw = max_to_put;
+ memcpy(buf,data + written,bw);
+ written += bw;
+ return bw;
+ }
+}
diff --git a/libktorrent/torrent/packet.h b/libktorrent/torrent/packet.h
new file mode 100644
index 0000000..9259d31
--- /dev/null
+++ b/libktorrent/torrent/packet.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPACKET_H
+#define BTPACKET_H
+
+#include "globals.h"
+
+class QString;
+
+namespace bt
+{
+ class BitSet;
+ class Request;
+ class Chunk;
+ class Peer;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Packet off data, which gets sent to a Peer
+ */
+ class Packet
+ {
+ Uint8* data;
+ Uint32 size;
+ Uint32 written;
+ public:
+ Packet(Uint8 type);
+ Packet(Uint16 port);
+ Packet(Uint32 chunk,Uint8 type);
+ Packet(const BitSet & bs);
+ Packet(const Request & req,Uint8 type);
+ Packet(Uint32 index,Uint32 begin,Uint32 len,Chunk* ch);
+ Packet(Uint8 ext_id,const QByteArray & ext_data); // extension protocol packet
+ virtual ~Packet();
+
+ Uint8 getType() const {return data ? data[4] : 0;}
+
+ bool isOK() const;
+
+ const Uint8* getData() const {return data;}
+ Uint32 getDataLength() const {return size;}
+
+ Uint32 isSent() const {return written == size;}
+
+ /**
+ * If this packet is a piece, make a reject for it.
+ * @return The newly created Packet, 0 if this is not a piece
+ */
+ Packet* makeRejectOfPiece();
+
+ /// Are we sending this packet ?
+ bool sending() const {return written > 0;}
+
+ /**
+ * Is this a piece packet which matches a request
+ * @param req The request
+ * @return If this is a piece in response of this request
+ */
+ bool isPiece(const Request & req) const;
+
+ /**
+ * Put the packet in an output buffer.
+ * @param buf The buffer
+ * @param max_to_put Maximum bytes to put
+ * @param piece Set to true if this is a piece
+ * @return The number of bytes put in the buffer
+ */
+ Uint32 putInOutputBuffer(Uint8* buf,Uint32 max_to_put,bool & piece);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/packetreader.cpp b/libktorrent/torrent/packetreader.cpp
new file mode 100644
index 0000000..8df348b
--- /dev/null
+++ b/libktorrent/torrent/packetreader.cpp
@@ -0,0 +1,247 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+//#define LOG_PACKET
+#ifdef LOG_PACKET
+#include <sys/types.h>
+#include <unistd.h>
+#endif
+
+#include <util/log.h>
+#include <util/file.h>
+#include <util/functions.h>
+#include "packetreader.h"
+#include "peer.h"
+
+
+namespace bt
+{
+#ifdef LOG_PACKET
+ static void LogPacket(const Uint8* data,Uint32 size,Uint32 len)
+ {
+ QString file = QString("/tmp/kt-packetreader-%1.log").arg(getpid());
+ File fptr;
+ if (!fptr.open(file,"a"))
+ return;
+
+
+ QString tmp = QString("PACKET len = %1, type = %2\nDATA: \n").arg(len).arg(data[0]);
+
+ fptr.write(tmp.ascii(),tmp.length());
+
+ Uint32 j = 0;
+ if (size <= 40)
+ {
+ for (Uint32 i = 0;i < size;i++)
+ {
+ tmp = QString("0x%1 ").arg(data[i],0,16);
+ fptr.write(tmp.ascii(),tmp.length());
+ j++;
+ if (j > 10)
+ {
+ fptr.write("\n",1);
+ j = 0;
+ }
+ }
+ }
+ else
+ {
+ for (Uint32 i = 0;i < 20;i++)
+ {
+ tmp = QString("0x%1 ").arg(data[i],0,16);
+ fptr.write(tmp.ascii(),tmp.length());
+ j++;
+ if (j > 10)
+ {
+ fptr.write("\n",1);
+ j = 0;
+ }
+ }
+ tmp = QString("\n ... \n");
+ fptr.write(tmp.ascii(),tmp.length());
+ for (Uint32 i = size - 20;i < size;i++)
+ {
+ tmp = QString("0x%1 ").arg(data[i],0,16);
+ fptr.write(tmp.ascii(),tmp.length());
+ j++;
+ if (j > 10)
+ {
+ fptr.write("\n",1);
+ j = 0;
+ }
+ }
+ }
+ fptr.write("\n",1);
+ }
+#endif
+
+ IncomingPacket::IncomingPacket(Uint32 size) : data(0),size(size),read(0)
+ {
+ data = new Uint8[size];
+ }
+
+ IncomingPacket::~IncomingPacket()
+ {
+ delete [] data;
+ }
+
+ PacketReader::PacketReader(Peer* peer)
+ : peer(peer),error(false)
+ {
+ packet_queue.setAutoDelete(true);
+ len_received = -1;
+ }
+
+
+ PacketReader::~PacketReader()
+ {
+ }
+
+
+ void PacketReader::update()
+ {
+ if (error)
+ return;
+
+ mutex.lock();
+ // pass packets to peer
+ while (packet_queue.count() > 0)
+ {
+ IncomingPacket* pck = packet_queue.first();
+ if (pck->read == pck->size)
+ {
+ // full packet is read pass it to peer
+ peer->packetReady(pck->data,pck->size);
+ packet_queue.removeFirst();
+ }
+ else
+ {
+ // packet is not yet full, break out of loop
+ break;
+ }
+ }
+ mutex.unlock();
+ }
+
+ Uint32 PacketReader::newPacket(Uint8* buf,Uint32 size)
+ {
+ Uint32 packet_length = 0;
+ Uint32 am_of_len_read = 0;
+ if (len_received > 0)
+ {
+ if (size < 4 - len_received)
+ {
+ memcpy(len + len_received,buf,size);
+ len_received += size;
+ return size;
+ }
+ else
+ {
+ memcpy(len + len_received,buf,4 - len_received);
+ am_of_len_read = 4 - len_received;
+ len_received = 0;
+ packet_length = ReadUint32(len,0);
+
+ }
+ }
+ else if (size < 4)
+ {
+ memcpy(len,buf,size);
+ len_received = size;
+ return size;
+ }
+ else
+ {
+ packet_length = ReadUint32(buf,0);
+ am_of_len_read = 4;
+ }
+
+ if (packet_length == 0)
+ return am_of_len_read;
+
+ if (packet_length > MAX_PIECE_LEN + 13)
+ {
+ Out(SYS_CON|LOG_DEBUG) << " packet_length too large " << packet_length << endl;
+
+ error = true;
+ return size;
+ }
+
+ IncomingPacket* pck = new IncomingPacket(packet_length);
+ packet_queue.append(pck);
+ return am_of_len_read + readPacket(buf + am_of_len_read,size - am_of_len_read);
+ }
+
+ Uint32 PacketReader::readPacket(Uint8* buf,Uint32 size)
+ {
+ if (!size)
+ return 0;
+
+ IncomingPacket* pck = packet_queue.last();
+ if (pck->read + size >= pck->size)
+ {
+ // we can read the full packet
+ Uint32 tr = pck->size - pck->read;
+ memcpy(pck->data + pck->read,buf,tr);
+ pck->read += tr;
+ return tr;
+ }
+ else
+ {
+ // we can do a partial read
+ Uint32 tr = size;
+ memcpy(pck->data + pck->read,buf,tr);
+ pck->read += tr;
+ return tr;
+ }
+ }
+
+
+ void PacketReader::onDataReady(Uint8* buf,Uint32 size)
+ {
+ if (error)
+ return;
+
+ mutex.lock();
+ if (packet_queue.count() == 0)
+ {
+ Uint32 ret = 0;
+ while (ret < size && !error)
+ {
+ ret += newPacket(buf + ret,size - ret);
+ }
+ }
+ else
+ {
+ Uint32 ret = 0;
+ IncomingPacket* pck = packet_queue.last();
+ if (pck->read == pck->size) // last packet in queue is fully read
+ ret = newPacket(buf,size);
+ else
+ ret = readPacket(buf,size);
+
+ while (ret < size && !error)
+ {
+ ret += newPacket(buf + ret,size - ret);
+ }
+ }
+ mutex.unlock();
+ }
+}
diff --git a/libktorrent/torrent/packetreader.h b/libktorrent/torrent/packetreader.h
new file mode 100644
index 0000000..da1e03e
--- /dev/null
+++ b/libktorrent/torrent/packetreader.h
@@ -0,0 +1,68 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPACKETREADER_H
+#define BTPACKETREADER_H
+
+#include <qmutex.h>
+#include <qptrlist.h>
+#include <net/bufferedsocket.h>
+#include "globals.h"
+
+namespace bt
+{
+ class Peer;
+
+ struct IncomingPacket
+ {
+ Uint8* data;
+ Uint32 size;
+ Uint32 read;
+
+ IncomingPacket(Uint32 size);
+ virtual ~IncomingPacket();
+ };
+
+ /**
+ @author Joris Guisson
+ */
+ class PacketReader : public net::SocketReader
+ {
+ Peer* peer;
+ bool error;
+ QPtrList<IncomingPacket> packet_queue;
+ QMutex mutex;
+ Uint8 len[4];
+ int len_received;
+ public:
+ PacketReader(Peer* peer);
+ virtual ~PacketReader();
+
+ void update();
+ bool ok() const {return !error;}
+ private:
+ Uint32 newPacket(Uint8* buf,Uint32 size);
+ Uint32 readPacket(Uint8* buf,Uint32 size);
+ virtual void onDataReady(Uint8* buf,Uint32 size);
+
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/packetwriter.cpp b/libktorrent/torrent/packetwriter.cpp
new file mode 100644
index 0000000..888d23d
--- /dev/null
+++ b/libktorrent/torrent/packetwriter.cpp
@@ -0,0 +1,399 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+//#define LOG_PACKET
+
+#include <util/log.h>
+#include <util/file.h>
+#include <util/functions.h>
+#include <net/socketmonitor.h>
+#include <ktversion.h>
+#include "packetwriter.h"
+#include "peer.h"
+#include "request.h"
+#include "chunk.h"
+#include <util/bitset.h>
+#include "packet.h"
+#include "uploadcap.h"
+#include <util/log.h>
+#include "globals.h"
+#include "bencoder.h"
+
+
+
+namespace bt
+{
+
+
+ PacketWriter::PacketWriter(Peer* peer) : peer(peer),mutex(true) // this is a recursive mutex
+ {
+ uploaded = 0;
+ uploaded_non_data = 0;
+ curr_packet = 0;
+ ctrl_packets_sent = 0;
+ }
+
+
+ PacketWriter::~PacketWriter()
+ {
+ std::list<Packet*>::iterator i = data_packets.begin();
+ while (i != data_packets.end())
+ {
+ Packet* p = *i;
+ delete p;
+ i++;
+ }
+
+ i = control_packets.begin();
+ while (i != control_packets.end())
+ {
+ Packet* p = *i;
+ delete p;
+ i++;
+ }
+ }
+
+ void PacketWriter::queuePacket(Packet* p)
+ {
+ QMutexLocker locker(&mutex);
+ if (p->getType() == PIECE)
+ data_packets.push_back(p);
+ else
+ control_packets.push_back(p);
+ // tell upload thread we have data ready should it be sleeping
+ net::SocketMonitor::instance().signalPacketReady();
+ }
+
+
+
+ void PacketWriter::sendChoke()
+ {
+ if (peer->am_choked == true)
+ return;
+
+ queuePacket(new Packet(CHOKE));
+ peer->am_choked = true;
+ peer->stats.has_upload_slot = false;
+ }
+
+ void PacketWriter::sendUnchoke()
+ {
+ if (peer->am_choked == false)
+ return;
+
+ queuePacket(new Packet(UNCHOKE));
+ peer->am_choked = false;
+ peer->stats.has_upload_slot = true;
+ }
+
+ void PacketWriter::sendEvilUnchoke()
+ {
+ queuePacket(new Packet(UNCHOKE));
+ peer->am_choked = true;
+ peer->stats.has_upload_slot = false;
+ }
+
+ void PacketWriter::sendInterested()
+ {
+ if (peer->am_interested == true)
+ return;
+
+ queuePacket(new Packet(INTERESTED));
+ peer->am_interested = true;
+ }
+
+ void PacketWriter::sendNotInterested()
+ {
+ if (peer->am_interested == false)
+ return;
+
+ queuePacket(new Packet(NOT_INTERESTED));
+ peer->am_interested = false;
+ }
+
+ void PacketWriter::sendRequest(const Request & r)
+ {
+ queuePacket(new Packet(r,bt::REQUEST));
+ }
+
+ void PacketWriter::sendCancel(const Request & r)
+ {
+ queuePacket(new Packet(r,bt::CANCEL));
+ }
+
+ void PacketWriter::sendReject(const Request & r)
+ {
+ queuePacket(new Packet(r,bt::REJECT_REQUEST));
+ }
+
+ void PacketWriter::sendHave(Uint32 index)
+ {
+ queuePacket(new Packet(index,bt::HAVE));
+ }
+
+ void PacketWriter::sendPort(Uint16 port)
+ {
+ queuePacket(new Packet(port));
+ }
+
+ void PacketWriter::sendBitSet(const BitSet & bs)
+ {
+ queuePacket(new Packet(bs));
+ }
+
+ void PacketWriter::sendHaveAll()
+ {
+ queuePacket(new Packet(bt::HAVE_ALL));
+ }
+
+ void PacketWriter::sendHaveNone()
+ {
+ queuePacket(new Packet(bt::HAVE_NONE));
+ }
+
+ void PacketWriter::sendSuggestPiece(Uint32 index)
+ {
+ queuePacket(new Packet(index,bt::SUGGEST_PIECE));
+ }
+
+ void PacketWriter::sendAllowedFast(Uint32 index)
+ {
+ queuePacket(new Packet(index,bt::ALLOWED_FAST));
+ }
+
+ bool PacketWriter::sendChunk(Uint32 index,Uint32 begin,Uint32 len,Chunk * ch)
+ {
+// Out() << "sendChunk " << index << " " << begin << " " << len << endl;
+ if (begin >= ch->getSize() || begin + len > ch->getSize())
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Warning : Illegal piece request" << endl;
+ Out(SYS_CON|LOG_NOTICE) << "\tChunk : index " << index << " size = " << ch->getSize() << endl;
+ Out(SYS_CON|LOG_NOTICE) << "\tPiece : begin = " << begin << " len = " << len << endl;
+ return false;
+ }
+ else if (!ch || ch->getData() == 0)
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Warning : attempted to upload an invalid chunk" << endl;
+ return false;
+ }
+ else
+ {
+ /* Out(SYS_CON|LOG_DEBUG) << QString("Uploading %1 %2 %3 %4 %5")
+ .arg(index).arg(begin).arg(len).arg((Q_ULLONG)ch,0,16).arg((Q_ULLONG)ch->getData(),0,16)
+ << endl;;
+ */
+ queuePacket(new Packet(index,begin,len,ch));
+ return true;
+ }
+ }
+
+ void PacketWriter::sendExtProtHandshake(Uint16 port,bool pex_on)
+ {
+ QByteArray arr;
+ BEncoder enc(new BEncoderBufferOutput(arr));
+ enc.beginDict();
+ enc.write("m");
+ // supported messages
+ enc.beginDict();
+ enc.write("ut_pex");enc.write((Uint32)(pex_on ? 1 : 0));
+ enc.end();
+ if (port > 0)
+ {
+ enc.write("p");
+ enc.write((Uint32)port);
+ }
+ enc.write("v"); enc.write(QString("KTorrent %1").arg(kt::VERSION_STRING));
+ enc.end();
+ sendExtProtMsg(0,arr);
+ }
+
+ void PacketWriter::sendExtProtMsg(Uint8 id,const QByteArray & data)
+ {
+ queuePacket(new Packet(id,data));
+ }
+
+ Packet* PacketWriter::selectPacket()
+ {
+ Packet* ret = 0;
+ // this function should ensure that between
+ // each data packet at least 3 control packets are sent
+ // so requests can get through
+
+ if (ctrl_packets_sent < 3)
+ {
+ // try to send another control packet
+ if (control_packets.size() > 0)
+ ret = control_packets.front();
+ else if (data_packets.size() > 0)
+ ret = data_packets.front();
+ }
+ else
+ {
+ if (data_packets.size() > 0)
+ {
+ ctrl_packets_sent = 0;
+ ret = data_packets.front();
+ }
+ else if (control_packets.size() > 0)
+ ret = control_packets.front();
+ }
+
+ return ret;
+ }
+
+ Uint32 PacketWriter::onReadyToWrite(Uint8* data,Uint32 max_to_write)
+ {
+ QMutexLocker locker(&mutex);
+
+ if (!curr_packet)
+ curr_packet = selectPacket();
+
+ Uint32 written = 0;
+ while (curr_packet && written < max_to_write)
+ {
+ Packet* p = curr_packet;
+ bool count_as_data = false;
+ Uint32 ret = p->putInOutputBuffer(data + written,max_to_write - written,count_as_data);
+ written += ret;
+ if (count_as_data)
+ uploaded += ret;
+ else
+ uploaded_non_data += ret;
+
+ if (p->isSent())
+ {
+ // packet sent, so remove it
+ if (p->getType() == PIECE)
+ {
+ // remove data packet
+ data_packets.pop_front();
+ delete p;
+ // reset ctrl_packets_sent so the next packet should be a ctrl packet
+ ctrl_packets_sent = 0;
+ curr_packet = selectPacket();
+ }
+ else
+ {
+ // remove control packet and select another one to send
+ control_packets.pop_front();
+ delete p;
+ ctrl_packets_sent++;
+ curr_packet = selectPacket();
+ }
+ }
+ else
+ {
+ // we can't send it fully, so break out of loop
+ break;
+ }
+ }
+
+ return written;
+ }
+
+ bool PacketWriter::hasBytesToWrite() const
+ {
+ return getNumPacketsToWrite() > 0;
+ }
+
+ Uint32 PacketWriter::getUploadedDataBytes() const
+ {
+ QMutexLocker locker(&mutex);
+ Uint32 ret = uploaded;
+ uploaded = 0;
+ return ret;
+ }
+
+ Uint32 PacketWriter::getUploadedNonDataBytes() const
+ {
+ QMutexLocker locker(&mutex);
+ Uint32 ret = uploaded_non_data;
+ uploaded_non_data = 0;
+ return ret;
+ }
+
+ Uint32 PacketWriter::getNumPacketsToWrite() const
+ {
+ QMutexLocker locker(&mutex);
+ return data_packets.size() + control_packets.size();
+ }
+
+ Uint32 PacketWriter::getNumDataPacketsToWrite() const
+ {
+ QMutexLocker locker(&mutex);
+ return data_packets.size();
+ }
+
+ void PacketWriter::doNotSendPiece(const Request & req,bool reject)
+ {
+ QMutexLocker locker(&mutex);
+ std::list<Packet*>::iterator i = data_packets.begin();
+ while (i != data_packets.end())
+ {
+ Packet* p = *i;
+ if (p->isPiece(req) && !p->sending())
+ {
+ // remove current item
+ if (curr_packet == p)
+ curr_packet = 0;
+
+ i = data_packets.erase(i);
+ if (reject)
+ {
+ // queue a reject packet
+ sendReject(req);
+ }
+ delete p;
+ }
+ else
+ {
+ i++;
+ }
+ }
+ }
+
+ void PacketWriter::clearPieces(bool reject)
+ {
+ QMutexLocker locker(&mutex);
+
+ std::list<Packet*>::iterator i = data_packets.begin();
+ while (i != data_packets.end())
+ {
+ Packet* p = *i;
+ if (p->getType() == bt::PIECE && !p->sending())
+ {
+ // remove current item
+ if (curr_packet == p)
+ curr_packet = 0;
+
+ if (reject)
+ {
+ queuePacket(p->makeRejectOfPiece());
+ }
+
+ i = data_packets.erase(i);
+ delete p;
+ }
+ else
+ {
+ i++;
+ }
+ }
+ }
+}
diff --git a/libktorrent/torrent/packetwriter.h b/libktorrent/torrent/packetwriter.h
new file mode 100644
index 0000000..9b77731
--- /dev/null
+++ b/libktorrent/torrent/packetwriter.h
@@ -0,0 +1,185 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPACKETWRITER_H
+#define BTPACKETWRITER_H
+
+#include <list>
+#include <qmutex.h>
+#include <net/bufferedsocket.h>
+#include "globals.h"
+
+namespace bt
+{
+ class Peer;
+ class Request;
+ class Chunk;
+ class BitSet;
+ class Packet;
+
+ /**
+ @author Joris Guisson
+ */
+ class PacketWriter : public net::SocketWriter
+ {
+ Peer* peer;
+ std::list<Packet*> control_packets;
+ std::list<Packet*> data_packets;
+ Packet* curr_packet;
+ Uint32 ctrl_packets_sent;
+ mutable Uint32 uploaded;
+ mutable Uint32 uploaded_non_data;
+ mutable QMutex mutex;
+ public:
+ PacketWriter(Peer* peer);
+ virtual ~PacketWriter();
+
+ /**
+ * Send a choke packet.
+ */
+ void sendChoke();
+
+ /**
+ * Send an unchoke packet.
+ */
+ void sendUnchoke();
+
+ /**
+ * Sends an unchoke message but doesn't update the am_choked field so KT still thinks
+ * it is choked (and will not upload to it), this is to punish snubbers.
+ */
+ void sendEvilUnchoke();
+
+ /**
+ * Send an interested packet.
+ */
+ void sendInterested();
+
+ /**
+ * Send a not interested packet.
+ */
+ void sendNotInterested();
+
+ /**
+ * Send a request for data.
+ * @param req The Request
+ */
+ void sendRequest(const Request & r);
+
+ /**
+ * Cancel a request.
+ * @param req The Request
+ */
+ void sendCancel(const Request & r);
+
+
+ /**
+ * Send a reject for a request
+ * @param req The Request
+ */
+ void sendReject(const Request & r);
+
+ /**
+ * Send a have packet.
+ * @param index
+ */
+ void sendHave(Uint32 index);
+
+ /**
+ * Send an allowed fast packet
+ * @param index
+ */
+ void sendAllowedFast(Uint32 index);
+
+ /**
+ * Send a chunk of data.
+ * @param index Index of chunk
+ * @param begin Offset into chunk
+ * @param len Length of data
+ * @param ch The Chunk
+ * @return true If we satisfy the request, false otherwise
+ */
+ bool sendChunk(Uint32 index,Uint32 begin,Uint32 len,Chunk * ch);
+
+ /**
+ * Send a BitSet. The BitSet indicates which chunks we have.
+ * @param bs The BitSet
+ */
+ void sendBitSet(const BitSet & bs);
+
+ /**
+ * Send a port message
+ * @param port The port
+ */
+ void sendPort(Uint16 port);
+
+ /// Send a have all message
+ void sendHaveAll();
+
+ /// Send a have none message
+ void sendHaveNone();
+
+ /**
+ * Send a suggest piece packet
+ * @param index Index of the chunk
+ */
+ void sendSuggestPiece(Uint32 index);
+
+ /// Send the extension protocol handshake
+ void sendExtProtHandshake(Uint16 port,bool pex_on = true);
+
+ /// Send an extended protocol message
+ void sendExtProtMsg(Uint8 id,const QByteArray & data);
+
+ /// Get the number of packets which need to be written
+ Uint32 getNumPacketsToWrite() const;
+
+ /// Get the number of data packets to write
+ Uint32 getNumDataPacketsToWrite() const;
+
+ /// Get the number of data bytes uploaded
+ Uint32 getUploadedDataBytes() const;
+
+ /// Get the number of bytes uploaded
+ Uint32 getUploadedNonDataBytes() const;
+
+ /**
+ * Do not send a piece which matches this request.
+ * But only if we are not allready sending the piece.
+ * @param req The request
+ * @param reject Wether we can send a reject instead
+ */
+ void doNotSendPiece(const Request & req,bool reject);
+
+ /**
+ * Clear all pieces we are not in the progress of sending.
+ * @param reject Send a reject packet
+ */
+ void clearPieces(bool reject);
+
+ private:
+ void queuePacket(Packet* p);
+ Packet* selectPacket();
+ virtual Uint32 onReadyToWrite(Uint8* data,Uint32 max_to_write);
+ virtual bool hasBytesToWrite() const;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/peer.cpp b/libktorrent/torrent/peer.cpp
new file mode 100644
index 0000000..7a5727b
--- /dev/null
+++ b/libktorrent/torrent/peer.cpp
@@ -0,0 +1,593 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <net/address.h>
+#include <mse/streamsocket.h>
+
+#include "peer.h"
+#include "chunk.h"
+#include "piece.h"
+#include "request.h"
+#include "packetreader.h"
+#include "packetwriter.h"
+#include "peerdownloader.h"
+#include "peeruploader.h"
+#include "bdecoder.h"
+#include "bnode.h"
+#include "utpex.h"
+#include "server.h"
+
+using namespace net;
+
+namespace bt
+{
+
+
+
+ static Uint32 peer_id_counter = 1;
+
+
+ Peer::Peer(mse::StreamSocket* sock,const PeerID & peer_id,
+ Uint32 num_chunks,Uint32 chunk_size,Uint32 support,bool local)
+ : sock(sock),pieces(num_chunks),peer_id(peer_id)
+ {
+ id = peer_id_counter;
+ peer_id_counter++;
+
+ ut_pex = 0;
+ preader = new PacketReader(this);
+ choked = am_choked = true;
+ interested = am_interested = false;
+ killed = false;
+ downloader = new PeerDownloader(this,chunk_size);
+ uploader = new PeerUploader(this);
+
+
+ pwriter = new PacketWriter(this);
+ time_choked = GetCurrentTime();
+ time_unchoked = 0;
+
+ connect_time = QTime::currentTime();
+ //sock->attachPeer(this);
+ stats.client = peer_id.identifyClient();
+ stats.ip_address = getIPAddresss();
+ stats.choked = true;
+ stats.download_rate = 0;
+ stats.upload_rate = 0;
+ stats.perc_of_file = 0;
+ stats.snubbed = false;
+ stats.dht_support = support & DHT_SUPPORT;
+ stats.fast_extensions = support & FAST_EXT_SUPPORT;
+ stats.extension_protocol = support & EXT_PROT_SUPPORT;
+ stats.bytes_downloaded = stats.bytes_uploaded = 0;
+ stats.aca_score = 0.0;
+ stats.evil = false;
+ stats.has_upload_slot = false;
+ stats.num_up_requests = stats.num_down_requests = 0;
+ stats.encrypted = sock->encrypted();
+ stats.local = local;
+ if (stats.ip_address == "0.0.0.0")
+ {
+ Out(SYS_CON|LOG_DEBUG) << "No more 0.0.0.0" << endl;
+ kill();
+ }
+ else
+ {
+ sock->startMonitoring(preader,pwriter);
+ }
+ pex_allowed = stats.extension_protocol;
+ utorrent_pex_id = 0;
+ }
+
+
+ Peer::~Peer()
+ {
+ delete ut_pex;
+ delete uploader;
+ delete downloader;
+ delete sock;
+ delete pwriter;
+ delete preader;
+ }
+
+ void Peer::closeConnection()
+ {
+ sock->close();
+ }
+
+
+ void Peer::kill()
+ {
+ sock->close();
+ killed = true;
+ }
+
+
+
+
+ void Peer::packetReady(const Uint8* packet,Uint32 len)
+ {
+ if (killed) return;
+
+ if (len == 0)
+ return;
+ const Uint8* tmp_buf = packet;
+ //Out() << "Got packet : " << len << " type = " << type << endl;
+ Uint8 type = tmp_buf[0];
+ switch (type)
+ {
+ case CHOKE:
+ if (len != 1)
+ {
+ Out() << "len err CHOKE" << endl;
+ kill();
+ return;
+ }
+
+ if (!choked)
+ {
+ time_choked = GetCurrentTime();
+ }
+ choked = true;
+ downloader->choked();
+ break;
+ case UNCHOKE:
+ if (len != 1)
+ {
+ Out() << "len err UNCHOKE" << endl;
+ kill();
+ return;
+ }
+
+ if (choked)
+ time_unchoked = GetCurrentTime();
+ choked = false;
+ break;
+ case INTERESTED:
+ if (len != 1)
+ {
+ Out() << "len err INTERESTED" << endl;
+ kill();
+ return;
+ }
+ if (!interested)
+ {
+ interested = true;
+ rerunChoker();
+ }
+ break;
+ case NOT_INTERESTED:
+ if (len != 1)
+ {
+ Out() << "len err NOT_INTERESTED" << endl;
+ kill();
+ return;
+ }
+ if (interested)
+ {
+ interested = false;
+ rerunChoker();
+ }
+ break;
+ case HAVE:
+ if (len != 5)
+ {
+ Out() << "len err HAVE" << endl;
+ kill();
+ }
+ else
+ {
+ Uint32 ch = ReadUint32(tmp_buf,1);
+ if (ch < pieces.getNumBits())
+ {
+ haveChunk(this,ch);
+ pieces.set(ch,true);
+ }
+ else
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Received invalid have value, kicking peer" << endl;
+ kill();
+ }
+ }
+ break;
+ case BITFIELD:
+ if (len != 1 + pieces.getNumBytes())
+ {
+ Out() << "len err BITFIELD" << endl;
+ kill();
+ return;
+ }
+
+ pieces = BitSet(tmp_buf+1,pieces.getNumBits());
+ bitSetRecieved(pieces);
+ break;
+ case REQUEST:
+ if (len != 13)
+ {
+ Out() << "len err REQUEST" << endl;
+ kill();
+ return;
+ }
+
+ {
+ Request r(
+ ReadUint32(tmp_buf,1),
+ ReadUint32(tmp_buf,5),
+ ReadUint32(tmp_buf,9),
+ id);
+
+ if (!am_choked)
+ uploader->addRequest(r);
+ else if (stats.fast_extensions)
+ pwriter->sendReject(r);
+ // Out() << "REQUEST " << r.getIndex() << " " << r.getOffset() << endl;
+ }
+ break;
+ case PIECE:
+ if (len < 9)
+ {
+ Out() << "len err PIECE" << endl;
+ kill();
+ return;
+ }
+
+ snub_timer.update();
+
+ {
+ stats.bytes_downloaded += (len - 9);
+ // turn on evil bit
+ if (stats.evil)
+ stats.evil = false;
+ Piece p(ReadUint32(tmp_buf,1),
+ ReadUint32(tmp_buf,5),
+ len - 9,id,tmp_buf+9);
+ piece(p);
+ }
+ break;
+ case CANCEL:
+ if (len != 13)
+ {
+ Out() << "len err CANCEL" << endl;
+ kill();
+ return;
+ }
+
+ {
+ Request r(ReadUint32(tmp_buf,1),
+ ReadUint32(tmp_buf,5),
+ ReadUint32(tmp_buf,9),
+ id);
+ uploader->removeRequest(r);
+ }
+ break;
+ case REJECT_REQUEST:
+ if (len != 13)
+ {
+ Out() << "len err REJECT_REQUEST" << endl;
+ kill();
+ return;
+ }
+
+ {
+ Request r(ReadUint32(tmp_buf,1),
+ ReadUint32(tmp_buf,5),
+ ReadUint32(tmp_buf,9),
+ id);
+ downloader->onRejected(r);
+ }
+ break;
+ case PORT:
+ if (len != 3)
+ {
+ Out() << "len err PORT" << endl;
+ kill();
+ return;
+ }
+
+ {
+ Uint16 port = ReadUint16(tmp_buf,1);
+ // Out() << "Got PORT packet : " << port << endl;
+ gotPortPacket(getIPAddresss(),port);
+ }
+ break;
+ case HAVE_ALL:
+ if (len != 1)
+ {
+ Out() << "len err HAVE_ALL" << endl;
+ kill();
+ return;
+ }
+ pieces.setAll(true);
+ bitSetRecieved(pieces);
+ break;
+ case HAVE_NONE:
+ if (len != 1)
+ {
+ Out() << "len err HAVE_NONE" << endl;
+ kill();
+ return;
+ }
+ pieces.setAll(false);
+ bitSetRecieved(pieces);
+ break;
+ case SUGGEST_PIECE:
+ // ignore suggestions for the moment
+ break;
+ case ALLOWED_FAST:
+ // we no longer support this, so do nothing
+ break;
+ case EXTENDED:
+ handleExtendedPacket(packet,len);
+ break;
+ }
+ }
+
+ void Peer::handleExtendedPacket(const Uint8* packet,Uint32 size)
+ {
+ if (size <= 2 || packet[1] > 1)
+ return;
+
+ if (packet[1] == 1)
+ {
+ if (ut_pex)
+ ut_pex->handlePexPacket(packet,size);
+ return;
+ }
+
+ QByteArray tmp;
+ tmp.setRawData((const char*)packet,size);
+ BNode* node = 0;
+ try
+ {
+ BDecoder dec(tmp,false,2);
+ node = dec.decode();
+ if (node && node->getType() == BNode::DICT)
+ {
+ BDictNode* dict = (BDictNode*)node;
+
+ // handshake packet, so just check if the peer supports ut_pex
+ dict = dict->getDict("m");
+ BValueNode* val = 0;
+ if (dict && (val = dict->getValue("ut_pex")))
+ {
+ utorrent_pex_id = val->data().toInt();
+ if (ut_pex)
+ {
+ if (utorrent_pex_id > 0)
+ ut_pex->changeID(utorrent_pex_id);
+ else
+ {
+ // id 0 means disabled
+ delete ut_pex;
+ ut_pex = 0;
+ }
+ }
+ else if (!ut_pex && utorrent_pex_id != 0 && pex_allowed)
+ {
+ // Don't create it when the id is 0
+ ut_pex = new UTPex(this,utorrent_pex_id);
+ }
+ }
+ }
+ }
+ catch (...)
+ {
+ // just ignore invalid packets
+ Out(SYS_CON|LOG_DEBUG) << "Invalid extended packet" << endl;
+ }
+ delete node;
+ tmp.resetRawData((const char*)packet,size);
+ }
+
+ Uint32 Peer::sendData(const Uint8* data,Uint32 len)
+ {
+ if (killed) return 0;
+
+ Uint32 ret = sock->sendData(data,len);
+ if (!sock->ok())
+ kill();
+
+ return ret;
+ }
+
+ Uint32 Peer::readData(Uint8* buf,Uint32 len)
+ {
+ if (killed) return 0;
+
+ Uint32 ret = sock->readData(buf,len);
+
+ if (!sock->ok())
+ kill();
+
+ return ret;
+ }
+
+ Uint32 Peer::bytesAvailable() const
+ {
+ return sock->bytesAvailable();
+ }
+
+ void Peer::dataWritten(int )
+ {
+ // Out() << "dataWritten " << bytes << endl;
+
+ }
+
+ Uint32 Peer::getUploadRate() const
+ {
+ if (sock)
+ return (Uint32)ceil(sock->getUploadRate());
+ else
+ return 0;
+ }
+
+ Uint32 Peer::getDownloadRate() const
+ {
+ if (sock)
+ return (Uint32)ceil(sock->getDownloadRate());
+ else
+ return 0;
+ }
+
+ bool Peer::readyToSend() const
+ {
+ return true;
+ }
+
+ void Peer::update(PeerManager* pman)
+ {
+ if (killed)
+ return;
+
+ if (!sock->ok() || !preader->ok())
+ {
+ Out(SYS_CON|LOG_DEBUG) << "Connection closed" << endl;
+ kill();
+ return;
+ }
+
+ preader->update();
+
+ Uint32 data_bytes = pwriter->getUploadedDataBytes();
+
+ if (data_bytes > 0)
+ {
+ stats.bytes_uploaded += data_bytes;
+ uploader->addUploadedBytes(data_bytes);
+ }
+
+ if (ut_pex && ut_pex->needsUpdate())
+ ut_pex->update(pman);
+ }
+
+ bool Peer::isSnubbed() const
+ {
+ // 4 minutes
+ return snub_timer.getElapsedSinceUpdate() >= 2*60*1000 && stats.num_down_requests > 0;
+ }
+
+ bool Peer::isSeeder() const
+ {
+ return pieces.allOn();
+ }
+
+ QString Peer::getIPAddresss() const
+ {
+ if (sock)
+ return sock->getRemoteIPAddress();
+ else
+ return QString::null;
+ }
+
+ Uint16 Peer::getPort() const
+ {
+ if (!sock)
+ return 0;
+ else
+ return sock->getRemotePort();
+ }
+
+ net::Address Peer::getAddress() const
+ {
+ if (!sock)
+ return net::Address();
+ else
+ return sock->getRemoteAddress();
+ }
+
+ Uint32 Peer::getTimeSinceLastPiece() const
+ {
+ return snub_timer.getElapsedSinceUpdate();
+ }
+
+ float Peer::percentAvailable() const
+ {
+ return (float)pieces.numOnBits() / (float)pieces.getNumBits() * 100.0;
+ }
+
+ const kt::PeerInterface::Stats & Peer::getStats() const
+ {
+ stats.choked = this->isChoked();
+ stats.download_rate = this->getDownloadRate();
+ stats.upload_rate = this->getUploadRate();
+ stats.perc_of_file = this->percentAvailable();
+ stats.snubbed = this->isSnubbed();
+ stats.num_up_requests = uploader->getNumRequests();
+ stats.num_down_requests = downloader->getNumRequests();
+ return stats;
+ }
+
+ void Peer::setACAScore(double s)
+ {
+ stats.aca_score = s;
+ }
+
+ void Peer::choke()
+ {
+ if (am_choked)
+ return;
+
+ pwriter->sendChoke();
+ uploader->clearAllRequests();
+ }
+
+ void Peer::emitPortPacket()
+ {
+ gotPortPacket(sock->getRemoteIPAddress(),sock->getRemotePort());
+ }
+
+ void Peer::emitPex(const QByteArray & data)
+ {
+ pex(data);
+ }
+
+ void Peer::setPexEnabled(bool on)
+ {
+ if (!stats.extension_protocol)
+ return;
+
+ // send extension protocol handshake
+ bt::Uint16 port = Globals::instance().getServer().getPortInUse();
+
+ if (ut_pex && !on)
+ {
+ delete ut_pex;
+ ut_pex = 0;
+ }
+ else if (!ut_pex && on && utorrent_pex_id > 0)
+ {
+ // if the other side has enabled it to, create a new UTPex object
+ ut_pex = new UTPex(this,utorrent_pex_id);
+ }
+
+ pwriter->sendExtProtHandshake(port,on);
+
+ pex_allowed = on;
+ }
+
+ void Peer::setGroupIDs(Uint32 up_gid,Uint32 down_gid)
+ {
+ sock->setGroupIDs(up_gid,down_gid);
+ }
+}
+
+#include "peer.moc"
diff --git a/libktorrent/torrent/peer.h b/libktorrent/torrent/peer.h
new file mode 100644
index 0000000..68dfecc
--- /dev/null
+++ b/libktorrent/torrent/peer.h
@@ -0,0 +1,324 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPEER_H
+#define BTPEER_H
+
+#include <qobject.h>
+#include <qdatetime.h>
+#include <util/timer.h>
+#include <interfaces/peerinterface.h>
+#include <util/bitset.h>
+#include "globals.h"
+#include "peerid.h"
+
+namespace net
+{
+ class Address;
+}
+
+
+namespace mse
+{
+ class RC4Encryptor;
+ class StreamSocket;
+}
+
+namespace bt
+{
+ class Chunk;
+ class Peer;
+ class Request;
+ class Piece;
+ class PacketReader;
+ class PacketWriter;
+ class PeerDownloader;
+ class PeerUploader;
+ class PeerManager;
+ class UTPex;
+
+
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Manages the connection with a peer
+ *
+ * This class manages a connection with a peer in the P2P network.
+ * It provides functions for sending packets. Packets it receives
+ * get relayed to the outside world using a bunch of signals.
+ */
+ class Peer : public QObject, public kt::PeerInterface
+ //,public Object
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, set the socket.
+ * The socket is already opened.
+ * @param sock The socket
+ * @param peer_id The Peer's BitTorrent ID
+ * @param num_chunks The number of chunks in the file
+ * @param chunk_size Size of each chunk
+ * @param support Which extensions the peer supports
+ * @param local Wether or not it is a local peer
+ */
+ Peer(mse::StreamSocket* sock,
+ const PeerID & peer_id,
+ Uint32 num_chunks,
+ Uint32 chunk_size,
+ Uint32 support,
+ bool local);
+
+ virtual ~Peer();
+
+ /// Get the peer's unique ID.
+ Uint32 getID() const {return id;}
+
+ /// Get the IP address of the Peer.
+ QString getIPAddresss() const;
+
+ /// Get the port of the Peer
+ Uint16 getPort() const;
+
+ /// Get the address of the peer
+ net::Address getAddress() const;
+
+ /// See if the peer has been killed.
+ bool isKilled() const {return killed;}
+
+ /// Get the PacketWriter
+ PacketWriter & getPacketWriter() {return *pwriter;}
+
+ /// Is the Peer choked
+ bool isChoked() const {return choked;}
+
+ /// Is the Peer interested
+ bool isInterested() const {return interested;}
+
+ /// Are we interested in the Peer
+ bool areWeInterested() const {return am_interested;}
+
+ /// Are we choked for the Peer
+ bool areWeChoked() const {return am_choked;}
+
+ /// Are we being snubbed by the Peer
+ bool isSnubbed() const;
+
+ /// Get the upload rate in bytes per sec
+ Uint32 getUploadRate() const;
+
+ /// Get the download rate in bytes per sec
+ Uint32 getDownloadRate() const;
+
+ /// Get the Peer's BitSet
+ const BitSet & getBitSet() const {return pieces;}
+
+ /// Get the Peer's ID
+ const PeerID & getPeerID() const {return peer_id;}
+
+ /// Update the up- and down- speed and handle incoming packets
+ void update(PeerManager* pman);
+
+ /// Get the PeerDownloader.
+ PeerDownloader* getPeerDownloader() {return downloader;}
+
+ /// Get the PeerUploader.
+ PeerUploader* getPeerUploader() {return uploader;}
+
+ /**
+ * Send a chunk of data.
+ * @param data The data
+ * @param len The length
+ * @param proto Indicates wether the packed is data or a protocol message
+ * @return Number of bytes written
+ */
+ Uint32 sendData(const Uint8* data,Uint32 len);
+
+ /**
+ * Reads data from the peer.
+ * @param buf The buffer to store the data
+ * @param len The maximum number of bytes to read
+ * @return The number of bytes read
+ */
+ Uint32 readData(Uint8* buf,Uint32 len);
+
+ /// Get the number of bytes available to read.
+ Uint32 bytesAvailable() const;
+
+ /**
+ * See if all previously written data, has been sent.
+ */
+ bool readyToSend() const;
+
+
+ /**
+ * Close the peers connection.
+ */
+ void closeConnection();
+
+ /**
+ * Kill the Peer.
+ */
+ void kill();
+
+ /**
+ * Get the time when this Peer was choked.
+ */
+ TimeStamp getChokeTime() const {return time_choked;}
+
+ /**
+ * Get the time when this Peer was unchoked.
+ */
+ TimeStamp getUnchokeTime() const {return time_unchoked;}
+
+ /**
+ * See if the peer is a seeder.
+ */
+ bool isSeeder() const;
+
+ /// Get the time in milliseconds since the last time a piece was received.
+ Uint32 getTimeSinceLastPiece() const;
+
+ /// Get the time the peer connection was established.
+ const QTime & getConnectTime() const {return connect_time;}
+
+ /**
+ * Get the percentual amount of data available from peer.
+ */
+ float percentAvailable() const;
+
+ /// See if the peer supports DHT
+ bool isDHTSupported() const {return stats.dht_support;}
+
+ /// Set the ACA score
+ void setACAScore(double s);
+
+ /// Get the stats of the peer
+ virtual const Stats & getStats() const;
+
+ /// Choke the peer
+ void choke();
+
+ /**
+ * Emit the port packet signal.
+ */
+ void emitPortPacket();
+
+ /**
+ * Emit the pex signal
+ */
+ void emitPex(const QByteArray & data);
+
+ /// Disable or enable pex
+ void setPexEnabled(bool on);
+
+ /**
+ * Set the peer's group IDs for traffic
+ * @param up_gid The upload gid
+ * @param down_gid The download gid
+ */
+ void setGroupIDs(Uint32 up_gid,Uint32 down_gid);
+
+ private slots:
+ void dataWritten(int bytes);
+
+ signals:
+ /**
+ * The Peer has a Chunk.
+ * @param p The Peer
+ * @param index Index of Chunk
+ */
+ void haveChunk(Peer* p,Uint32 index);
+
+ /**
+ * The Peer sent a request.
+ * @param req The Request
+ */
+ void request(const Request & req);
+
+ /**
+ * The Peer sent a cancel.
+ * @param req The Request
+ */
+ void canceled(const Request & req);
+
+ /**
+ * The Peer sent a piece of a Chunk.
+ * @param p The Piece
+ */
+ void piece(const Piece & p);
+
+ /**
+ * Recieved a BitSet
+ * @param bs The BitSet
+ */
+ void bitSetRecieved(const BitSet & bs);
+
+ /**
+ * Emitted when the peer is unchoked and interested changes value.
+ */
+ void rerunChoker();
+
+ /**
+ * Got a port packet from this peer.
+ * @param ip The IP
+ * @param port The port
+ */
+ void gotPortPacket(const QString & ip,Uint16 port);
+
+ /**
+ * A Peer Exchange has been received, the QByteArray contains the data.
+ */
+ void pex(const QByteArray & data);
+
+ private:
+ void packetReady(const Uint8* packet,Uint32 size);
+ void handleExtendedPacket(const Uint8* packet,Uint32 size);
+
+ private:
+ mse::StreamSocket* sock;
+ bool choked;
+ bool interested;
+ bool am_choked;
+ bool am_interested;
+ bool killed;
+ TimeStamp time_choked;
+ TimeStamp time_unchoked;
+ Uint32 id;
+ BitSet pieces;
+ PeerID peer_id;
+ Timer snub_timer;
+ PacketReader* preader;
+ PacketWriter* pwriter;
+ PeerDownloader* downloader;
+ PeerUploader* uploader;
+ mutable kt::PeerInterface::Stats stats;
+ QTime connect_time;
+ UTPex* ut_pex;
+ bool pex_allowed;
+ Uint32 utorrent_pex_id;
+
+ friend class PacketWriter;
+ friend class PacketReader;
+ friend class PeerDownloader;
+ };
+}
+
+#endif
diff --git a/libktorrent/torrent/peerdownloader.cpp b/libktorrent/torrent/peerdownloader.cpp
new file mode 100644
index 0000000..0c6cdd8
--- /dev/null
+++ b/libktorrent/torrent/peerdownloader.cpp
@@ -0,0 +1,311 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include "globals.h"
+#include "peerdownloader.h"
+#include "peer.h"
+#include "piece.h"
+#include "packetwriter.h"
+
+
+namespace bt
+{
+ TimeStampedRequest::TimeStampedRequest()
+ {
+ time_stamp = bt::GetCurrentTime();
+ }
+
+ TimeStampedRequest::TimeStampedRequest(const Request & r) : req(r)
+ {
+ time_stamp = bt::GetCurrentTime();
+ }
+
+ TimeStampedRequest::TimeStampedRequest(const TimeStampedRequest & t)
+ : req(t.req),time_stamp(t.time_stamp)
+ {
+ }
+
+ bool TimeStampedRequest::operator == (const Request & r)
+ {
+ return r == req;
+ }
+
+ bool TimeStampedRequest::operator == (const TimeStampedRequest & r)
+ {
+ return r.req == req;
+ }
+
+ TimeStampedRequest & TimeStampedRequest::operator = (const Request & r)
+ {
+ time_stamp = bt::GetCurrentTime();
+ req = r;
+ return *this;
+ }
+
+ TimeStampedRequest & TimeStampedRequest::operator = (const TimeStampedRequest & r)
+ {
+ time_stamp = r.time_stamp;
+ req = r.req;
+ return *this;
+ }
+
+ PeerDownloader::PeerDownloader(Peer* peer,Uint32 chunk_size) : peer(peer),grabbed(0),chunk_size(chunk_size / MAX_PIECE_LEN)
+ {
+ connect(peer,SIGNAL(piece(const Piece& )),this,SLOT(piece(const Piece& )));
+ connect(peer,SIGNAL(destroyed()),this,SLOT(peerDestroyed()));
+ nearly_done = false;
+ max_wait_queue_size = 25;
+ }
+
+
+ PeerDownloader::~PeerDownloader()
+ {
+ }
+#if 0
+ void PeerDownloader::retransmitRequests()
+ {
+ for (QValueList<Request>::iterator i = reqs.begin();i != reqs.end();i++)
+ peer->getPacketWriter().sendRequest(*i);
+
+ }
+#endif
+
+ bool PeerDownloader::canAddRequest() const
+ {
+ return wait_queue.count() < max_wait_queue_size;
+ }
+
+ Uint32 PeerDownloader::getNumRequests() const
+ {
+ return reqs.count() /*+ wait_queue.count() */;
+ }
+
+ int PeerDownloader::grab()
+ {
+ grabbed++;
+ return grabbed;
+ }
+
+ void PeerDownloader::release()
+ {
+ grabbed--;
+ if (grabbed < 0)
+ grabbed = 0;
+ }
+
+ void PeerDownloader::download(const Request & req)
+ {
+ if (!peer)
+ return;
+
+ wait_queue.append(req);
+ update();
+ }
+
+ void PeerDownloader::cancel(const Request & req)
+ {
+ if (!peer)
+ return;
+
+ if (wait_queue.contains(req))
+ {
+ wait_queue.remove(req);
+ }
+ else if (reqs.contains(req))
+ {
+ reqs.remove(req);
+ peer->getPacketWriter().sendCancel(req);
+ }
+ }
+
+ void PeerDownloader::onRejected(const Request & req)
+ {
+ if (!peer)
+ return;
+
+// Out(SYS_CON|LOG_DEBUG) << "Rejected : " << req.getIndex() << " "
+// << req.getOffset() << " " << req.getLength() << endl;
+ if (reqs.contains(req))
+ {
+ reqs.remove(req);
+ rejected(req);
+ }
+ }
+
+ void PeerDownloader::cancelAll()
+ {
+ if (peer)
+ {
+ QValueList<TimeStampedRequest>::iterator i = reqs.begin();
+ while (i != reqs.end())
+ {
+ TimeStampedRequest & tr = *i;
+ peer->getPacketWriter().sendCancel(tr.req);
+ i++;
+ }
+ }
+
+ wait_queue.clear();
+ reqs.clear();
+ }
+
+ void PeerDownloader::piece(const Piece & p)
+ {
+ Request r(p);
+ if (wait_queue.contains(r))
+ wait_queue.remove(r);
+ else if (reqs.contains(r))
+ reqs.remove(r);
+
+ downloaded(p);
+ update();
+ }
+
+ void PeerDownloader::peerDestroyed()
+ {
+ peer = 0;
+ }
+
+ bool PeerDownloader::isChoked() const
+ {
+ if (peer)
+ return peer->isChoked();
+ else
+ return true;
+ }
+
+ bool PeerDownloader::hasChunk(Uint32 idx) const
+ {
+ if (peer)
+ return peer->getBitSet().get(idx);
+ else
+ return false;
+ }
+
+ Uint32 PeerDownloader::getDownloadRate() const
+ {
+ if (peer)
+ return peer->getDownloadRate();
+ else
+ return 0;
+ }
+
+ void PeerDownloader::checkTimeouts()
+ {
+ TimeStamp now = bt::GetCurrentTime();
+ // we use a 60 second interval
+ const Uint32 MAX_INTERVAL = 60 * 1000;
+ QValueList<TimeStampedRequest>::iterator i = reqs.begin();
+ while (i != reqs.end())
+ {
+ TimeStampedRequest & tr = *i;
+ if (now - tr.time_stamp > MAX_INTERVAL)
+ {
+ // cancel it
+ TimeStampedRequest r = tr;
+ peer->getPacketWriter().sendCancel(r.req);
+
+ // retransmit it
+ peer->getPacketWriter().sendRequest(r.req);
+ r.time_stamp = now;
+
+ // reappend it at the end of the list
+ i = reqs.erase(i);
+ reqs.append(r);
+ Out(SYS_CON|LOG_DEBUG) << "Retransmitting " << r.req.getIndex() << ":" << r.req.getOffset() << endl;
+ }
+ else
+ {
+ // new requests get appended so once we have found one
+ // which hasn't timed out all the following will also not have timed out
+ break;
+ }
+ }
+ }
+
+
+ Uint32 PeerDownloader::getMaxChunkDownloads() const
+ {
+ // get the download rate in KB/sec
+ Uint32 rate_kbs = peer->getDownloadRate();
+ rate_kbs = rate_kbs / 1024;
+ Uint32 num_extra = rate_kbs / 50;
+
+ if (chunk_size >= 16)
+ {
+ return 1 + 16 * num_extra / chunk_size;
+ }
+ else
+ {
+ return 1 + (16 / chunk_size) * num_extra;
+ }
+ }
+
+ void PeerDownloader::choked()
+ {
+ // choke doesn't mean reject when fast extensions are enabled
+ if (peer->getStats().fast_extensions)
+ return;
+
+ QValueList<TimeStampedRequest>::iterator i = reqs.begin();
+ while (i != reqs.end())
+ {
+ TimeStampedRequest & tr = *i;
+ rejected(tr.req);
+ i++;
+ }
+ reqs.clear();
+
+ QValueList<Request>::iterator j = wait_queue.begin();
+ while (j != wait_queue.end())
+ {
+ Request & req = *j;
+ rejected(req);
+ j++;
+ }
+ wait_queue.clear();
+ }
+
+ void PeerDownloader::update()
+ {
+ // modify the interval if necessary
+ double pieces_per_sec = (double)peer->getDownloadRate() / MAX_PIECE_LEN;
+
+ Uint32 max_reqs = 1 + (Uint32)ceil(10*pieces_per_sec);
+
+ while (wait_queue.count() > 0 && reqs.count() < max_reqs)
+ {
+ // get a request from the wait queue and send that
+ Request req = wait_queue.front();
+ wait_queue.pop_front();
+ TimeStampedRequest r = TimeStampedRequest(req);
+ reqs.append(r);
+ peer->getPacketWriter().sendRequest(req);
+ }
+
+ max_wait_queue_size = 2*max_reqs;
+ if (max_wait_queue_size < 10)
+ max_wait_queue_size = 10;
+ }
+}
+
+#include "peerdownloader.moc"
diff --git a/libktorrent/torrent/peerdownloader.h b/libktorrent/torrent/peerdownloader.h
new file mode 100644
index 0000000..4eb37d2
--- /dev/null
+++ b/libktorrent/torrent/peerdownloader.h
@@ -0,0 +1,231 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPEERDOWNLOADER_H
+#define BTPEERDOWNLOADER_H
+
+#include <set>
+#include <qvaluelist.h>
+#include <qobject.h>
+#include "globals.h"
+#include "request.h"
+
+namespace bt
+{
+ class Peer;
+ class Request;
+ class Piece;
+
+ typedef std::set<Uint32> AllowedFastSet;
+ /**
+ * Request with a timestamp.
+ */
+ struct TimeStampedRequest
+ {
+ Request req;
+ TimeStamp time_stamp;
+
+ TimeStampedRequest();
+
+ /**
+ * Constructor, set the request and calculate the timestamp.
+ * @param r The Request
+ */
+ TimeStampedRequest(const Request & r);
+
+ /**
+ * Copy constructor, copy the request and the timestamp
+ * @param r The Request
+ */
+ TimeStampedRequest(const TimeStampedRequest & t);
+
+ /**
+ * Equality operator, compares requests only.
+ * @param r The Request
+ * @return true if equal
+ */
+ bool operator == (const Request & r);
+
+ /**
+ * Equality operator, compares requests only.
+ * @param r The Request
+ * @return true if equal
+ */
+ bool operator == (const TimeStampedRequest & r);
+
+ /**
+ * Assignment operator.
+ * @param r The Request to copy
+ * @return *this
+ */
+ TimeStampedRequest & operator = (const Request & r);
+
+ /**
+ * Assignment operator.
+ * @param r The TimeStampedRequest to copy
+ * @return *this
+ */
+ TimeStampedRequest & operator = (const TimeStampedRequest & r);
+ };
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Class which downloads pieces from a Peer
+ *
+ * This class downloads Piece's from a Peer.
+ */
+ class PeerDownloader : public QObject
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, set the Peer
+ * @param peer The Peer
+ * @param chunk_size Size of a chunk in bytes
+ */
+ PeerDownloader(Peer* peer,Uint32 chunk_size);
+ virtual ~PeerDownloader();
+
+ /// See if we can add a request to the wait_queue
+ bool canAddRequest() const;
+
+ /// Get the number of active requests
+ Uint32 getNumRequests() const;
+
+ /// Is the Peer choked.
+ bool isChoked() const;
+
+ /// Is NULL (is the Peer set)
+ bool isNull() const {return peer == 0;}
+
+ /**
+ * See if the Peer has a Chunk
+ * @param idx The Chunk's index
+ */
+ bool hasChunk(Uint32 idx) const;
+
+ /// See if this PeerDownloader has nearly finished a chunk
+ bool isNearlyDone() const {return grabbed == 1 && nearly_done;}
+
+ /// Set the nearly done status of the PeerDownloader
+ void setNearlyDone(bool nd) {nearly_done = nd;}
+
+ /**
+ * Grab the Peer, indicates how many ChunkDownload's
+ * are using this PeerDownloader.
+ * @return The number of times this PeerDownloader was grabbed
+ */
+ int grab();
+
+ /**
+ * When a ChunkDownload is ready with this PeerDownloader,
+ * it will release it, so that others can use it.
+ */
+ void release();
+
+ /// Get the number of times this PeerDownloader was grabbed.
+ int getNumGrabbed() const {return grabbed;}
+
+ /// Get the Peer
+ const Peer* getPeer() const {return peer;}
+
+ /// Get the current download rate
+ Uint32 getDownloadRate() const;
+
+ /**
+ * Check for timed out requests.
+ */
+ void checkTimeouts();
+
+ /// Get the maximum number of chunk downloads
+ Uint32 getMaxChunkDownloads() const;
+
+ /**
+ * The peer has been choked, all pending requests are rejected.
+ * (except for allowed fast ones)
+ */
+ void choked();
+
+ public slots:
+ /**
+ * Send a Request. Note that the DownloadCap
+ * may not allow this. (In which case it will
+ * be stored temporarely in the unsent_reqs list)
+ * @param req The Request
+ */
+ void download(const Request & req);
+
+ /**
+ * Cancel a Request.
+ * @param req The Request
+ */
+ void cancel(const Request & req);
+
+ /**
+ * Cancel all Requests
+ */
+ void cancelAll();
+
+ /**
+ * Handles a rejected request.
+ * @param req
+ */
+ void onRejected(const Request & req);
+
+ private slots:
+ void piece(const Piece & p);
+ void peerDestroyed();
+ void update();
+
+ signals:
+ /**
+ * Emited when a Piece has been downloaded.
+ * @param p The Piece
+ */
+ void downloaded(const Piece & p);
+
+ /**
+ * Emitted when a request takes longer then 60 seconds to download.
+ * The sender of the request will have to request it again. This does not apply for
+ * unsent requests. Their timestamps will be updated when they get transmitted.
+ * @param r The request
+ */
+ void timedout(const Request & r);
+
+ /**
+ * A request was rejected.
+ * @param req The Request
+ */
+ void rejected(const Request & req);
+
+
+ private:
+ Peer* peer;
+ QValueList<TimeStampedRequest> reqs;
+ QValueList<Request> wait_queue;
+ Uint32 max_wait_queue_size;
+ int grabbed;
+ Uint32 chunk_size;
+ bool nearly_done;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/peerid.cpp b/libktorrent/torrent/peerid.cpp
new file mode 100644
index 0000000..5f314b3
--- /dev/null
+++ b/libktorrent/torrent/peerid.cpp
@@ -0,0 +1,253 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <time.h>
+#include <stdlib.h>
+#include <qmap.h>
+#include <klocale.h>
+#include "peerid.h"
+#include "ktversion.h"
+
+namespace bt
+{
+ char RandomLetterOrNumber()
+ {
+ int i = rand() % 62;
+ if (i < 26)
+ return 'a' + i;
+ else if (i < 52)
+ return 'A' + (i - 26);
+ else
+ return '0' + (i - 52);
+ }
+
+
+ PeerID::PeerID()
+ {
+ srand(time(0));
+ memcpy(id,kt::PEER_ID,8);
+ for (int i = 8;i < 20;i++)
+ id[i] = RandomLetterOrNumber();
+ client_name = identifyClient();
+ }
+
+ PeerID::PeerID(const char* pid)
+ {
+ if (pid)
+ memcpy(id,pid,20);
+ else
+ memset(id,0,20);
+ client_name = identifyClient();
+ }
+
+ PeerID::PeerID(const PeerID & pid)
+ {
+ memcpy(id,pid.id,20);
+ client_name = pid.client_name;
+ }
+
+ PeerID::~PeerID()
+ {}
+
+
+
+ PeerID & PeerID::operator = (const PeerID & pid)
+ {
+ memcpy(id,pid.id,20);
+ client_name = pid.client_name;
+ return *this;
+ }
+
+ bool operator == (const PeerID & a,const PeerID & b)
+ {
+ for (int i = 0;i < 20;i++)
+ if (a.id[i] != b.id[i])
+ return false;
+
+ return true;
+ }
+
+ bool operator != (const PeerID & a,const PeerID & b)
+ {
+ return ! operator == (a,b);
+ }
+
+ bool operator < (const PeerID & a,const PeerID & b)
+ {
+ for (int i = 0;i < 20;i++)
+ if (a.id[i] < b.id[i])
+ return true;
+
+ return false;
+ }
+
+ QString PeerID::toString() const
+ {
+ QString r;
+ for (int i = 0;i < 20;i++)
+ r += id[i] == 0 ? ' ' : id[i];
+ return r;
+ }
+
+ QString PeerID::identifyClient() const
+ {
+ if (!client_name.isNull())
+ return client_name;
+
+ QString peer_id = toString();
+ // we only need to create this map once
+ // so make it static
+ static QMap<QString, QString> Map;
+ static bool first = true;
+
+ if (first)
+ {
+ // Keep things a bit alphabetic to make it easier add new ones
+ //AZUREUS STYLE
+ Map["AG"] = "Ares";
+ Map["A~"] = "Ares";
+ Map["AV"] = "Avicora";
+ Map["AX"] = "BitPump";
+ Map["AR"] = "Arctic";
+ Map["AZ"] = "Azureus";
+ Map["BB"] = "BitBuddy";
+ Map["BC"] = "BitComet";
+ Map["BF"] = "Bitflu";
+ Map["BG"] = "BTGetit";
+ Map["BM"] = "BitMagnet";
+ Map["BO"] = "BitsOnWheels";
+ Map["BR"] = "BitRocket";
+ Map["BS"] = "BTSlave";
+ Map["BX"] = "BitTorrent X";
+ Map["CD"] = "Enhanced CTorrent";
+ Map["CT"] = "CTorrent";
+ Map["DE"] = "DelugeTorrent";
+ Map["DP"] = "Propagate Data Client";
+ Map["EB"] = "EBit";
+ Map["ES"] = "electric sheep";
+ Map["FT"] = "FoxTorrent";
+ Map["GS"] = "GSTorrent";
+ Map["G3"] = "G3 Torrent";
+ Map["HL"] = "Halite";
+ Map["HN"] = "Hydranode";
+ Map["KG"] = "KGet";
+ Map["KT"] = "KTorrent"; // lets not forget our own client
+ Map["LH"] = "LH-ABC";
+ Map["lt"] = "libTorrent";
+ Map["LT"] = "libtorrent";
+ Map["LP"] = "Lphant";
+ Map["LW"] = "LimeWire";
+ Map["ML"] = "MLDonkey";
+ Map["MO"] = "MonoTorrent";
+ Map["MP"] = "MooPolice";
+ Map["MT"] = "MoonLight";
+ Map["PD"] = "Pando";
+ Map["qB"] = "qBittorrent";
+ Map["QD"] = "QQDownload";
+ Map["QT"] = "Qt 4 Torrent example";
+ Map["RS"] = "Rufus";
+ Map["RT"] = "Retriever";
+ Map["S~"] = "Shareaza alpha/beta";
+ Map["SB"] = "Swiftbit";
+ Map["SS"] = "SwarmScope";
+ Map["ST"] = "SymTorrent";
+ Map["st"] = "sharktorrent";
+ Map["SZ"] = "Shareaza";
+ Map["TN"] = "Torrent .NET";
+ Map["TR"] = "Transmission";
+ Map["TS"] = "Torrent Storm";
+ Map["TT"] = "TuoTu";
+ Map["UL"] = "uLeecher!";
+ Map["UT"] = QString("%1Torrent").arg(QChar(0x00B5)); // µTorrent, 0x00B5 is unicode for µ
+ Map["WT"] = "BitLet";
+ Map["WY"] = "FireTorrent";
+ Map["XL"] = "Xunlei";
+ Map["XT"] = "Xan Torrent";
+ Map["XX"] = "Xtorrent";
+ Map["ZT"] = "Zip Torrent";
+
+ //SHADOWS STYLE
+ Map["A"] = "ABC";
+ Map["O"] = "Osprey Permaseed";
+ Map["Q"] = "BTQueue";
+ Map["R"] = "Tribler";
+ Map["S"] = "Shadow's";
+ Map["T"] = "BitTornado";
+ Map["U"] = "UPnP NAT BitTorrent";
+ //OTHER
+ Map["Plus"] = "Plus! II";
+ Map["OP"] = "Opera";
+ Map["BOW"] = "Bits on Wheels";
+ Map["M"] = "BitTorrent";
+ Map["exbc"] = "BitComet";
+ Map["Mbrst"] = "Burst!";
+ first = false;
+ }
+
+ QString name = i18n("Unknown client");
+ if (peer_id.at(0) == '-' &&
+ peer_id.at(1).isLetter() &&
+ peer_id.at(2).isLetter() ) //AZ style
+ {
+ QString ID(peer_id.mid(1,2));
+ if (Map.contains(ID))
+ name = Map[ID] + " " + peer_id.at(3) + "." + peer_id.at(4) + "."
+ + peer_id.at(5) + "." + peer_id.at(6);
+ }
+ else if (peer_id.at(0).isLetter() &&
+ peer_id.at(1).isDigit() &&
+ peer_id.at(2).isDigit() ) //Shadow's style
+ {
+ QString ID = QString(peer_id.at(0));
+ if (Map.contains(ID))
+ name = Map[ID] + " " + peer_id.at(1) + "." +
+ peer_id.at(2) + "." + peer_id.at(3);
+ }
+ else if (peer_id.at(0) == 'M' && peer_id.at(2) == '-' && (peer_id.at(4) == '-' || peer_id.at(5) == '-'))
+ {
+ name = Map["M"] + " " + peer_id.at(1) + "." + peer_id.at(3);
+ if(peer_id.at(4) == '-')
+ name += "." + peer_id.at(5);
+ else
+ name += peer_id.at(4) + "." + peer_id.at(6);
+ }
+ else if (peer_id.startsWith("OP"))
+ {
+ name = Map["OP"];
+ }
+ else if ( peer_id.startsWith("exbc") )
+ {
+ name = Map["exbc"];
+ }
+ else if ( peer_id.mid(1,3) == "BOW")
+ {
+ name = Map["BOW"];
+ }
+ else if ( peer_id.startsWith("Plus"))
+ {
+ name = Map["Plus"];
+ }
+ else if ( peer_id.startsWith("Mbrst"))
+ {
+ name = Map["Mbrst"] + " " + peer_id.at(5) + "." + peer_id.at(7);
+ }
+
+ return name;
+ }
+}
diff --git a/libktorrent/torrent/peerid.h b/libktorrent/torrent/peerid.h
new file mode 100644
index 0000000..90ba439
--- /dev/null
+++ b/libktorrent/torrent/peerid.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPEERID_H
+#define BTPEERID_H
+
+#include <qstring.h>
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class PeerID
+ {
+ char id[20];
+ QString client_name;
+ public:
+ PeerID();
+ PeerID(const char* pid);
+ PeerID(const PeerID & pid);
+ virtual ~PeerID();
+
+ PeerID & operator = (const PeerID & pid);
+
+ const char* data() const {return id;}
+
+ QString toString() const;
+
+ /**
+ * Interprets the PeerID to figure out which client it is.
+ * @author Ivan + Joris
+ * @return The name of the client
+ */
+ QString identifyClient() const;
+
+ friend bool operator == (const PeerID & a,const PeerID & b);
+ friend bool operator != (const PeerID & a,const PeerID & b);
+ friend bool operator < (const PeerID & a,const PeerID & b);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/peermanager.cpp b/libktorrent/torrent/peermanager.cpp
new file mode 100644
index 0000000..d3744fc
--- /dev/null
+++ b/libktorrent/torrent/peermanager.cpp
@@ -0,0 +1,607 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/file.h>
+#include <util/error.h>
+#include <net/address.h>
+#include "peermanager.h"
+#include "peer.h"
+#include "bnode.h"
+#include "globals.h"
+#include "server.h"
+#include "authenticate.h"
+#include "torrent.h"
+#include "uploader.h"
+#include "downloader.h"
+#include <util/functions.h>
+#include <qhostaddress.h>
+#include <mse/streamsocket.h>
+#include <mse/encryptedauthenticate.h>
+#include <klocale.h>
+#include "ipblocklist.h"
+#include "chunkcounter.h"
+#include "authenticationmonitor.h"
+#include <qdatetime.h>
+
+using namespace kt;
+
+namespace bt
+{
+ Uint32 PeerManager::max_connections = 0;
+ Uint32 PeerManager::max_total_connections = 0;
+ Uint32 PeerManager::total_connections = 0;
+
+ PeerManager::PeerManager(Torrent & tor)
+ : tor(tor),available_chunks(tor.getNumChunks())
+ {
+ killed.setAutoDelete(true);
+ started = false;
+
+ cnt = new ChunkCounter(tor.getNumChunks());
+ num_pending = 0;
+ pex_on = !tor.isPrivate();
+ }
+
+
+ PeerManager::~PeerManager()
+ {
+ delete cnt;
+ Globals::instance().getServer().removePeerManager(this);
+
+ if (peer_list.count() <= total_connections)
+ total_connections -= peer_list.count();
+ else
+ total_connections = 0;
+
+ peer_list.setAutoDelete(true);
+ peer_list.clear();
+ }
+
+ void PeerManager::update()
+ {
+ if (!started)
+ return;
+
+ // update the speed of each peer,
+ // and get ridd of some killed peers
+ QPtrList<Peer>::iterator i = peer_list.begin();
+ while (i != peer_list.end())
+ {
+ Peer* p = *i;
+ if (p->isKilled())
+ {
+ cnt->decBitSet(p->getBitSet());
+ updateAvailableChunks();
+ i = peer_list.erase(i);
+ killed.append(p);
+ peer_map.erase(p->getID());
+ if (total_connections > 0)
+ total_connections--;
+ peerKilled(p);
+ }
+ else
+ {
+ p->update(this);
+ i++;
+ }
+ }
+
+ // connect to some new peers
+ connectToPeers();
+ }
+
+ void PeerManager::killChokedPeers(Uint32 older_then)
+ {
+ Out() << "Getting rid of peers which have been choked for a long time" << endl;
+ TimeStamp now = bt::GetCurrentTime();
+ QPtrList<Peer>::iterator i = peer_list.begin();
+ Uint32 num_killed = 0;
+ while (i != peer_list.end() && num_killed < 20)
+ {
+ Peer* p = *i;
+ if (p->isChoked() && (now - p->getChokeTime()) > older_then)
+ {
+ p->kill();
+ num_killed++;
+ }
+
+ i++;
+ }
+ }
+
+ void PeerManager::setMaxConnections(Uint32 max)
+ {
+ max_connections = max;
+ }
+
+ void PeerManager::setMaxTotalConnections(Uint32 max)
+ {
+ Uint32 sys_max = bt::MaxOpenFiles() - 50; // leave about 50 free for regular files
+ max_total_connections = max;
+ if (max == 0 || max_total_connections > sys_max)
+ max_total_connections = sys_max;
+ }
+
+ void PeerManager::addPotentialPeer(const PotentialPeer & pp)
+ {
+ if (potential_peers.size() > 150)
+ return;
+
+ // avoid duplicates in the potential_peers map
+ std::pair<PPItr,PPItr> r = potential_peers.equal_range(pp.ip);
+ for (PPItr i = r.first;i != r.second;i++)
+ {
+ if (i->second.port == pp.port) // port and IP are the same so return
+ return;
+ }
+
+ potential_peers.insert(std::make_pair(pp.ip,pp));
+ }
+
+ void PeerManager::killSeeders()
+ {
+ QPtrList<Peer>::iterator i = peer_list.begin();
+ while (i != peer_list.end())
+ {
+ Peer* p = *i;
+ if ( p->isSeeder() )
+ p->kill();
+ i++;
+ }
+ }
+
+ void PeerManager::killUninterested()
+ {
+ QPtrList<Peer>::iterator i = peer_list.begin();
+ while (i != peer_list.end())
+ {
+ Peer* p = *i;
+ if ( !p->isInterested() && (p->getConnectTime().secsTo(QTime::currentTime()) > 30) )
+ p->kill();
+ i++;
+ }
+ }
+
+ void PeerManager::onHave(Peer*,Uint32 index)
+ {
+ available_chunks.set(index,true);
+ cnt->inc(index);
+ }
+
+ void PeerManager::onBitSetRecieved(const BitSet & bs)
+ {
+ for (Uint32 i = 0;i < bs.getNumBits();i++)
+ {
+ if (bs.get(i))
+ {
+ available_chunks.set(i,true);
+ cnt->inc(i);
+ }
+ }
+ }
+
+
+ void PeerManager::newConnection(mse::StreamSocket* sock,const PeerID & peer_id,Uint32 support)
+ {
+ Uint32 total = peer_list.count() + num_pending;
+ bool local_not_ok = (max_connections > 0 && total >= max_connections);
+ bool global_not_ok = (max_total_connections > 0 && total_connections >= max_total_connections);
+
+ if (!started || local_not_ok || global_not_ok)
+ {
+ // get rid of bad peer and replace it by another one
+ if (!killBadPeer())
+ {
+ // we failed to find a bad peer, so just delete this one
+ delete sock;
+ return;
+ }
+ }
+
+ createPeer(sock,peer_id,support,false);
+ }
+
+ void PeerManager::peerAuthenticated(Authenticate* auth,bool ok)
+ {
+ if (!started)
+ return;
+
+ if (total_connections > 0)
+ total_connections--;
+
+ num_pending--;
+ if (!ok)
+ {
+ mse::EncryptedAuthenticate* a = dynamic_cast<mse::EncryptedAuthenticate*>(auth);
+ if (a && Globals::instance().getServer().unencryptedConnectionsAllowed())
+ {
+ // if possible try unencrypted
+ QString ip = a->getIP();
+ Uint16 port = a->getPort();
+ Authenticate* st = new Authenticate(ip,port,tor.getInfoHash(),tor.getPeerID(),this);
+ if (auth->isLocal())
+ st->setLocal(true);
+
+ connect(this,SIGNAL(stopped()),st,SLOT(onPeerManagerDestroyed()));
+ AuthenticationMonitor::instance().add(st);
+ num_pending++;
+ total_connections++;
+ }
+ return;
+ }
+
+ if (connectedTo(auth->getPeerID()))
+ {
+ return;
+ }
+
+ createPeer(auth->takeSocket(),auth->getPeerID(),auth->supportedExtensions(),auth->isLocal());
+ }
+
+ void PeerManager::createPeer(mse::StreamSocket* sock,const PeerID & peer_id,Uint32 support,bool local)
+ {
+ Peer* peer = new Peer(sock,peer_id,tor.getNumChunks(),tor.getChunkSize(),support,local);
+
+ connect(peer,SIGNAL(haveChunk(Peer*, Uint32 )),this,SLOT(onHave(Peer*, Uint32 )));
+ connect(peer,SIGNAL(bitSetRecieved(const BitSet& )),
+ this,SLOT(onBitSetRecieved(const BitSet& )));
+ connect(peer,SIGNAL(rerunChoker()),this,SLOT(onRerunChoker()));
+ connect(peer,SIGNAL(pex( const QByteArray& )),this,SLOT(pex( const QByteArray& )));
+
+ peer_list.append(peer);
+ peer_map.insert(peer->getID(),peer);
+ total_connections++;
+ newPeer(peer);
+ peer->setPexEnabled(pex_on);
+ }
+
+ bool PeerManager::connectedTo(const PeerID & peer_id)
+ {
+ if (!started)
+ return false;
+
+ for (Uint32 j = 0;j < peer_list.count();j++)
+ {
+ Peer* p = peer_list.at(j);
+ if (p->getPeerID() == peer_id)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool PeerManager::connectedTo(const QString & ip,Uint16 port) const
+ {
+ PtrMap<Uint32,Peer>::const_iterator i = peer_map.begin();
+ while (i != peer_map.end())
+ {
+ const Peer* p = i->second;
+ if (p->getPort() == port && p->getStats().ip_address == ip)
+ return true;
+ i++;
+ }
+ return false;
+ }
+
+ void PeerManager::connectToPeers()
+ {
+ if (potential_peers.size() == 0)
+ return;
+
+ if (peer_list.count() + num_pending >= max_connections && max_connections > 0)
+ return;
+
+ if (total_connections >= max_total_connections && max_total_connections > 0)
+ return;
+
+ if (num_pending > MAX_SIMULTANIOUS_AUTHS)
+ return;
+
+ if (!mse::StreamSocket::canInitiateNewConnection())
+ return; // to many sockets in SYN_SENT state
+
+ Uint32 num = 0;
+ if (max_connections > 0)
+ {
+ Uint32 available = max_connections - (peer_list.count() + num_pending);
+ num = available >= potential_peers.size() ?
+ potential_peers.size() : available;
+ }
+ else
+ {
+ num = potential_peers.size();
+ }
+
+ if (num + total_connections >= max_total_connections && max_total_connections > 0)
+ num = max_total_connections - total_connections;
+
+ for (Uint32 i = 0;i < num;i++)
+ {
+ if (num_pending > MAX_SIMULTANIOUS_AUTHS)
+ return;
+
+ PPItr itr = potential_peers.begin();
+
+ IPBlocklist& ipfilter = IPBlocklist::instance();
+
+ if (!ipfilter.isBlocked(itr->first) && !connectedTo(itr->first,itr->second.port))
+ {
+ // Out() << "EncryptedAuthenticate : " << pp.ip << ":" << pp.port << endl;
+ Authenticate* auth = 0;
+ const PotentialPeer & pp = itr->second;
+
+ if (Globals::instance().getServer().isEncryptionEnabled())
+ auth = new mse::EncryptedAuthenticate(pp.ip,pp.port,tor.getInfoHash(),tor.getPeerID(),this);
+ else
+ auth = new Authenticate(pp.ip,pp.port,tor.getInfoHash(),tor.getPeerID(),this);
+
+ if (pp.local)
+ auth->setLocal(true);
+
+ connect(this,SIGNAL(stopped()),auth,SLOT(onPeerManagerDestroyed()));
+
+ AuthenticationMonitor::instance().add(auth);
+ num_pending++;
+ total_connections++;
+ }
+ potential_peers.erase(itr);
+ }
+ }
+
+
+
+ Uint32 PeerManager::clearDeadPeers()
+ {
+ Uint32 num = killed.count();
+ killed.clear();
+ return num;
+ }
+
+ void PeerManager::closeAllConnections()
+ {
+ killed.clear();
+
+ if (peer_list.count() <= total_connections)
+ total_connections -= peer_list.count();
+ else
+ total_connections = 0;
+
+ peer_map.clear();
+ peer_list.setAutoDelete(true);
+ peer_list.clear();
+ peer_list.setAutoDelete(false);
+ }
+
+ // pick a random magic number
+ const Uint32 PEER_LIST_HDR_MAGIC = 0xEF12AB34;
+
+ struct PeerListHeader
+ {
+ Uint32 magic;
+ Uint32 num_peers;
+ Uint32 ip_version; // 4 or 6, 6 is for future purposes only (when we support IPv6)
+ };
+
+ struct PeerListEntry
+ {
+ Uint32 ip;
+ Uint16 port;
+ };
+
+ void PeerManager::savePeerList(const QString & file)
+ {
+ bt::File fptr;
+ if (!fptr.open(file,"wb"))
+ return;
+
+ try
+ {
+ PeerListHeader hdr;
+ hdr.magic = PEER_LIST_HDR_MAGIC;
+ // we will save both the active and potential peers
+ hdr.num_peers = peer_list.count() + potential_peers.size();
+ hdr.ip_version = 4;
+
+ fptr.write(&hdr,sizeof(PeerListHeader));
+
+ Out(SYS_GEN|LOG_DEBUG) << "Saving list of peers to " << file << endl;
+ // first the active peers
+ for (QPtrList<Peer>::iterator itr = peer_list.begin(); itr != peer_list.end();itr++)
+ {
+ Peer* p = *itr;
+ PeerListEntry e;
+ net::Address addr = p->getAddress();
+ e.ip = addr.ip();
+ e.port = addr.port();
+ fptr.write(&e,sizeof(PeerListEntry));
+ }
+
+ // now the potential_peers
+ PPItr i = potential_peers.begin();
+ while (i != potential_peers.end())
+ {
+ net::Address addr(i->first,i->second.port);
+ PeerListEntry e;
+ e.ip = addr.ip();
+ e.port = addr.port();
+ fptr.write(&e,sizeof(PeerListEntry));
+ i++;
+ }
+ }
+ catch (bt::Error & err)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Error happened during saving of peer list : " << err.toString() << endl;
+ }
+ }
+
+ void PeerManager::loadPeerList(const QString & file)
+ {
+ bt::File fptr;
+ if (!fptr.open(file,"rb"))
+ return;
+
+ try
+ {
+ PeerListHeader hdr;
+ fptr.read(&hdr,sizeof(PeerListHeader));
+ if (hdr.magic != PEER_LIST_HDR_MAGIC || hdr.ip_version != 4)
+ throw Error("Peer list file corrupted");
+
+ Out(SYS_GEN|LOG_DEBUG) << "Loading list of peers from " << file << " (num_peers = " << hdr.num_peers << ")" << endl;
+
+ for (Uint32 i = 0;i < hdr.num_peers && !fptr.eof();i++)
+ {
+ PeerListEntry e;
+ fptr.read(&e,sizeof(PeerListEntry));
+ PotentialPeer pp;
+
+ // convert IP address to string
+ pp.ip = QString("%1.%2.%3.%4")
+ .arg((e.ip & 0xFF000000) >> 24)
+ .arg((e.ip & 0x00FF0000) >> 16)
+ .arg((e.ip & 0x0000FF00) >> 8)
+ .arg( e.ip & 0x000000FF);
+ pp.port = e.port;
+ addPotentialPeer(pp);
+ }
+
+ }
+ catch (bt::Error & err)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Error happened during saving of peer list : " << err.toString() << endl;
+ }
+ }
+
+ void PeerManager::start()
+ {
+ started = true;
+ Globals::instance().getServer().addPeerManager(this);
+ }
+
+
+ void PeerManager::stop()
+ {
+ cnt->reset();
+ available_chunks.clear();
+ started = false;
+ Globals::instance().getServer().removePeerManager(this);
+ stopped();
+ num_pending = 0;
+ }
+
+ Peer* PeerManager::findPeer(Uint32 peer_id)
+ {
+ return peer_map.find(peer_id);
+ }
+
+ void PeerManager::onRerunChoker()
+ {
+ // append a 0 ptr to killed
+ // so that the next update in TorrentControl
+ // will be forced to do the choking
+ killed.append(0);
+ }
+
+ void PeerManager::updateAvailableChunks()
+ {
+ for (Uint32 i = 0;i < available_chunks.getNumBits();i++)
+ {
+ available_chunks.set(i,cnt->get(i) > 0);
+ }
+ }
+
+ void PeerManager::peerSourceReady(kt::PeerSource* ps)
+ {
+ PotentialPeer pp;
+ while (ps->takePotentialPeer(pp))
+ addPotentialPeer(pp);
+ }
+
+ bool PeerManager::killBadPeer()
+ {
+ for (PtrMap<Uint32,Peer>::iterator i = peer_map.begin();i != peer_map.end();i++)
+ {
+ Peer* p = i->second;
+ if (p->getStats().aca_score <= -5.0 && p->getStats().aca_score > -50.0)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Killing bad peer, to make room for other peers" << endl;
+ p->kill();
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void PeerManager::pex(const QByteArray & arr)
+ {
+ if (!pex_on)
+ return;
+
+ Out(SYS_CON|LOG_NOTICE) << "PEX: found " << (arr.size() / 6) << " peers" << endl;
+ for (Uint32 i = 0;i+6 <= arr.size();i+=6)
+ {
+ Uint8 tmp[6];
+ memcpy(tmp,arr.data() + i,6);
+ PotentialPeer pp;
+ pp.port = ReadUint16(tmp,4);
+ Uint32 ip = ReadUint32(tmp,0);
+ pp.ip = QString("%1.%2.%3.%4")
+ .arg((ip & 0xFF000000) >> 24)
+ .arg((ip & 0x00FF0000) >> 16)
+ .arg((ip & 0x0000FF00) >> 8)
+ .arg( ip & 0x000000FF);
+ pp.local = false;
+
+ addPotentialPeer(pp);
+ }
+ }
+
+
+ void PeerManager::setPexEnabled(bool on)
+ {
+ if (on && tor.isPrivate())
+ return;
+
+ if (pex_on == on)
+ return;
+
+ QPtrList<Peer>::iterator i = peer_list.begin();
+ while (i != peer_list.end())
+ {
+ Peer* p = *i;
+ if (!p->isKilled())
+ p->setPexEnabled(on);
+ i++;
+ }
+ pex_on = on;
+ }
+
+ void PeerManager::setGroupIDs(Uint32 up,Uint32 down)
+ {
+ for (PtrMap<Uint32,Peer>::iterator i = peer_map.begin();i != peer_map.end();i++)
+ {
+ Peer* p = i->second;
+ p->setGroupIDs(up,down);
+ }
+ }
+}
+
+#include "peermanager.moc"
diff --git a/libktorrent/torrent/peermanager.h b/libktorrent/torrent/peermanager.h
new file mode 100644
index 0000000..d5fdb9f
--- /dev/null
+++ b/libktorrent/torrent/peermanager.h
@@ -0,0 +1,251 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPEERMANAGER_H
+#define BTPEERMANAGER_H
+
+#include <map>
+#include <qobject.h>
+#include <qptrlist.h>
+#include <util/ptrmap.h>
+#include "globals.h"
+#include "peerid.h"
+#include <util/bitset.h>
+#include <interfaces/peersource.h>
+
+namespace mse
+{
+ class StreamSocket;
+}
+
+namespace bt
+{
+ class Peer;
+ class ChunkManager;
+ class Torrent;
+ class Authenticate;
+ class ChunkCounter;
+
+
+
+ const Uint32 MAX_SIMULTANIOUS_AUTHS = 20;
+
+ /**
+ * @author Joris Guisson
+ * @brief Manages all the Peers
+ *
+ * This class manages all Peer objects.
+ * It can also open connections to other peers.
+ */
+ class PeerManager : public QObject
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor.
+ * @param tor The Torrent
+ */
+ PeerManager(Torrent & tor);
+ virtual ~PeerManager();
+
+
+ /**
+ * Check for new connections, update down and upload speed of each Peer.
+ * Initiate new connections.
+ */
+ void update();
+
+ /**
+ * Remove dead peers.
+ * @return The number of dead ones removed
+ */
+ Uint32 clearDeadPeers();
+
+ /**
+ * Get the i'th Peer.
+ * @param index
+ * @return Peer or 0 if out of range
+ */
+ Peer* getPeer(Uint32 index) {return peer_list.at(index);}
+
+ /**
+ * Find a Peer based on it's ID
+ * @param peer_id The ID
+ * @return A Peer or 0, if nothing could be found
+ */
+ Peer* findPeer(Uint32 peer_id);
+
+ /**
+ * Try to connect to some peers
+ */
+ void connectToPeers();
+
+ /**
+ * Close all Peer connections.
+ */
+ void closeAllConnections();
+
+ /**
+ * Start listening to incoming requests.
+ */
+ void start();
+
+ /**
+ * Stop listening to incoming requests.
+ */
+ void stop();
+
+ /**
+ * Kill all peers who have been choked longer then @a older_then time.
+ * @param older_then Time in milliseconds
+ */
+ void killChokedPeers(Uint32 older_then);
+
+ Uint32 getNumConnectedPeers() const {return peer_list.count();}
+ Uint32 getNumPending() const {return num_pending;}
+
+ static void setMaxConnections(Uint32 max);
+ static Uint32 getMaxConnections() {return max_connections;}
+
+ static void setMaxTotalConnections(Uint32 max);
+ static Uint32 getMaxTotalConnections() {return max_total_connections;}
+
+ static Uint32 getTotalConnections() {return total_connections;}
+
+ /// Is the peer manager started
+ bool isStarted() const {return started;}
+
+ /// Get the Torrent
+ Torrent & getTorrent() {return tor;}
+
+ /**
+ * A new connection is ready for this PeerManager.
+ * @param sock The socket
+ * @param peer_id The Peer's ID
+ * @param support What extensions the peer supports
+ */
+ void newConnection(mse::StreamSocket* sock,const PeerID & peer_id,Uint32 support);
+
+ /**
+ * Add a potential peer
+ * @param pp The PotentialPeer
+ */
+ void addPotentialPeer(const kt::PotentialPeer & pp);
+
+ /**
+ * Kills all connections to seeders.
+ * This is used when torrent download gets finished
+ * and we should drop all connections to seeders
+ */
+ void killSeeders();
+
+ /**
+ * Kills all peers that are not interested for a long time.
+ * This should be used when torrent is seeding ONLY.
+ */
+ void killUninterested();
+
+ /// Get a BitSet of all available chunks
+ const BitSet & getAvailableChunksBitSet() const {return available_chunks;}
+
+ /// Get the chunk counter.
+ ChunkCounter & getChunkCounter() {return *cnt;};
+
+ /// Are we connected to a Peer given it's PeerID ?
+ bool connectedTo(const PeerID & peer_id);
+
+ /**
+ * A peer has authenticated.
+ * @param auth The Authenticate object
+ * @param ok Wether or not the attempt was succesfull
+ */
+ void peerAuthenticated(Authenticate* auth,bool ok);
+
+ /**
+ * Save the IP's and port numbers of all peers.
+ */
+ void savePeerList(const QString & file);
+
+ /**
+ * Load the peer list again and add them to the potential peers
+ */
+ void loadPeerList(const QString & file);
+
+ typedef QPtrList<Peer>::const_iterator CItr;
+
+ CItr beginPeerList() const {return peer_list.begin();}
+ CItr endPeerList() const {return peer_list.end();}
+
+ /// Is PEX eanbled
+ bool isPexEnabled() const {return pex_on;}
+
+ /// Enable or disable PEX
+ void setPexEnabled(bool on);
+
+ /// Set the group IDs of each peer
+ void setGroupIDs(Uint32 up,Uint32 down);
+
+ public slots:
+ /**
+ * A PeerSource, has new potential peers.
+ * @param ps The PeerSource
+ */
+ void peerSourceReady(kt::PeerSource* ps);
+
+ private:
+ void updateAvailableChunks();
+ bool killBadPeer();
+ void createPeer(mse::StreamSocket* sock,const PeerID & peer_id,Uint32 support,bool local);
+ bool connectedTo(const QString & ip,Uint16 port) const;
+
+ private slots:
+ void onHave(Peer* p,Uint32 index);
+ void onBitSetRecieved(const BitSet & bs);
+ void onRerunChoker();
+ void pex(const QByteArray & arr);
+
+
+ signals:
+ void newPeer(Peer* p);
+ void peerKilled(Peer* p);
+ void stopped();
+
+ private:
+ PtrMap<Uint32,Peer> peer_map;
+ QPtrList<Peer> peer_list;
+ QPtrList<Peer> killed;
+ Torrent & tor;
+ bool started;
+ BitSet available_chunks;
+ ChunkCounter* cnt;
+ Uint32 num_pending;
+ bool pex_on;
+
+ static Uint32 max_connections;
+ static Uint32 max_total_connections;
+ static Uint32 total_connections;
+
+ std::multimap<QString,kt::PotentialPeer> potential_peers;
+
+ typedef std::multimap<QString,kt::PotentialPeer>::iterator PPItr;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/peersourcemanager.cpp b/libktorrent/torrent/peersourcemanager.cpp
new file mode 100644
index 0000000..fef55b5
--- /dev/null
+++ b/libktorrent/torrent/peersourcemanager.cpp
@@ -0,0 +1,556 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qfile.h>
+#include <klocale.h>
+#include <functions.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <kademlia/dhtbase.h>
+#include <kademlia/dhttrackerbackend.h>
+#include "tracker.h"
+#include "udptracker.h"
+#include "httptracker.h"
+#include "torrentcontrol.h"
+#include "torrent.h"
+#include "peermanager.h"
+#include "peersourcemanager.h"
+
+namespace bt
+{
+ const Uint32 INITIAL_WAIT_TIME = 30;
+ const Uint32 LONGER_WAIT_TIME = 300;
+ const Uint32 FINAL_WAIT_TIME = 1800;
+
+ PeerSourceManager::PeerSourceManager(TorrentControl* tor,PeerManager* pman)
+ : tor(tor),pman(pman),curr(0),m_dht(0),started(false),pending(false)
+ {
+ failures = 0;
+ trackers.setAutoDelete(true);
+ no_save_custom_trackers = false;
+
+ const TrackerTier* t = tor->getTorrent().getTrackerList();
+ int tier = 1;
+ while (t)
+ {
+ // add all standard trackers
+ const KURL::List & tr = t->urls;
+ KURL::List::const_iterator i = tr.begin();
+ while (i != tr.end())
+ {
+ addTracker(*i,false,tier);
+ i++;
+ }
+
+ tier++;
+ t = t->next;
+ }
+
+ //load custom trackers
+ loadCustomURLs();
+
+ connect(&timer,SIGNAL(timeout()),this,SLOT(updateCurrentManually()));
+ }
+
+ PeerSourceManager::~PeerSourceManager()
+ {
+ saveCustomURLs();
+ additional.setAutoDelete(true);
+ QPtrList<kt::PeerSource>::iterator itr = additional.begin();
+ while (itr != additional.end())
+ {
+ kt::PeerSource* ps = *itr;
+ ps->aboutToBeDestroyed();
+ itr++;
+ }
+ additional.clear();
+ }
+
+ void PeerSourceManager::addTracker(Tracker* trk)
+ {
+ trackers.insert(trk->trackerURL(),trk);
+ connect(trk,SIGNAL(peersReady( kt::PeerSource* )),
+ pman,SLOT(peerSourceReady( kt::PeerSource* )));
+ }
+
+ void PeerSourceManager::addPeerSource(kt::PeerSource* ps)
+ {
+ additional.append(ps);
+ connect(ps,SIGNAL(peersReady( kt::PeerSource* )),
+ pman,SLOT(peerSourceReady( kt::PeerSource* )));
+ }
+
+ void PeerSourceManager::removePeerSource(kt::PeerSource* ps)
+ {
+ disconnect(ps,SIGNAL(peersReady( kt::PeerSource* )),
+ pman,SLOT(peerSourceReady( kt::PeerSource* )));
+ additional.remove(ps);
+ }
+
+ void PeerSourceManager::start()
+ {
+ if (started)
+ return;
+
+ started = true;
+ QPtrList<kt::PeerSource>::iterator i = additional.begin();
+ while (i != additional.end())
+ {
+ (*i)->start();
+ i++;
+ }
+
+ if (!curr)
+ {
+ if (trackers.count() > 0)
+ {
+ switchTracker(selectTracker());
+ tor->resetTrackerStats();
+ curr->start();
+ }
+ }
+ else
+ {
+ tor->resetTrackerStats();
+ curr->start();
+ }
+ }
+
+ void PeerSourceManager::stop(WaitJob* wjob)
+ {
+ if (!started)
+ return;
+
+ started = false;
+ QPtrList<kt::PeerSource>::iterator i = additional.begin();
+ while (i != additional.end())
+ {
+ (*i)->stop();
+ i++;
+ }
+
+ if (curr)
+ curr->stop(wjob);
+
+ timer.stop();
+ statusChanged(i18n("Stopped"));
+ }
+
+ void PeerSourceManager::completed()
+ {
+ QPtrList<kt::PeerSource>::iterator i = additional.begin();
+ while (i != additional.end())
+ {
+ (*i)->completed();
+ i++;
+ }
+
+ if (curr)
+ curr->completed();
+ }
+
+ void PeerSourceManager::manualUpdate()
+ {
+ QPtrList<kt::PeerSource>::iterator i = additional.begin();
+ while (i != additional.end())
+ {
+ (*i)->manualUpdate();
+ i++;
+ }
+
+ if (curr)
+ {
+ timer.stop();
+ curr->manualUpdate();
+ }
+ }
+
+
+
+ KURL PeerSourceManager::getTrackerURL() const
+ {
+ if (curr)
+ return curr->trackerURL();
+ else
+ return KURL();
+ }
+
+ KURL::List PeerSourceManager::getTrackerURLs()
+ {
+ KURL::List urls;
+ const TrackerTier* t = tor->getTorrent().getTrackerList();
+ while (t)
+ {
+ urls += t->urls;
+ t = t->next;
+ }
+
+ urls += custom_trackers;
+ return urls;
+ }
+
+ void PeerSourceManager::addTracker(KURL url, bool custom,int tier)
+ {
+ if (trackers.contains(url))
+ return;
+
+ Tracker* trk = 0;
+ if (url.protocol() == "udp")
+ trk = new UDPTracker(url,tor,tor->getTorrent().getPeerID(),tier);
+ else
+ trk = new HTTPTracker(url,tor,tor->getTorrent().getPeerID(),tier);
+
+ addTracker(trk);
+ if (custom)
+ {
+ custom_trackers.append(url);
+ if (!no_save_custom_trackers)
+ saveCustomURLs();
+ }
+ }
+
+ bool PeerSourceManager::removeTracker(KURL url)
+ {
+ if (!custom_trackers.contains(url))
+ return false;
+
+ custom_trackers.remove(url);
+ Tracker* trk = trackers.find(url);
+ if (curr == trk)
+ {
+ // do a timed delete on the tracker, so the stop signal
+ // has plenty of time to reach it
+ trk->stop();
+ trk->timedDelete(10 * 1000);
+ trackers.setAutoDelete(false);
+ trackers.erase(url);
+ trackers.setAutoDelete(true);
+
+ if (trackers.count() > 0)
+ {
+ switchTracker(selectTracker());
+ tor->resetTrackerStats();
+ curr->start();
+ }
+ }
+ else
+ {
+ // just delete if not the current one
+ trackers.erase(url);
+ }
+ saveCustomURLs();
+ return true;
+ }
+
+ void PeerSourceManager::setTracker(KURL url)
+ {
+ Tracker* trk = trackers.find(url);
+ if (!trk)
+ return;
+
+ if (curr != trk)
+ {
+ if (curr)
+ curr->stop();
+ switchTracker(trk);
+ tor->resetTrackerStats();
+ trk->start();
+ }
+ }
+
+ void PeerSourceManager::restoreDefault()
+ {
+ KURL::List::iterator i = custom_trackers.begin();
+ while (i != custom_trackers.end())
+ {
+ Tracker* t = trackers.find(*i);
+ if (t)
+ {
+ if (curr == t)
+ {
+ if (t->isStarted())
+ t->stop();
+
+ curr = 0;
+ trackers.erase(*i);
+ if (trackers.count() > 0)
+ {
+ switchTracker(trackers.begin()->second);
+ if (started)
+ {
+ tor->resetTrackerStats();
+ curr->start();
+ }
+ }
+ }
+ else
+ {
+ trackers.erase(*i);
+ }
+ }
+ i++;
+ }
+
+ custom_trackers.clear();
+ saveCustomURLs();
+ }
+
+ void PeerSourceManager::saveCustomURLs()
+ {
+ QString trackers_file = tor->getTorDir() + "trackers";
+ QFile file(trackers_file);
+ if(!file.open(IO_WriteOnly))
+ return;
+
+ QTextStream stream(&file);
+ for (KURL::List::iterator i = custom_trackers.begin();i != custom_trackers.end();i++)
+ stream << (*i).prettyURL() << ::endl;
+ }
+
+ void PeerSourceManager::loadCustomURLs()
+ {
+ QString trackers_file = tor->getTorDir() + "trackers";
+ QFile file(trackers_file);
+ if(!file.open(IO_ReadOnly))
+ return;
+
+ no_save_custom_trackers = true;
+ QTextStream stream(&file);
+ while (!stream.atEnd())
+ {
+ KURL url = stream.readLine();
+ addTracker(url,true);
+ }
+ no_save_custom_trackers = false;
+ }
+
+ Tracker* PeerSourceManager::selectTracker()
+ {
+ Tracker* n = 0;
+ PtrMap<KURL,Tracker>::iterator i = trackers.begin();
+ while (i != trackers.end())
+ {
+ Tracker* t = i->second;
+ if (!n)
+ n = t;
+ else if (t->failureCount() < n->failureCount())
+ n = t;
+ else if (t->failureCount() == n->failureCount())
+ n = t->getTier() < n->getTier() ? t : n;
+ i++;
+ }
+
+ if (n)
+ {
+ Out(SYS_TRK|LOG_DEBUG) << "Selected tracker " << n->trackerURL().prettyURL()
+ << " (tier = " << n->getTier() << ")" << endl;
+ }
+
+ return n;
+ }
+
+ void PeerSourceManager::onTrackerError(const QString & err)
+ {
+ failures++;
+ pending = false;
+ if (started)
+ statusChanged(err);
+
+ if (!started)
+ return;
+
+ // select an other tracker
+ Tracker* trk = selectTracker();
+
+ if (!trk)
+ {
+ if (curr->failureCount() > 5)
+ {
+ // we failed to contact the only tracker 5 times in a row, so try again in
+ // 30 minutes
+ curr->setInterval(FINAL_WAIT_TIME);
+ timer.start(FINAL_WAIT_TIME * 1000,true);
+ request_time = QDateTime::currentDateTime();
+ }
+ else if (curr->failureCount() > 2)
+ {
+ // we failed to contact the only tracker 3 times in a row, so try again in
+ // a minute or 5, no need for hammering every 30 seconds
+ curr->setInterval(LONGER_WAIT_TIME);
+ timer.start(LONGER_WAIT_TIME * 1000,true);
+ request_time = QDateTime::currentDateTime();
+ }
+ else
+ {
+ // lets not hammer and wait 30 seconds
+ curr->setInterval(INITIAL_WAIT_TIME);
+ timer.start(INITIAL_WAIT_TIME * 1000,true);
+ request_time = QDateTime::currentDateTime();
+ }
+ }
+ else
+ {
+ curr->stop();
+ // switch to another one
+ switchTracker(trk);
+ if (trk->failureCount() == 0)
+ {
+ tor->resetTrackerStats();
+ curr->start();
+ }
+ else if (trk->failureCount() > 5)
+ {
+ curr->setInterval(FINAL_WAIT_TIME);
+ timer.start(FINAL_WAIT_TIME * 1000,true);
+ request_time = QDateTime::currentDateTime();
+ }
+ else if (trk->failureCount() > 2)
+ {
+ // we tried everybody 3 times and it didn't work
+ // wait 5 minutes and try again
+ curr->setInterval(LONGER_WAIT_TIME);
+ timer.start(LONGER_WAIT_TIME * 1000,true);
+ request_time = QDateTime::currentDateTime();
+ }
+ else
+ {
+ // wait 30 seconds and try again
+ curr->setInterval(INITIAL_WAIT_TIME);
+ timer.start(INITIAL_WAIT_TIME * 1000,true);
+ request_time = QDateTime::currentDateTime();
+ }
+ }
+ }
+
+ void PeerSourceManager::onTrackerOK()
+ {
+ failures = 0;
+ if (started)
+ {
+ timer.start(curr->getInterval() * 1000,true);
+ curr->scrape();
+ }
+ pending = false;
+ if (started)
+ statusChanged(i18n("OK"));
+ request_time = QDateTime::currentDateTime();
+ }
+
+ void PeerSourceManager::onTrackerRequestPending()
+ {
+ if (started)
+ statusChanged(i18n("Announcing"));
+ pending = true;
+ }
+
+ void PeerSourceManager::updateCurrentManually()
+ {
+ if (!curr)
+ return;
+
+ if (!curr->isStarted())
+ tor->resetTrackerStats();
+
+ curr->manualUpdate();
+ }
+
+ void PeerSourceManager::switchTracker(Tracker* trk)
+ {
+ if (curr == trk)
+ return;
+
+ if (curr)
+ {
+ disconnect(curr,SIGNAL(requestFailed( const QString& )),
+ this,SLOT(onTrackerError( const QString& )));
+ disconnect(curr,SIGNAL(requestOK()),this,SLOT(onTrackerOK()));
+ disconnect(curr,SIGNAL(requestPending()),this,SLOT(onTrackerRequestPending()));
+ curr = 0;
+ }
+
+ curr = trk;
+ if (curr)
+ {
+ Out(SYS_TRK|LOG_NOTICE) << "Switching to tracker " << trk->trackerURL() << endl;
+ QObject::connect(curr,SIGNAL(requestFailed( const QString& )),
+ this,SLOT(onTrackerError( const QString& )));
+
+ QObject::connect(curr,SIGNAL(requestOK()),
+ this,SLOT(onTrackerOK()));
+
+ QObject::connect(curr,SIGNAL(requestPending()),
+ this,SLOT(onTrackerRequestPending()));
+ }
+ }
+
+ Uint32 PeerSourceManager::getTimeToNextUpdate() const
+ {
+ if (pending || !started || !curr)
+ return 0;
+
+ return curr->getInterval() - request_time.secsTo(QDateTime::currentDateTime());
+ }
+
+ Uint32 PeerSourceManager::getNumSeeders() const
+ {
+ return curr ? curr->getNumSeeders() : 0;
+ }
+
+
+ Uint32 PeerSourceManager::getNumLeechers() const
+ {
+ return curr ? curr->getNumLeechers() : 0;
+ }
+
+ void PeerSourceManager::addDHT()
+ {
+ if(m_dht)
+ {
+ removePeerSource(m_dht);
+ delete m_dht;
+ }
+
+ m_dht = new dht::DHTTrackerBackend(Globals::instance().getDHT(),tor);
+
+ // add the DHT source
+ addPeerSource(m_dht);
+ }
+
+ void PeerSourceManager::removeDHT()
+ {
+ if(m_dht == 0)
+ {
+ removePeerSource(m_dht);
+ return;
+ }
+
+ removePeerSource(m_dht);
+ delete m_dht;
+ m_dht = 0;
+ }
+
+ bool PeerSourceManager::dhtStarted()
+ {
+ return m_dht != 0;
+ }
+
+
+}
+
+#include "peersourcemanager.moc"
diff --git a/libktorrent/torrent/peersourcemanager.h b/libktorrent/torrent/peersourcemanager.h
new file mode 100644
index 0000000..cdace4e
--- /dev/null
+++ b/libktorrent/torrent/peersourcemanager.h
@@ -0,0 +1,182 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPEERSOURCEMANAGER_H
+#define BTPEERSOURCEMANAGER_H
+
+#include <qtimer.h>
+#include <qdatetime.h>
+#include <qptrlist.h>
+#include <util/ptrmap.h>
+#include <interfaces/trackerslist.h>
+
+namespace kt
+{
+ class PeerSource;
+}
+
+namespace dht
+{
+ class DHTTrackerBackend;
+}
+
+namespace bt
+{
+ class Tracker;
+ class PeerManager;
+ class Torrent;
+ class TorrentControl;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * This class manages all PeerSources.
+ */
+ class PeerSourceManager : public QObject, public kt::TrackersList
+ {
+ Q_OBJECT
+
+ TorrentControl* tor;
+ PeerManager* pman;
+ PtrMap<KURL,Tracker> trackers;
+ QPtrList<kt::PeerSource> additional;
+ Tracker* curr;
+ dht::DHTTrackerBackend* m_dht;
+ bool started;
+ bool pending;
+ KURL::List custom_trackers;
+ QDateTime request_time;
+ QTimer timer;
+ Uint32 failures;
+ bool no_save_custom_trackers;
+ public:
+ PeerSourceManager(TorrentControl* tor,PeerManager* pman);
+ virtual ~PeerSourceManager();
+
+
+ /**
+ * Add a PeerSource, the difference between PeerSource and Tracker
+ * is that only one Tracker can be used at the same time,
+ * PeerSource can always be used.
+ * @param ps The PeerSource
+ */
+ void addPeerSource(kt::PeerSource* ps);
+
+ /**
+ * See if the PeerSourceManager has been started
+ */
+ bool isStarted() const {return started;}
+
+ /**
+ * Start gathering peers
+ */
+ void start();
+
+ /**
+ * Stop gathering peers
+ * @param wjob WaitJob to wait at exit for the completion of stopped events to the trackers
+ */
+ void stop(WaitJob* wjob = 0);
+
+ /**
+ * Notify peersources and trackrs that the download is complete.
+ */
+ void completed();
+
+ /**
+ * Do a manual update on all peer sources and trackers.
+ */
+ void manualUpdate();
+
+ /**
+ * Remove a Tracker or PeerSource.
+ * @param ps
+ */
+ void removePeerSource(kt::PeerSource* ps);
+
+ virtual KURL getTrackerURL() const;
+ virtual KURL::List getTrackerURLs();
+ virtual void addTracker(KURL url, bool custom = true,int tier = 1);
+ virtual bool removeTracker(KURL url);
+ virtual void setTracker(KURL url);
+ virtual void restoreDefault();
+
+ /**
+ * Get the time to the next tracker update.
+ * @return The time in seconds
+ */
+ Uint32 getTimeToNextUpdate() const;
+
+ /// Get the number of potential seeders
+ Uint32 getNumSeeders() const;
+
+ /// Get the number of potential leechers
+ Uint32 getNumLeechers() const;
+
+ /// Get the number of failures
+ Uint32 getNumFailures() const {return failures;}
+
+ ///Adds DHT as PeerSource for this torrent
+ void addDHT();
+ ///Removes DHT from PeerSourceManager for this torrent.
+ void removeDHT();
+ ///Checks if DHT is enabled
+ bool dhtStarted();
+
+ private slots:
+ /**
+ * The an error happened contacting the tracker.
+ * @param err The error
+ */
+ void onTrackerError(const QString & err);
+
+ /**
+ * Tracker update was OK.
+ * @param
+ */
+ void onTrackerOK();
+
+ /**
+ * Tracker is doing a request.
+ */
+ void onTrackerRequestPending();
+
+ /**
+ * Update the current tracker manually
+ */
+ void updateCurrentManually();
+
+ signals:
+ /**
+ * Status has changed of the tracker.
+ * @param ns The new status
+ */
+ void statusChanged(const QString & ns);
+
+ private:
+ void saveCustomURLs();
+ void loadCustomURLs();
+ void addTracker(Tracker* trk);
+ void switchTracker(Tracker* trk);
+ Tracker* selectTracker();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/peeruploader.cpp b/libktorrent/torrent/peeruploader.cpp
new file mode 100644
index 0000000..1e0dbca
--- /dev/null
+++ b/libktorrent/torrent/peeruploader.cpp
@@ -0,0 +1,130 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <set>
+#include <ksocketaddress.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <util/sha1hash.h>
+#include "peeruploader.h"
+#include "peer.h"
+#include "chunkmanager.h"
+#include "packetwriter.h"
+#include "torrent.h"
+
+using namespace KNetwork;
+
+namespace bt
+{
+
+ PeerUploader::PeerUploader(Peer* peer) : peer(peer)
+ {
+ uploaded = 0;
+ }
+
+
+ PeerUploader::~PeerUploader()
+ {}
+
+ void PeerUploader::addRequest(const Request & r)
+ {
+ // Out(SYS_CON|LOG_DEBUG) <<
+ // QString("PeerUploader::addRequest %1 %2 %3\n").arg(r.getIndex()).arg(r.getOffset()).arg(r.getLength()) << endl;
+
+ // allowed fast chunks go to the front of the queue
+ requests.append(r);
+ }
+
+ void PeerUploader::removeRequest(const Request & r)
+ {
+ // Out(SYS_CON|LOG_DEBUG) <<
+ // QString("PeerUploader::removeRequest %1 %2 %3\n").arg(r.getIndex()).arg(r.getOffset()).arg(r.getLength()) << endl;
+ requests.remove(r);
+ peer->getPacketWriter().doNotSendPiece(r,peer->getStats().fast_extensions);
+ }
+
+ Uint32 PeerUploader::update(ChunkManager & cman,Uint32 opt_unchoked)
+ {
+ Uint32 ret = uploaded;
+ uploaded = 0;
+
+ PacketWriter & pw = peer->getPacketWriter();
+
+ // if we have choked the peer do not upload
+ if (peer->areWeChoked())
+ return ret;
+
+ if (peer->isSnubbed() && !peer->areWeChoked() &&
+ !cman.completed() && peer->getID() != opt_unchoked)
+ return ret;
+
+
+ while (requests.count() > 0)
+ {
+ Request r = requests.front();
+
+ Chunk* c = cman.grabChunk(r.getIndex());
+ if (c && c->getData())
+ {
+ if (!pw.sendChunk(r.getIndex(),r.getOffset(),r.getLength(),c))
+ {
+ if (peer->getStats().fast_extensions)
+ pw.sendReject(r);
+ }
+ requests.pop_front();
+ }
+ else
+ {
+ // remove requests we can't satisfy
+ Out(SYS_CON|LOG_DEBUG) << "Cannot satisfy request" << endl;
+ if (peer->getStats().fast_extensions)
+ pw.sendReject(r);
+ requests.pop_front();
+ }
+ }
+
+ return ret;
+ }
+
+ void PeerUploader::clearAllRequests()
+ {
+ bool fast_ext = peer->getStats().fast_extensions;
+ PacketWriter & pw = peer->getPacketWriter();
+ pw.clearPieces(fast_ext);
+
+ if (fast_ext)
+ {
+ // reject all requests
+ // if the peer supports fast extensions,
+ // choke doesn't mean reject all
+ QValueList<Request>::iterator i = requests.begin();
+ while (i != requests.end())
+ {
+ pw.sendReject(*i);
+ i++;
+ }
+ }
+ requests.clear();
+ }
+
+ Uint32 PeerUploader::getNumRequests() const
+ {
+ return requests.count() + peer->getPacketWriter().getNumDataPacketsToWrite();
+ }
+}
diff --git a/libktorrent/torrent/peeruploader.h b/libktorrent/torrent/peeruploader.h
new file mode 100644
index 0000000..94aea74
--- /dev/null
+++ b/libktorrent/torrent/peeruploader.h
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPEERUPLOADER_H
+#define BTPEERUPLOADER_H
+
+#include <set>
+#include <qvaluelist.h>
+#include "request.h"
+
+
+
+namespace bt
+{
+ class Peer;
+ class ChunkManager;
+
+ const Uint32 ALLOWED_FAST_SIZE = 8;
+
+ /**
+ * @author Joris Guisson
+ * @brief Uploads pieces to a Peer
+ *
+ * This class handles the uploading of pieces to a Peer. It keeps
+ * track of a list of Request objects. All these Requests where sent
+ * by the Peer. It will upload the pieces to the Peer, making sure
+ * that the maximum upload rate isn't surpassed.
+ */
+ class PeerUploader
+ {
+ Peer* peer;
+ QValueList<Request> requests;
+ Uint32 uploaded;
+ public:
+ /**
+ * Constructor. Set the Peer.
+ * @param peer The Peer
+ */
+ PeerUploader(Peer* peer);
+ virtual ~PeerUploader();
+
+ /**
+ * Add a Request to the list of Requests.
+ * @param r The Request
+ */
+ void addRequest(const Request & r);
+
+ /**
+ * Remove a Request from the list of Requests.
+ * @param r The Request
+ */
+ void removeRequest(const Request & r);
+
+ /**
+ * Update the PeerUploader. This will check if there are Request, and
+ * will try to handle them.
+ * @param cman The ChunkManager
+ * @param opt_unchoked ID of optimisticly unchoked peer
+ * @return The number of bytes uploaded
+ */
+ Uint32 update(ChunkManager & cman,Uint32 opt_unchoked);
+
+ /// Get the number of requests
+ Uint32 getNumRequests() const;
+
+
+ void addUploadedBytes(Uint32 bytes) {uploaded += bytes;}
+
+ /**
+ * Clear all pending requests.
+ */
+ void clearAllRequests();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/piece.cpp b/libktorrent/torrent/piece.cpp
new file mode 100644
index 0000000..0fff862
--- /dev/null
+++ b/libktorrent/torrent/piece.cpp
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "piece.h"
+
+namespace bt
+{
+
+ Piece::Piece(Uint32 index, Uint32 off, Uint32 len, Uint32 peer,const Uint8* data)
+ : Request(index, off, len, peer),data(data)
+ {}
+
+
+ Piece::~Piece()
+ {}
+
+
+}
diff --git a/libktorrent/torrent/piece.h b/libktorrent/torrent/piece.h
new file mode 100644
index 0000000..9e749db
--- /dev/null
+++ b/libktorrent/torrent/piece.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPIECE_H
+#define BTPIECE_H
+
+#include "request.h"
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class Piece : public Request
+ {
+ public:
+ Piece(Uint32 index, Uint32 off, Uint32 len, Uint32 peer,const Uint8* data);
+ virtual ~Piece();
+
+ const Uint8* getData() const {return data;}
+ private:
+ const Uint8* data;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/preallocationthread.cpp b/libktorrent/torrent/preallocationthread.cpp
new file mode 100644
index 0000000..6fb2100
--- /dev/null
+++ b/libktorrent/torrent/preallocationthread.cpp
@@ -0,0 +1,134 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <util/log.h>
+#include <util/error.h>
+#include <qfile.h>
+#include <klocale.h>
+#include "preallocationthread.h"
+#include "chunkmanager.h"
+#include "globals.h"
+
+#ifndef O_LARGEFILE
+# define O_LARGEFILE 0
+#endif
+
+namespace bt
+{
+
+ PreallocationThread::PreallocationThread(ChunkManager* cman) : cman(cman),stopped(false),not_finished(false),done(false)
+ {
+ bytes_written = 0;
+ }
+
+
+ PreallocationThread::~PreallocationThread()
+ {}
+
+ void PreallocationThread::run()
+ {
+ try
+ {
+ cman->preallocateDiskSpace(this);
+ }
+ catch (Error & err)
+ {
+ setErrorMsg(err.toString());
+ }
+
+ mutex.lock();
+ done = true;
+ mutex.unlock();
+ Out(SYS_GEN|LOG_NOTICE) << "PreallocationThread has finished" << endl;
+ }
+
+ void PreallocationThread::stop()
+ {
+ mutex.lock();
+ stopped = true;
+ mutex.unlock();
+ }
+
+ void PreallocationThread::setErrorMsg(const QString & msg)
+ {
+ mutex.lock();
+ error_msg = msg; stopped = true;
+ mutex.unlock();
+ }
+
+ bool PreallocationThread::isStopped() const
+ {
+ mutex.lock();
+ bool tmp = stopped;
+ mutex.unlock();
+ return tmp;
+ }
+
+ bool PreallocationThread::errorHappened() const
+ {
+ mutex.lock();
+ bool ret = !error_msg.isNull();
+ mutex.unlock();
+ return ret;
+ }
+
+ void PreallocationThread::written(Uint64 nb)
+ {
+ mutex.lock();
+ bytes_written += nb;
+ mutex.unlock();
+ }
+
+ Uint64 PreallocationThread::bytesWritten()
+ {
+ mutex.lock();
+ Uint64 tmp = bytes_written;
+ mutex.unlock();
+ return tmp;
+ }
+
+ bool PreallocationThread::isDone() const
+ {
+ mutex.lock();
+ bool tmp = done;
+ mutex.unlock();
+ return tmp;
+ }
+
+ bool PreallocationThread::isNotFinished() const
+ {
+ mutex.lock();
+ bool tmp = not_finished;
+ mutex.unlock();
+ return tmp;
+ }
+
+ void PreallocationThread::setNotFinished()
+ {
+ mutex.lock();
+ not_finished = true;
+ mutex.unlock();
+ }
+}
diff --git a/libktorrent/torrent/preallocationthread.h b/libktorrent/torrent/preallocationthread.h
new file mode 100644
index 0000000..31bd668
--- /dev/null
+++ b/libktorrent/torrent/preallocationthread.h
@@ -0,0 +1,94 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPREALLOCATIONTHREAD_H
+#define BTPREALLOCATIONTHREAD_H
+
+#include <qstring.h>
+#include <qthread.h>
+#include <qmap.h>
+#include <qmutex.h>
+#include <util/constants.h>
+
+
+
+namespace bt
+{
+ class ChunkManager;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Thread to preallocate diskspace
+ */
+ class PreallocationThread : public QThread
+ {
+ ChunkManager* cman;
+ bool stopped,not_finished,done;
+ QString error_msg;
+ Uint64 bytes_written;
+ mutable QMutex mutex;
+ public:
+ PreallocationThread(ChunkManager* cman);
+ virtual ~PreallocationThread();
+
+ virtual void run();
+
+
+ /**
+ * Stop the thread.
+ */
+ void stop();
+
+ /**
+ * Set an error message, also calls stop
+ * @param msg The message
+ */
+ void setErrorMsg(const QString & msg);
+
+ /// See if the thread has been stopped
+ bool isStopped() const;
+
+ /// Did an error occur during the preallocation ?
+ bool errorHappened() const;
+
+ /// Get the error_msg
+ const QString & errorMessage() const {return error_msg;}
+
+ /// nb Number of bytes have been written
+ void written(Uint64 nb);
+
+ /// Get the number of bytes written
+ Uint64 bytesWritten();
+
+ /// Allocation was aborted, so the next time the torrent is started it needs to be started again
+ void setNotFinished();
+
+ /// See if the allocation hasn't completed yet
+ bool isNotFinished() const;
+
+ /// See if the thread was done
+ bool isDone() const;
+ private:
+ bool expand(const QString & path,Uint64 max_size);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/queuemanager.cpp b/libktorrent/torrent/queuemanager.cpp
new file mode 100644
index 0000000..4135f8f
--- /dev/null
+++ b/libktorrent/torrent/queuemanager.cpp
@@ -0,0 +1,811 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 "queuemanager.h"
+
+#include <qstring.h>
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <util/sha1hash.h>
+#include <util/waitjob.h>
+#include <util/fileops.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include <torrent/torrentcontrol.h>
+#include <interfaces/torrentinterface.h>
+#include <interfaces/trackerslist.h>
+#include <settings.h>
+
+
+using namespace kt;
+
+namespace bt
+{
+
+ QueueManager::QueueManager() : QObject(),exiting(false)
+ {
+ downloads.setAutoDelete(true);
+ max_downloads = 0;
+ max_seeds = 0; //for testing. Needs to be added to Settings::
+
+ keep_seeding = true; //test. Will be passed from Core
+ paused_state = false;
+ }
+
+
+ QueueManager::~QueueManager()
+ {}
+
+ void QueueManager::append(kt::TorrentInterface* tc)
+ {
+ downloads.append(tc);
+ downloads.sort();
+
+ connect(tc, SIGNAL(diskSpaceLow(kt::TorrentInterface*, bool)), this, SLOT(onLowDiskSpace(kt::TorrentInterface*, bool)));
+ connect(tc, SIGNAL(torrentStopped(kt::TorrentInterface*)), this, SLOT(torrentStopped(kt::TorrentInterface*)));
+ }
+
+ void QueueManager::remove(kt::TorrentInterface* tc)
+ {
+ paused_torrents.erase(tc);
+
+ int index = downloads.findRef(tc);
+
+ if (index != -1)
+ downloads.remove(index);
+ else
+ Out(SYS_GEN | LOG_IMPORTANT) << "Could not delete removed torrent control." << endl;
+ }
+
+ void QueueManager::clear()
+ {
+ Uint32 nd = downloads.count();
+
+ paused_torrents.clear();
+ downloads.clear();
+
+ // wait for a second to allow all http jobs to send the stopped event
+ if (nd > 0)
+ SynchronousWait(1000);
+ }
+
+ kt::TorrentStartResponse QueueManager::start(kt::TorrentInterface* tc, bool user)
+ {
+ const TorrentStats & s = tc->getStats();
+
+ bool start_tc = user;
+
+ bool check_done = false;
+
+ if (tc->isCheckingData(check_done) && !check_done)
+ return kt::BUSY_WITH_DATA_CHECK;
+
+ if (!user)
+ {
+ if (s.completed)
+ start_tc = (max_seeds == 0 || getNumRunning(false, true) < max_seeds);
+ else
+ start_tc = (max_downloads == 0 || getNumRunning(true) < max_downloads);
+ }
+ else
+ {
+ //User started this torrent so make it user controlled
+ tc->setPriority(0);
+ }
+
+ if (start_tc)
+ {
+
+ if (!s.completed) //no need to check diskspace for seeding torrents
+ {
+ //check diskspace
+ bool shortDiskSpace = !tc->checkDiskSpace(false);
+
+ if (shortDiskSpace)
+ {
+ //we're short!
+
+ switch (Settings::startDownloadsOnLowDiskSpace())
+ {
+
+ case 0: //don't start!
+ tc->setPriority(0);
+ return kt::NOT_ENOUGH_DISKSPACE;
+
+ case 1: //ask user
+ if (KMessageBox::questionYesNo(0, i18n("You don't have enough disk space to download this torrent. Are you sure you want to continue?"), i18n("Insufficient disk space for %1").arg(s.torrent_name)) == KMessageBox::No)
+ {
+ tc->setPriority(0);
+ return kt::USER_CANCELED;
+ }
+ else
+ break;
+
+ case 2: //force start
+ break;
+ }
+ }
+ }
+
+ Out(SYS_GEN | LOG_NOTICE) << "Starting download" << endl;
+
+ float ratio = kt::ShareRatio(s);
+
+ float max_ratio = tc->getMaxShareRatio();
+
+ if (s.completed && max_ratio > 0 && ratio >= max_ratio)
+ {
+ if (KMessageBox::questionYesNo(0, i18n("Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start seeding anyway?").arg(s.torrent_name), i18n("Maximum share ratio limit reached.")) == KMessageBox::Yes)
+ {
+ tc->setMaxShareRatio(0.00f);
+ startSafely(tc);
+ }
+ else
+ return kt::USER_CANCELED;
+ }
+ else
+ startSafely(tc);
+ }
+ else
+ {
+ return kt::QM_LIMITS_REACHED;
+ }
+
+ return kt::START_OK;
+ }
+
+ void QueueManager::stop(kt::TorrentInterface* tc, bool user)
+ {
+ bool check_done = false;
+
+ if (tc->isCheckingData(check_done) && !check_done)
+ return;
+
+ const TorrentStats & s = tc->getStats();
+
+ if (s.running)
+ {
+ stopSafely(tc, user);
+ }
+
+ if (user) //dequeue it
+ tc->setPriority(0);
+ }
+
+ void QueueManager::startall(int type)
+ {
+ QPtrList<kt::TorrentInterface>::iterator i = downloads.begin();
+
+ while (i != downloads.end())
+ {
+ kt::TorrentInterface* tc = *i;
+
+ if (type >= 3)
+ start(tc, true);
+ else
+ {
+ if ((tc->getStats().completed && type == 2) || (!tc->getStats().completed && type == 1) || (type == 3))
+ start(tc, true);
+ }
+
+ i++;
+ }
+ }
+
+ void QueueManager::stopall(int type)
+ {
+ QPtrList<kt::TorrentInterface>::iterator i = downloads.begin();
+
+ while (i != downloads.end())
+ {
+ kt::TorrentInterface* tc = *i;
+
+ const TorrentStats & s = tc->getStats();
+
+ if (tc->getStats().running)
+ {
+ try
+ {
+ if (type >= 3)
+ stopSafely(tc, true);
+ else if ((s.completed && type == 2) || (!s.completed && type == 1))
+ stopSafely(tc, true);
+ }
+ catch (bt::Error & err)
+ {
+ QString msg =
+ i18n("Error stopping torrent %1 : %2")
+ .arg(s.torrent_name).arg(err.toString());
+ KMessageBox::error(0, msg, i18n("Error"));
+ }
+ }
+ else //if torrent is not running but it is queued we need to make it user controlled
+ if ((s.completed && type == 2) || (!s.completed && type == 1) || (type == 3))
+ tc->setPriority(0);
+
+ i++;
+ }
+ }
+
+ void QueueManager::onExit(WaitJob* wjob)
+ {
+ exiting = true;
+ QPtrList<kt::TorrentInterface>::iterator i = downloads.begin();
+
+ while (i != downloads.end())
+ {
+ kt::TorrentInterface* tc = *i;
+
+ if (tc->getStats().running)
+ {
+ stopSafely(tc, false, wjob);
+ }
+
+ i++;
+ }
+ }
+
+ void QueueManager::startNext()
+ {
+ orderQueue();
+ }
+
+ int QueueManager::countDownloads()
+ {
+ int nr = 0;
+ QPtrList<TorrentInterface>::const_iterator i = downloads.begin();
+
+ while (i != downloads.end())
+ {
+ if (!(*i)->getStats().completed)
+ ++nr;
+
+ ++i;
+ }
+
+ return nr;
+ }
+
+ int QueueManager::countSeeds()
+ {
+ int nr = 0;
+ QPtrList<TorrentInterface>::const_iterator i = downloads.begin();
+
+ while (i != downloads.end())
+ {
+ if ((*i)->getStats().completed)
+ ++nr;
+
+ ++i;
+ }
+
+ return nr;
+ }
+
+ int QueueManager::getNumRunning(bool onlyDownload, bool onlySeed)
+ {
+ int nr = 0;
+ // int test = 1;
+ QPtrList<TorrentInterface>::const_iterator i = downloads.begin();
+
+ while (i != downloads.end())
+ {
+ const TorrentInterface* tc = *i;
+
+ const TorrentStats & s = tc->getStats();
+
+ //Out() << "Torrent " << test++ << s.torrent_name << " priority: " << tc->getPriority() << endl;
+ if (s.running)
+ {
+ if (onlyDownload)
+ {
+ if (!s.completed) nr++;
+ }
+ else
+ {
+ if (onlySeed)
+ {
+ if (s.completed) nr++;
+ }
+ else
+ nr++;
+ }
+ }
+
+ i++;
+ }
+
+ // Out() << endl;
+ return nr;
+ }
+
+ int QueueManager::getNumRunning(bool userControlled, bool onlyDownloads, bool onlySeeds)
+ {
+ int nr = 0;
+ // int test = 1;
+ QPtrList<TorrentInterface>::const_iterator i = downloads.begin();
+
+ while (i != downloads.end())
+ {
+ const TorrentInterface* tc = *i;
+
+ const TorrentStats & s = tc->getStats();
+
+ //Out() << "Torrent " << test++ << s.torrent_name << " priority: " << tc->getPriority() << endl;
+ if (s.running)
+ {
+ if (onlyDownloads)
+ {
+ if (!s.completed && (userControlled && s.user_controlled)) nr++;
+ }
+ else
+ {
+ if (onlySeeds)
+ {
+ if (s.completed && (userControlled && s.user_controlled)) nr++;
+ }
+ else
+ if (userControlled && s.user_controlled) nr++;
+ }
+ }
+
+ i++;
+ }
+
+ // Out() << endl;
+ return nr;
+ }
+
+ QPtrList<kt::TorrentInterface>::iterator QueueManager::begin()
+ {
+ return downloads.begin();
+ }
+
+ QPtrList<kt::TorrentInterface>::iterator QueueManager::end()
+ {
+ return downloads.end();
+ }
+
+ void QueueManager::setMaxDownloads(int m)
+ {
+ max_downloads = m;
+ }
+
+ void QueueManager::setMaxSeeds(int m)
+ {
+ max_seeds = m;
+ }
+
+ void QueueManager::setKeepSeeding(bool ks)
+ {
+ keep_seeding = ks;
+ }
+
+ bool QueueManager::allreadyLoaded(const SHA1Hash & ih) const
+ {
+ QPtrList<kt::TorrentInterface>::const_iterator itr = downloads.begin();
+
+ while (itr != downloads.end())
+ {
+ const TorrentControl* tor = (const TorrentControl*)(*itr);
+
+ if (tor->getTorrent().getInfoHash() == ih)
+ return true;
+
+ itr++;
+ }
+
+ return false;
+ }
+
+ void QueueManager::mergeAnnounceList(const SHA1Hash & ih, const TrackerTier* trk)
+
+ {
+ QPtrList<kt::TorrentInterface>::iterator itr = downloads.begin();
+
+ while (itr != downloads.end())
+ {
+ TorrentControl* tor = (TorrentControl*)(*itr);
+
+ if (tor->getTorrent().getInfoHash() == ih)
+ {
+ TrackersList* ta = tor->getTrackersList();
+ ta->merge(trk);
+ return;
+ }
+
+ itr++;
+ }
+ }
+
+ void QueueManager::orderQueue()
+ {
+ if (!downloads.count())
+ return;
+
+ if (paused_state || exiting)
+ return;
+
+ downloads.sort();
+
+ QPtrList<TorrentInterface>::const_iterator it = downloads.begin();
+ QPtrList<TorrentInterface>::const_iterator its = downloads.end();
+
+
+ if (max_downloads != 0 || max_seeds != 0)
+ {
+ bt::QueuePtrList download_queue;
+ bt::QueuePtrList seed_queue;
+
+ int user_downloading = 0;
+ int user_seeding = 0;
+
+ for (; it != downloads.end(); ++it)
+ {
+ TorrentInterface* tc = *it;
+
+ const TorrentStats & s = tc->getStats();
+
+ if (s.running && s.user_controlled)
+ {
+ if (!s.completed)
+ ++user_downloading;
+ else
+ ++user_seeding;
+ }
+
+ if (!s.user_controlled && !tc->isMovingFiles() && !s.stopped_by_error)
+ {
+ if (s.completed)
+ seed_queue.append(tc);
+ else
+ download_queue.append(tc);
+ }
+ }
+
+ int max_qm_downloads = max_downloads - user_downloading;
+
+ int max_qm_seeds = max_seeds - user_seeding;
+
+ //stop all QM started torrents
+
+ for (Uint32 i = max_qm_downloads; i < download_queue.count() && max_downloads; ++i)
+ {
+ TorrentInterface* tc = download_queue.at(i);
+
+ const TorrentStats & s = tc->getStats();
+
+ if (s.running && !s.user_controlled && !s.completed)
+ {
+ Out(SYS_GEN | LOG_DEBUG) << "QM Stopping: " << s.torrent_name << endl;
+ stop(tc);
+ }
+ }
+
+ //stop all QM started torrents
+ for (Uint32 i = max_qm_seeds; i < seed_queue.count() && max_seeds; ++i)
+ {
+ TorrentInterface* tc = seed_queue.at(i);
+
+ const TorrentStats & s = tc->getStats();
+
+ if (s.running && !s.user_controlled && s.completed)
+ {
+ Out(SYS_GEN | LOG_NOTICE) << "QM Stopping: " << s.torrent_name << endl;
+ stop(tc);
+ }
+ }
+
+ //Now start all needed torrents
+ if (max_downloads == 0)
+ max_qm_downloads = download_queue.count();
+
+ if (max_seeds == 0)
+ max_qm_seeds = seed_queue.count();
+
+ int counter = 0;
+
+ for (Uint32 i = 0; counter < max_qm_downloads && i < download_queue.count(); ++i)
+ {
+ TorrentInterface* tc = download_queue.at(i);
+
+ const TorrentStats & s = tc->getStats();
+
+ if (!s.running && !s.completed && !s.user_controlled)
+ {
+ start(tc, false);
+
+ if (tc->getStats().stopped_by_error)
+ {
+ tc->setPriority(0);
+ continue;
+ }
+ }
+
+ ++counter;
+ }
+
+ counter = 0;
+
+ for (Uint32 i = 0; counter < max_qm_seeds && i < seed_queue.count(); ++i)
+ {
+ TorrentInterface* tc = seed_queue.at(i);
+
+ const TorrentStats & s = tc->getStats();
+
+ if (!s.running && s.completed && !s.user_controlled)
+ {
+ start(tc, false);
+
+ if (tc->getStats().stopped_by_error)
+ {
+ tc->setPriority(0);
+ continue;
+ }
+ }
+
+ ++counter;
+ }
+ }
+ else
+ {
+ //no limits at all
+
+ for (it = downloads.begin(); it != downloads.end(); ++it)
+ {
+ TorrentInterface* tc = *it;
+
+ const TorrentStats & s = tc->getStats();
+
+ if (!s.running && !s.user_controlled && !s.stopped_by_error && !tc->isMovingFiles())
+ {
+ start(tc, false);
+ if (tc->getStats().stopped_by_error)
+ tc->setPriority(0);
+ }
+ }
+ }
+
+ }
+
+ void QueueManager::torrentFinished(kt::TorrentInterface* tc)
+ {
+ //dequeue this tc
+ tc->setPriority(0);
+ //make sure the max_seeds is not reached
+// if(max_seeds !=0 && max_seeds < getNumRunning(false,true))
+// tc->stop(true);
+
+ if (keep_seeding)
+ torrentAdded(tc, false, false);
+ else
+ stop(tc,true);
+
+ orderQueue();
+ }
+
+ void QueueManager::torrentAdded(kt::TorrentInterface* tc, bool user, bool start_torrent)
+ {
+ if (!user)
+ {
+ QPtrList<TorrentInterface>::const_iterator it = downloads.begin();
+
+ while (it != downloads.end())
+ {
+ TorrentInterface* _tc = *it;
+ int p = _tc->getPriority();
+
+ if (p == 0)
+ break;
+ else
+ _tc->setPriority(++p);
+
+ ++it;
+ }
+
+ tc->setPriority(1);
+ }
+ else
+ {
+ tc->setPriority(0);
+ if(start_torrent)
+ start(tc, true);
+ }
+
+ orderQueue();
+ }
+
+ void QueueManager::torrentRemoved(kt::TorrentInterface* tc)
+ {
+ remove(tc);
+
+ orderQueue();
+ }
+
+ void QueueManager::setPausedState(bool pause)
+ {
+ paused_state = pause;
+ if (!pause)
+ {
+ std::set<kt::TorrentInterface*>::iterator it = paused_torrents.begin();
+ while (it != paused_torrents.end())
+ {
+ TorrentInterface* tc = *it;
+ startSafely(tc);
+ it++;
+ }
+
+ paused_torrents.clear();
+ orderQueue();
+ }
+ else
+ {
+ QPtrList<TorrentInterface>::const_iterator it = downloads.begin();
+ for (; it != downloads.end(); it++)
+ {
+ TorrentInterface* tc = *it;
+
+ const TorrentStats & s = tc->getStats();
+
+ if (s.running)
+ {
+ paused_torrents.insert(tc);
+ stopSafely(tc, false);
+ }
+ }
+ }
+ }
+
+ void QueueManager::enqueue(kt::TorrentInterface* tc)
+ {
+ //if a seeding torrent reached its maximum share ratio or maximum seed time don't enqueue it...
+ if (tc->getStats().completed && (tc->overMaxRatio() || tc->overMaxSeedTime()))
+ {
+ Out(SYS_GEN | LOG_IMPORTANT) << "Torrent has reached max share ratio or max seed time and cannot be started automatically." << endl;
+ emit queuingNotPossible(tc);
+ return;
+ }
+
+ torrentAdded(tc, false, false);
+ }
+
+ void QueueManager::dequeue(kt::TorrentInterface* tc)
+ {
+ int tp = tc->getPriority();
+ bool completed = tc->getStats().completed;
+ QPtrList<TorrentInterface>::const_iterator it = downloads.begin();
+
+ while (it != downloads.end())
+ {
+ TorrentInterface* _tc = *it;
+ bool _completed = _tc->getStats().completed;
+
+ if (tc == _tc || (_completed != completed))
+ {
+ ++it;
+ continue;
+ }
+
+ int p = _tc->getPriority();
+
+ if (p < tp)
+ break;
+ else
+ _tc->setPriority(--p);
+
+ ++it;
+ }
+
+ tc->setPriority(0);
+
+ orderQueue();
+ }
+
+ void QueueManager::queue(kt::TorrentInterface* tc)
+ {
+ if (tc->getPriority() == 0)
+ enqueue(tc);
+ else
+ dequeue(tc);
+ }
+
+ void QueueManager::startSafely(kt::TorrentInterface* tc)
+ {
+ try
+ {
+ tc->start();
+ }
+ catch (bt::Error & err)
+ {
+ const TorrentStats & s = tc->getStats();
+
+ QString msg =
+ i18n("Error starting torrent %1 : %2")
+ .arg(s.torrent_name).arg(err.toString());
+
+ KMessageBox::error(0, msg, i18n("Error"));
+ }
+ }
+
+ void QueueManager::stopSafely(kt::TorrentInterface* tc, bool user, WaitJob* wjob)
+ {
+ try
+ {
+ tc->stop(user, wjob);
+ }
+ catch (bt::Error & err)
+ {
+ const TorrentStats & s = tc->getStats();
+
+ QString msg =
+ i18n("Error stopping torrent %1 : %2")
+ .arg(s.torrent_name).arg(err.toString());
+
+ KMessageBox::error(0, msg, i18n("Error"));
+ }
+ }
+
+ void QueueManager::onLowDiskSpace(kt::TorrentInterface* tc, bool toStop)
+ {
+ if(toStop)
+ {
+ stop(tc, false);
+ }
+
+ //then emit the signal to inform trayicon to show passive popup
+ emit lowDiskSpace(tc, toStop);
+ }
+
+ void QueueManager::torrentStopped(kt::TorrentInterface* tc )
+ {
+ orderQueue();
+ }
+
+ /////////////////////////////////////////////////////////////////////////////////////////////
+
+
+ QueuePtrList::QueuePtrList() : QPtrList<kt::TorrentInterface>()
+ {}
+
+ QueuePtrList::~QueuePtrList()
+ {}
+
+ int QueuePtrList::compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2)
+ {
+ kt::TorrentInterface* tc1 = (kt::TorrentInterface*) item1;
+ kt::TorrentInterface* tc2 = (kt::TorrentInterface*) item2;
+
+ if (tc1->getPriority() == tc2->getPriority())
+ return 0;
+
+ if (tc1->getPriority() == 0 && tc2->getPriority() != 0)
+ return 1;
+ else if (tc1->getPriority() != 0 && tc2->getPriority() == 0)
+ return -1;
+
+ return tc1->getPriority() > tc2->getPriority() ? -1 : 1;
+
+ return 0;
+ }
+}
+
+#include "queuemanager.moc"
diff --git a/libktorrent/torrent/queuemanager.h b/libktorrent/torrent/queuemanager.h
new file mode 100644
index 0000000..658c252
--- /dev/null
+++ b/libktorrent/torrent/queuemanager.h
@@ -0,0 +1,173 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 QUEUEMANAGER_H
+#define QUEUEMANAGER_H
+
+#include <set>
+#include <qobject.h>
+#include <qptrlist.h>
+
+#include <interfaces/torrentinterface.h>
+
+namespace kt
+{
+ class TrackersList;
+}
+
+namespace bt
+{
+ class SHA1Hash;
+ class AnnounceList;
+ struct TrackerTier;
+ class WaitJob;
+
+ class QueuePtrList : public QPtrList<kt::TorrentInterface>
+ {
+ public:
+ QueuePtrList();
+ virtual ~QueuePtrList();
+
+ protected:
+ int compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2);
+ };
+
+ /**
+ * @author Ivan Vasic
+ * @brief This class contains list of all TorrentControls and is responsible for starting/stopping them
+ */
+ class QueueManager : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ QueueManager();
+ virtual ~QueueManager();
+
+ void append(kt::TorrentInterface* tc);
+ void remove(kt::TorrentInterface* tc);
+ void clear();
+
+ kt::TorrentStartResponse start(kt::TorrentInterface* tc, bool user = true);
+ void stop(kt::TorrentInterface* tc, bool user = false);
+
+ void stopall(int type);
+ void startall(int type);
+
+ /**
+ * Stop all running torrents
+ * @param wjob WaitJob which waits for stopped events to reach the tracker
+ */
+ void onExit(WaitJob* wjob);
+
+ /**
+ * Enqueue/Dequeue function. Places a torrent in queue.
+ * If the torrent is already in queue this will remove it from queue.
+ * @param tc TorrentControl pointer.
+ */
+ void queue(kt::TorrentInterface* tc);
+
+ int count() { return downloads.count(); }
+ int countDownloads();
+ int countSeeds();
+
+ int getNumRunning(bool onlyDownload = false, bool onlySeed = false);
+ int getNumRunning(bool userControlled, bool onlyDownloads, bool onlySeeds);
+
+ void startNext();
+
+ typedef QPtrList<kt::TorrentInterface>::iterator iterator;
+
+ iterator begin();
+ iterator end();
+
+ /**
+ * See if we already loaded a torrent.
+ * @param ih The info hash of a torrent
+ * @return true if we do, false if we don't
+ */
+ bool allreadyLoaded(const SHA1Hash & ih) const;
+
+
+ /**
+ * Merge announce lists to a torrent
+ * @param ih The info_hash of the torrent to merge to
+ * @param trk First tier of trackers
+ */
+ void mergeAnnounceList(const SHA1Hash & ih,const TrackerTier* trk);
+
+ void setMaxDownloads(int m);
+ void setMaxSeeds(int m);
+
+ void setKeepSeeding(bool ks);
+
+ /**
+ * Sets global paused state for QueueManager and stopps all running torrents.
+ * No torrents will be automatically started/stopped with QM.
+ */
+ void setPausedState(bool pause);
+
+ /**
+ * Places all torrents from downloads in the right order in queue.
+ * Use this when torrent priorities get changed
+ */
+ void orderQueue();
+
+ signals:
+ /**
+ * User tried to enqueue a torrent that has reached max share ratio. It's not possible.
+ * Signal should be connected to SysTray slot which shows appropriate KPassivePopup info.
+ * @param tc The torrent in question.
+ */
+ void queuingNotPossible(kt::TorrentInterface* tc);
+
+ /**
+ * Diskspace is running low.
+ * Signal should be connected to SysTray slot which shows appropriate KPassivePopup info.
+ * @param tc The torrent in question.
+ */
+ void lowDiskSpace(kt::TorrentInterface* tc, bool stopped);
+
+ public slots:
+ void torrentFinished(kt::TorrentInterface* tc);
+ void torrentAdded(kt::TorrentInterface* tc, bool user, bool start_torrent);
+ void torrentRemoved(kt::TorrentInterface* tc);
+ void torrentStopped(kt::TorrentInterface* tc);
+ void onLowDiskSpace(kt::TorrentInterface* tc, bool toStop);
+
+ private:
+ void enqueue(kt::TorrentInterface* tc);
+ void dequeue(kt::TorrentInterface* tc);
+ void startSafely(kt::TorrentInterface* tc);
+ void stopSafely(kt::TorrentInterface* tc,bool user,WaitJob* wjob = 0);
+
+ bt::QueuePtrList downloads;
+ std::set<kt::TorrentInterface*> paused_torrents;
+
+ int max_downloads;
+ int max_seeds;
+
+
+ bool paused_state;
+ bool keep_seeding;
+ bool exiting;
+ };
+}
+#endif
diff --git a/libktorrent/torrent/request.cpp b/libktorrent/torrent/request.cpp
new file mode 100644
index 0000000..413eb11
--- /dev/null
+++ b/libktorrent/torrent/request.cpp
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "request.h"
+
+namespace bt
+{
+ Request::Request() : index(0),off(0),len(0),peer(0)
+ {}
+
+ Request::Request(Uint32 index,Uint32 off,Uint32 len,Uint32 peer)
+ : index(index),off(off),len(len),peer(peer)
+ {}
+
+ Request::Request(const Request & r)
+ : index(r.index),off(r.off),len(r.len),peer(r.peer)
+ {}
+
+ Request::~Request()
+ {}
+
+
+ Request & Request::operator = (const Request & r)
+ {
+ index = r.index;
+ off = r.off;
+ len = r.len;
+ peer = r.peer;
+ return *this;
+ }
+
+ bool operator == (const Request & a,const Request & b)
+ {
+ return a.index == b.index && a.len == b.len && a.off == b.off;
+ }
+}
diff --git a/libktorrent/torrent/request.h b/libktorrent/torrent/request.h
new file mode 100644
index 0000000..aeeff78
--- /dev/null
+++ b/libktorrent/torrent/request.h
@@ -0,0 +1,96 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTREQUEST_H
+#define BTREQUEST_H
+
+#include "globals.h"
+
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Request of a piece sent to other peers
+ *
+ * This class keeps track of a request of a piece.
+ * The Request consists of an index (the index of the chunk),
+ * offset into the chunk and the length of a piece.
+ *
+ * The PeerID of the Peer who sent the request is also kept.
+ */
+ class Request
+ {
+ public:
+ /**
+ * Constructor, set everything to 0.
+ */
+ Request();
+
+ /**
+ * Constructor, set the index, offset,length and peer
+ * @param index The index of the chunk
+ * @param off The offset into the chunk
+ * @param len The length of the piece
+ * @param peer The ID of the Peer who sent the request
+ */
+ Request(Uint32 index,Uint32 off,Uint32 len,Uint32 peer);
+
+ /**
+ * Copy constructor.
+ * @param r Request to copy
+ */
+ Request(const Request & r);
+ virtual ~Request();
+
+ /// Get the index of the chunk
+ Uint32 getIndex() const {return index;}
+
+ /// Get the offset into the chunk
+ Uint32 getOffset() const {return off;}
+
+ /// Get the length of a the piece
+ Uint32 getLength() const {return len;}
+
+ /// Get the sending Peer
+ Uint32 getPeer() const {return peer;}
+
+ /**
+ * Assignmenth operator.
+ * @param r The Request to copy
+ */
+ Request & operator = (const Request & r);
+
+ /**
+ * Compare two requests. Return true if they are the same.
+ * This only compares the index,offset and length.
+ * @param a The first request
+ * @param b The second request
+ * @return true if they are equal
+ */
+ friend bool operator == (const Request & a,const Request & b);
+ private:
+ Uint32 index,off,len;
+ Uint32 peer;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/server.cpp b/libktorrent/torrent/server.cpp
new file mode 100644
index 0000000..e3d00ae
--- /dev/null
+++ b/libktorrent/torrent/server.cpp
@@ -0,0 +1,200 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qserversocket.h>
+#include <mse/streamsocket.h>
+#include <util/sha1hash.h>
+#include <util/log.h>
+#include <net/portlist.h>
+#include <mse/encryptedserverauthenticate.h>
+#include "globals.h"
+#include "torrent.h"
+#include "server.h"
+#include "peermanager.h"
+#include "serverauthenticate.h"
+#include "ipblocklist.h"
+#include "authenticationmonitor.h"
+
+
+namespace bt
+{
+
+ class ServerSocket : public QServerSocket
+ {
+ Server* srv;
+ public:
+ ServerSocket(Server* srv,Uint16 port) : QServerSocket(port),srv(srv)
+ {
+ QSocketDevice* sd = socketDevice();
+ if (sd)
+ sd->setAddressReusable(true);
+ }
+
+ virtual ~ServerSocket()
+ {}
+
+ virtual void newConnection(int socket)
+ {
+ srv->newConnection(socket);
+ }
+ };
+
+
+
+
+ Server::Server(Uint16 port) : sock(0),port(0)
+ {
+ changePort(port);
+ encryption = false;
+ allow_unencrypted = true;
+ }
+
+
+ Server::~Server()
+ {
+ delete sock;
+ }
+
+ bool Server::isOK() const
+ {
+ return sock->ok();
+ }
+
+ void Server::changePort(Uint16 p)
+ {
+ if (p == port)
+ return;
+
+
+ if (sock && sock->ok())
+ Globals::instance().getPortList().removePort(port,net::TCP);
+
+ port = p;
+ delete sock;
+ sock = new ServerSocket(this,port);
+ if (isOK())
+ Globals::instance().getPortList().addNewPort(port,net::TCP,true);
+ }
+
+ void Server::addPeerManager(PeerManager* pman)
+ {
+ peer_managers.append(pman);
+ }
+
+ void Server::removePeerManager(PeerManager* pman)
+ {
+ peer_managers.remove(pman);
+ }
+
+ void Server::newConnection(int socket)
+ {
+ mse::StreamSocket* s = new mse::StreamSocket(socket);
+ if (peer_managers.count() == 0)
+ {
+ s->close();
+ delete s;
+ }
+ else
+ {
+ IPBlocklist& ipfilter = IPBlocklist::instance();
+ QString IP(s->getRemoteIPAddress());
+ if (ipfilter.isBlocked( IP ))
+ {
+ delete s;
+ return;
+ }
+
+ ServerAuthenticate* auth = 0;
+
+ if (encryption)
+ auth = new mse::EncryptedServerAuthenticate(s,this);
+ else
+ auth = new ServerAuthenticate(s,this);
+
+ AuthenticationMonitor::instance().add(auth);
+ }
+ }
+
+ void Server::close()
+ {
+ delete sock;
+ sock= 0;
+ }
+
+ Uint16 Server::getPortInUse() const
+ {
+ return port;
+ }
+
+ PeerManager* Server::findPeerManager(const SHA1Hash & hash)
+ {
+ QPtrList<PeerManager>::iterator i = peer_managers.begin();
+ while (i != peer_managers.end())
+ {
+ PeerManager* pm = *i;
+ if (pm && pm->getTorrent().getInfoHash() == hash)
+ {
+ if (!pm->isStarted())
+ return 0;
+ else
+ return pm;
+ }
+ i++;
+ }
+ return 0;
+ }
+
+ bool Server::findInfoHash(const SHA1Hash & skey,SHA1Hash & info_hash)
+ {
+ Uint8 buf[24];
+ memcpy(buf,"req2",4);
+ QPtrList<PeerManager>::iterator i = peer_managers.begin();
+ while (i != peer_managers.end())
+ {
+ PeerManager* pm = *i;
+ memcpy(buf+4,pm->getTorrent().getInfoHash().getData(),20);
+ if (SHA1Hash::generate(buf,24) == skey)
+ {
+ info_hash = pm->getTorrent().getInfoHash();
+ return true;
+ }
+ i++;
+ }
+ return false;
+ }
+
+ void Server::onError(int)
+ {
+ }
+
+
+ void Server::enableEncryption(bool allow_unencrypted)
+ {
+ encryption = true;
+ this->allow_unencrypted = allow_unencrypted;
+ }
+
+ void Server::disableEncryption()
+ {
+ encryption = false;
+ }
+}
+
+#include "server.moc"
diff --git a/libktorrent/torrent/server.h b/libktorrent/torrent/server.h
new file mode 100644
index 0000000..99c06eb
--- /dev/null
+++ b/libktorrent/torrent/server.h
@@ -0,0 +1,125 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSERVER_H
+#define BTSERVER_H
+
+#include <qptrlist.h>
+#include <qobject.h>
+#include "globals.h"
+
+namespace bt
+{
+ class PeerManager;
+ class ServerAuthenticate;
+ class SHA1Hash;
+ class ServerSocket;
+
+
+ /**
+ * @author Joris Guisson
+ *
+ * Class which listens for incoming connections.
+ * Handles authentication and then hands of the new
+ * connections to a PeerManager.
+ *
+ * All PeerManager's should register with this class when they
+ * are created and should unregister when they are destroyed.
+ */
+ class Server : public QObject
+ {
+ Q_OBJECT
+
+ QPtrList<PeerManager> peer_managers;
+ ServerSocket* sock;
+ Uint16 port;
+ bool encryption;
+ bool allow_unencrypted;
+ public:
+ Server(Uint16 port);
+ virtual ~Server();
+
+ /// Check if everything is ok (are we successfully listening on the port)
+ bool isOK() const;
+
+ /**
+ * Change the port.
+ * @param port The new port
+ */
+ void changePort(Uint16 port);
+
+ /// Get the port in use
+ Uint16 getPortInUse() const;
+
+ /**
+ * Add a PeerManager.
+ * @param pman The PeerManager
+ */
+ void addPeerManager(PeerManager* pman);
+
+ /**
+ * Remove a PeerManager.
+ * @param pman The PeerManager
+ */
+ void removePeerManager(PeerManager* pman);
+
+ /**
+ * Find the PeerManager given the info_hash of it's torrent.
+ * @param hash The info_hash
+ * @return The PeerManager or 0 if one can't be found
+ */
+ PeerManager* findPeerManager(const SHA1Hash & hash);
+
+ /**
+ * Find the info_hash based on the skey hash. The skey hash is a hash
+ * of 'req2' followed by the info_hash. This function finds the info_hash
+ * which matches the skey hash.
+ * @param skey HASH('req2',info_hash)
+ * @param info_hash which matches
+ * @return true If one was found
+ */
+ bool findInfoHash(const SHA1Hash & skey,SHA1Hash & info_hash);
+
+ /**
+ * Enable encryption.
+ * @param allow_unencrypted Allow unencrypted connections (if encryption fails)
+ */
+ void enableEncryption(bool allow_unencrypted);
+
+ /**
+ * Disable encrypted authentication.
+ */
+ void disableEncryption();
+
+ bool isEncryptionEnabled() const {return encryption;}
+ bool unencryptedConnectionsAllowed() const {return allow_unencrypted;}
+
+ void close();
+
+ private slots:
+ void newConnection(int sock);
+ void onError(int);
+
+ private:
+ friend class ServerSocket;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/serverauthenticate.cpp b/libktorrent/torrent/serverauthenticate.cpp
new file mode 100644
index 0000000..479f0ce
--- /dev/null
+++ b/libktorrent/torrent/serverauthenticate.cpp
@@ -0,0 +1,126 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <mse/streamsocket.h>
+#include <util/sha1hash.h>
+#include <util/log.h>
+#include <util/log.h>
+#include "globals.h"
+#include "server.h"
+#include "peermanager.h"
+#include "serverauthenticate.h"
+#include "peerid.h"
+#include "torrent.h"
+#include "ipblocklist.h"
+
+
+namespace bt
+{
+ bool ServerAuthenticate::s_firewalled = true;
+
+
+ ServerAuthenticate::ServerAuthenticate(mse::StreamSocket* sock,Server* server)
+ : AuthenticateBase(sock),server(server)
+ {
+ }
+
+
+ ServerAuthenticate::~ServerAuthenticate()
+ {
+ }
+
+
+ void ServerAuthenticate::onFinish(bool succes)
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Authentication(S) to " << sock->getRemoteIPAddress()
+ << " : " << (succes ? "ok" : "failure") << endl;
+ finished = true;
+ setFirewalled(false);
+
+ if (!succes)
+ {
+ sock->deleteLater();
+ sock = 0;
+ }
+
+ timer.stop();
+ }
+
+ void ServerAuthenticate::handshakeRecieved(bool full)
+ {
+ Uint8* hs = handshake;
+ IPBlocklist& ipfilter = IPBlocklist::instance();
+
+ QString IP = sock->getRemoteIPAddress();
+
+ if (ipfilter.isBlocked( IP ))
+ {
+ onFinish(false);
+ return;
+ }
+
+ // try to find a PeerManager which has te right info hash
+ SHA1Hash rh(hs+28);
+ PeerManager* pman = server->findPeerManager(rh);
+ if (!pman)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Cannot find PeerManager for hash : " << rh.toString() << endl;
+ onFinish(false);
+ return;
+ }
+
+ if (full)
+ {
+ // check if we aren't connecting to ourself
+ char tmp[21];
+ tmp[20] = '\0';
+ memcpy(tmp,hs+48,20);
+ PeerID peer_id = PeerID(tmp);
+ if (pman->getTorrent().getPeerID() == peer_id)
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Lets not connect to our self" << endl;
+ onFinish(false);
+ return;
+ }
+
+ // check if we aren't already connected to the client
+ if (pman->connectedTo(peer_id))
+ {
+ Out(SYS_CON|LOG_NOTICE) << "Already connected to " << peer_id.toString() << endl;
+ onFinish(false);
+ return;
+ }
+
+
+ // send handshake and finish off
+ sendHandshake(rh,pman->getTorrent().getPeerID());
+ onFinish(true);
+ // hand over connection
+ pman->newConnection(sock,peer_id,supportedExtensions());
+ sock = 0;
+ }
+ else
+ {
+ // if the handshake wasn't fully received just send our handshake
+ sendHandshake(rh,pman->getTorrent().getPeerID());
+ }
+ }
+}
+
+#include "serverauthenticate.moc"
diff --git a/libktorrent/torrent/serverauthenticate.h b/libktorrent/torrent/serverauthenticate.h
new file mode 100644
index 0000000..70d3739
--- /dev/null
+++ b/libktorrent/torrent/serverauthenticate.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSERVERAUTHENTICATE_H
+#define BTSERVERAUTHENTICATE_H
+
+#include "authenticatebase.h"
+
+namespace bt
+{
+ class Server;
+ class SHA1Hash;
+ class PeerID;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Handles the authentication of incoming connections on the Server.
+ * Once the authentication is finished, the socket gets handed over
+ * to the right PeerManager.
+ */
+ class ServerAuthenticate : public AuthenticateBase
+ {
+ Q_OBJECT
+ public:
+ ServerAuthenticate(mse::StreamSocket* sock,Server* server);
+ virtual ~ServerAuthenticate();
+
+ static bool isFirewalled();
+ static void setFirewalled(bool Firewalled);
+
+ protected:
+ void onFinish(bool succes);
+ void handshakeRecieved(bool full);
+
+ protected:
+ Server* server;
+
+ private:
+ static bool s_firewalled;
+ };
+
+}
+
+inline bool bt::ServerAuthenticate::isFirewalled()
+{
+ return s_firewalled;
+}
+
+inline void bt::ServerAuthenticate::setFirewalled(bool Firewalled)
+{
+ s_firewalled = Firewalled;
+}
+
+
+#endif
diff --git a/libktorrent/torrent/singlefilecache.cpp b/libktorrent/torrent/singlefilecache.cpp
new file mode 100644
index 0000000..7d31bef
--- /dev/null
+++ b/libktorrent/torrent/singlefilecache.cpp
@@ -0,0 +1,232 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <qfileinfo.h>
+#include <qstringlist.h>
+#include <util/fileops.h>
+#include <util/error.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include "torrent.h"
+#include "chunk.h"
+#include "globals.h"
+#include "cachefile.h"
+#include "singlefilecache.h"
+#include "preallocationthread.h"
+
+
+namespace bt
+{
+
+ SingleFileCache::SingleFileCache(Torrent& tor,const QString & tmpdir,const QString & datadir)
+ : Cache(tor,tmpdir,datadir),fd(0)
+ {
+ cache_file = tmpdir + "cache";
+ output_file = QFileInfo(cache_file).readLink();
+ }
+
+
+ SingleFileCache::~SingleFileCache()
+ {}
+
+ void SingleFileCache::changeTmpDir(const QString & ndir)
+ {
+ Cache::changeTmpDir(ndir);
+ cache_file = tmpdir + "cache";
+ }
+
+ KIO::Job* SingleFileCache::moveDataFiles(const QString & ndir)
+ {
+ return KIO::move(KURL::fromPathOrURL(output_file),KURL::fromPathOrURL(ndir));
+ }
+
+ void SingleFileCache::moveDataFilesCompleted(KIO::Job* /*job*/)
+ {
+ }
+
+ void bt::SingleFileCache::changeOutputPath(const QString & outputpath)
+ {
+ bt::Delete(cache_file);
+ output_file = outputpath;
+ datadir = output_file.left(output_file.findRev(bt::DirSeparator()));
+
+ bt::SymLink(output_file, cache_file);
+ }
+
+ bool SingleFileCache::prep(Chunk* c)
+ {
+ if (mmap_failures >= 3)
+ {
+ // mmap continuously fails, so stop using it
+ c->allocate();
+ c->setStatus(Chunk::BUFFERED);
+ }
+ else
+ {
+ Uint64 off = c->getIndex() * tor.getChunkSize();
+ Uint8* buf = (Uint8*)fd->map(c,off,c->getSize(),CacheFile::RW);
+ if (!buf)
+ {
+ mmap_failures++;
+ // buffer it if mmapping fails
+ Out(SYS_GEN|LOG_IMPORTANT) << "Warning : mmap failure, falling back to buffered mode" << endl;
+ c->allocate();
+ c->setStatus(Chunk::BUFFERED);
+ }
+ else
+ {
+ c->setData(buf,Chunk::MMAPPED);
+ }
+ }
+ return true;
+ }
+
+ void SingleFileCache::load(Chunk* c)
+ {
+ Uint64 off = c->getIndex() * tor.getChunkSize();
+ Uint8* buf = 0;
+ if (mmap_failures >= 3 || !(buf = (Uint8*)fd->map(c,off,c->getSize(),CacheFile::READ)))
+ {
+ c->allocate();
+ c->setStatus(Chunk::BUFFERED);
+ fd->read(c->getData(),c->getSize(),off);
+ if (mmap_failures < 3)
+ mmap_failures++;
+ }
+ else
+ {
+ c->setData(buf,Chunk::MMAPPED);
+ }
+ }
+
+ void SingleFileCache::save(Chunk* c)
+ {
+ // unmap the chunk if it is mapped
+ if (c->getStatus() == Chunk::MMAPPED)
+ {
+ fd->unmap(c->getData(),c->getSize());
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ }
+ else if (c->getStatus() == Chunk::BUFFERED)
+ {
+ Uint64 off = c->getIndex() * tor.getChunkSize();
+ fd->write(c->getData(),c->getSize(),off);
+ c->clear();
+ c->setStatus(Chunk::ON_DISK);
+ }
+ }
+
+ void SingleFileCache::create()
+ {
+ QFileInfo fi(cache_file);
+ if (!fi.exists())
+ {
+ QString out_file = fi.readLink();
+
+ if (out_file.isNull())
+ out_file = datadir + tor.getNameSuggestion();
+
+ if (!bt::Exists(out_file))
+ bt::Touch(out_file);
+ else
+ preexisting_files = true;
+
+ if (bt::Exists(cache_file))
+ bt::Delete(cache_file);
+
+ bt::SymLink(out_file,cache_file);
+ output_file = out_file;
+ }
+ else
+ {
+ QString out_file = fi.readLink();
+ if (!bt::Exists(out_file))
+ bt::Touch(out_file);
+ else
+ preexisting_files = true;
+ }
+ }
+
+ void SingleFileCache::close()
+ {
+ if (fd)
+ {
+ fd->close();
+ delete fd;
+ fd = 0;
+ }
+ }
+
+ void SingleFileCache::open()
+ {
+ if (fd)
+ return;
+
+ try
+ {
+ fd = new CacheFile();
+ fd->open(cache_file,tor.getFileLength());
+ }
+ catch (...)
+ {
+ fd->close();
+ delete fd;
+ fd = 0;
+ throw;
+ }
+ }
+
+ void SingleFileCache::preallocateDiskSpace(PreallocationThread* prealloc)
+ {
+ if (!fd)
+ open();
+
+ if (!prealloc->isStopped())
+ fd->preallocate(prealloc);
+ else
+ prealloc->setNotFinished();
+ }
+
+ bool SingleFileCache::hasMissingFiles(QStringList & sl)
+ {
+ QFileInfo fi(cache_file);
+ if (!fi.exists())
+ {
+ QString out_file = fi.readLink();
+ sl.append(fi.readLink());
+ return true;
+ }
+ return false;
+ }
+
+ void SingleFileCache::deleteDataFiles()
+ {
+ bt::Delete(output_file);
+ }
+
+ Uint64 SingleFileCache::diskUsage()
+ {
+ if (!fd)
+ open();
+
+ return fd->diskUsage();
+ }
+}
diff --git a/libktorrent/torrent/singlefilecache.h b/libktorrent/torrent/singlefilecache.h
new file mode 100644
index 0000000..faa71b6
--- /dev/null
+++ b/libktorrent/torrent/singlefilecache.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSINGLEFILECACHE_H
+#define BTSINGLEFILECACHE_H
+
+#include "cache.h"
+
+namespace bt
+{
+ class CacheFile;
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Cache for single file torrents
+ *
+ * This class implements Cache for a single file torrent
+ */
+ class SingleFileCache : public Cache
+ {
+ QString cache_file;
+ QString output_file;
+ CacheFile* fd;
+ public:
+ SingleFileCache(Torrent& tor,const QString & tmpdir,const QString & datadir);
+ virtual ~SingleFileCache();
+
+ virtual bool prep(Chunk* c);
+ virtual void load(Chunk* c);
+ virtual void save(Chunk* c);
+ virtual void create();
+ virtual void close();
+ virtual void open();
+ virtual void changeTmpDir(const QString & ndir);
+ virtual KIO::Job* moveDataFiles(const QString & ndir);
+ virtual void moveDataFilesCompleted(KIO::Job* job);
+ virtual void changeOutputPath(const QString& outputpath);
+ virtual QString getOutputPath() const {return output_file;}
+ virtual void preallocateDiskSpace(PreallocationThread* prealloc);
+ virtual bool hasMissingFiles(QStringList & sl);
+ virtual void deleteDataFiles();
+ virtual Uint64 diskUsage();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/speedestimater.cpp b/libktorrent/torrent/speedestimater.cpp
new file mode 100644
index 0000000..f12b5ac
--- /dev/null
+++ b/libktorrent/torrent/speedestimater.cpp
@@ -0,0 +1,105 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qpair.h>
+#include <qvaluelist.h>
+#include <util/log.h>
+#include <util/timer.h>
+#include "speedestimater.h"
+#include <util/functions.h>
+
+namespace bt
+{
+ class SpeedEstimater::SpeedEstimaterPriv
+ {
+ float rate;
+ QValueList<QPair<Uint32,TimeStamp> > dlrate;
+ public:
+ SpeedEstimaterPriv() : rate(0) {}
+ ~SpeedEstimaterPriv() {}
+
+ void data(Uint32 bytes)
+ {
+ dlrate.append(qMakePair(bytes,GetCurrentTime()));
+ }
+
+ void update()
+ {
+ TimeStamp now = GetCurrentTime();
+
+ Uint32 bytes = 0,oldest = now;
+ QValueList<QPair<Uint32,TimeStamp> >::iterator i = dlrate.begin();
+ while (i != dlrate.end())
+ {
+ QPair<Uint32,TimeStamp> & p = *i;
+ if (now - p.second > 3000)
+ {
+ i = dlrate.erase(i);
+ }
+ else
+ {
+ if (p.second < oldest)
+ oldest = p.second;
+
+ bytes += p.first;
+ i++;
+ }
+ }
+
+ Uint32 d = 3000;
+
+ if (bytes == 0)
+ {
+ rate = 0;
+ }
+ else
+ {
+ // Out() << "bytes = " << bytes << " d = " << d << endl;
+ rate = (float) bytes / (d * 0.001f);
+ }
+ }
+
+ float getRate() const {return rate;}
+ };
+
+ SpeedEstimater::SpeedEstimater()
+ {
+ download_rate = 0;
+ down = new SpeedEstimaterPriv();
+ }
+
+
+ SpeedEstimater::~SpeedEstimater()
+ {
+ delete down;
+ }
+
+
+
+ void SpeedEstimater::onRead(Uint32 bytes)
+ {
+ down->data(bytes);
+ }
+
+ void SpeedEstimater::update()
+ {
+ down->update();
+ download_rate = down->getRate();
+ }
+}
diff --git a/libktorrent/torrent/speedestimater.h b/libktorrent/torrent/speedestimater.h
new file mode 100644
index 0000000..16bbdcc
--- /dev/null
+++ b/libktorrent/torrent/speedestimater.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSPEEDESTIMATER_H
+#define BTSPEEDESTIMATER_H
+
+
+#include "globals.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Estimates download speed
+ *
+ * This class estimates the download speed.
+ */
+ class SpeedEstimater
+ {
+ class SpeedEstimaterPriv;
+ public:
+ SpeedEstimater();
+ virtual ~SpeedEstimater();
+
+
+ void onRead(Uint32 bytes);
+ void update();
+
+ double downloadRate() const {return download_rate;}
+
+ private:
+ double download_rate;
+ SpeedEstimaterPriv* down;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/statsfile.cpp b/libktorrent/torrent/statsfile.cpp
new file mode 100644
index 0000000..2ffd3ae
--- /dev/null
+++ b/libktorrent/torrent/statsfile.cpp
@@ -0,0 +1,120 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "statsfile.h"
+
+#include "globals.h"
+#include <util/log.h>
+#include <util/functions.h>
+
+#include <qstring.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+namespace bt
+{
+
+ StatsFile::StatsFile(QString filename)
+ :m_filename(filename)
+ {
+ m_file.setName(filename);
+ readSync();
+ }
+
+ StatsFile::~StatsFile()
+ {
+ close();
+ }
+
+ void StatsFile::close()
+ {
+ m_file.close();
+ }
+
+ void StatsFile::write(QString key, QString value)
+ {
+ m_values.insert(key.stripWhiteSpace(), value.stripWhiteSpace());
+ }
+
+ QString StatsFile::readString(QString key)
+ {
+ return m_values[key].stripWhiteSpace();
+ }
+
+ Uint64 StatsFile::readUint64(QString key)
+ {
+ bool ok = true;
+ Uint64 val = readString(key).toULongLong(&ok);
+ return val;
+ }
+
+ int StatsFile::readInt(QString key)
+ {
+ bool ok = true;
+ int val = readString(key).toInt(&ok);
+ return val;
+ }
+
+ bool StatsFile::readBoolean(QString key)
+ {
+ return (bool) readInt(key);
+ }
+
+ unsigned long StatsFile::readULong(QString key)
+ {
+ bool ok = true;
+ return readString(key).toULong(&ok);
+ }
+
+ float bt::StatsFile::readFloat( QString key )
+ {
+ bool ok = true;
+ return readString(key).toFloat(&ok);
+ }
+
+ void StatsFile::readSync()
+ {
+ if (!m_file.open(IO_ReadOnly))
+ return;
+
+ QTextStream in(&m_file);
+ while (!in.atEnd())
+ {
+ QString line = in.readLine();
+ QString tmp = line.left(line.find('='));
+ m_values.insert(tmp, line.mid(tmp.length()+1));
+ }
+ close();
+ }
+
+ void StatsFile::writeSync()
+ {
+ if (!m_file.open(IO_WriteOnly))
+ return;
+ QTextStream out(&m_file);
+ QMap<QString, QString>::iterator it = m_values.begin();
+ while(it!=m_values.end())
+ {
+ out << it.key() << "=" << it.data() << ::endl;
+ ++it;
+ }
+ close();
+ }
+
+}
diff --git a/libktorrent/torrent/statsfile.h b/libktorrent/torrent/statsfile.h
new file mode 100644
index 0000000..9f7a145
--- /dev/null
+++ b/libktorrent/torrent/statsfile.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSTATSFILE_H
+#define BTSTATSFILE_H
+
+#include <qstring.h>
+#include <qfile.h>
+#include <qmap.h>
+
+#include <util/constants.h>
+
+namespace bt
+{
+
+ /**
+ * @brief This class is used for loading/storing torrent stats in a file.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class StatsFile
+ {
+ public:
+ /**
+ * @brief A constructor.
+ * Constructs StatsFile object and calls readSync().
+ */
+ StatsFile(QString filename);
+ ~StatsFile();
+
+ ///Closes QFile
+ void close();
+
+ /**
+ * @brief Main read function.
+ * @return QString value that correspodents to key.
+ * @param key - QString stats key.
+ */
+ QString readString(QString key);
+
+ Uint64 readUint64(QString key);
+ bool readBoolean(QString key);
+ int readInt(QString key);
+ unsigned long readULong(QString key);
+ float readFloat(QString key);
+
+ /**
+ * @brief Writes key and value.
+ * It only inserts pair of key/value to the m_values. To make changes to file call writeSync().
+ * @param key - QString key
+ * @param value - QString value.
+ */
+ void write(QString key, QString value);
+
+ ///Reads data from stats file to m_values.
+ void readSync();
+
+ ///Writes data from m_values to stats file.
+ void writeSync();
+
+ /**
+ * See if there is a key in the stats file
+ * @param key The key
+ * @return true if key is in the stats file
+ */
+ bool hasKey(const QString & key) const {return m_values.contains(key);}
+
+ private:
+ QString m_filename;
+ QFile m_file;
+
+ QMap<QString, QString> m_values;
+ };
+}
+
+#endif
diff --git a/libktorrent/torrent/timeestimator.cpp b/libktorrent/torrent/timeestimator.cpp
new file mode 100644
index 0000000..7d18300
--- /dev/null
+++ b/libktorrent/torrent/timeestimator.cpp
@@ -0,0 +1,278 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 <math.h>
+#include "timeestimator.h"
+#include "torrentcontrol.h"
+#include "settings.h"
+
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/constants.h>
+
+using namespace kt;
+
+namespace bt
+{
+ TimeEstimator::TimeEstimator(TorrentControl* tc)
+ : m_tc(tc)
+ {
+ m_samples = new SampleQueue(20);
+ m_lastAvg = 0;
+ m_perc = -1;
+
+ //default is KT algorithm
+ m_algorithm = (ETAlgorithm) Settings::eta();
+ }
+
+
+ TimeEstimator::~TimeEstimator()
+ {
+ delete m_samples;
+ }
+
+ Uint32 TimeEstimator::estimate()
+ {
+ const TorrentStats& s = m_tc->getStats();
+
+ // only estimate when we are downloading or stalled
+ if (!(s.status == kt::DOWNLOADING || s.status == kt::STALLED))
+ return (Uint32) - 1;
+
+ //ones without pre-calculations
+ switch (m_algorithm)
+ {
+
+ case ETA_CSA:
+ return estimateCSA();
+
+ case ETA_GASA:
+ return estimateGASA();
+
+ case ETA_KT:
+ return estimateKT();
+ }
+
+ //complicated ones :)
+
+ Uint32 sample = (Uint32) s.download_rate;
+ //push new sample
+ m_samples->push(sample);
+
+
+ switch (m_algorithm)
+ {
+ case ETA_MAVG:
+ return estimateMAVG();
+
+ case ETA_WINX:
+ return estimateWINX();
+
+ default:
+ return -1;
+ }
+ }
+
+ Uint32 TimeEstimator::estimateCSA()
+ {
+ const TorrentStats& s = m_tc->getStats();
+
+ if (s.download_rate == 0)
+ return (Uint32) - 1;
+
+ return (int)floor((float)s.bytes_left_to_download / (float)s.download_rate);
+ }
+
+ Uint32 TimeEstimator::estimateGASA()
+ {
+ const TorrentStats& s = m_tc->getStats();
+
+ if (m_tc->getRunningTimeDL() > 0 && s.bytes_downloaded > 0)
+ {
+ double avg_speed = (double) s.bytes_downloaded / (double) m_tc->getRunningTimeDL();
+ return (Uint32) floor((double) s.bytes_left_to_download / avg_speed);
+ }
+
+ return (Uint32) - 1;
+ }
+
+ Uint32 TimeEstimator::estimateWINX()
+ {
+ const TorrentStats& s = m_tc->getStats();
+
+ if (m_samples->sum() > 0 && m_samples->count() > 0)
+ return (Uint32) floor((double) s.bytes_left_to_download / ((double) m_samples->sum() / (double) m_samples->count()));
+
+ return (Uint32) - 1;
+ }
+
+ Uint32 TimeEstimator::estimateMAVG()
+ {
+ const TorrentStats& s = m_tc->getStats();
+
+ if (m_samples->count() > 0)
+ {
+ double lavg;
+
+ if (m_lastAvg == 0)
+ lavg = (Uint32) m_samples->sum() / m_samples->count();
+ else
+ lavg = m_lastAvg - ((double) m_samples->first() / (double) m_samples->count()) + ((double) m_samples->last() / (double) m_samples->count());
+
+ m_lastAvg = (Uint32) floor(lavg);
+
+ if (lavg > 0)
+ return (Uint32) floor((double) s.bytes_left_to_download / ((lavg + (m_samples->sum() / m_samples->count())) / 2));
+
+ return (Uint32) - 1;
+ }
+
+ return (Uint32) - 1;
+ }
+
+}
+
+bt::SampleQueue::SampleQueue(int max)
+ : m_size(max), m_count(0)
+{
+ m_samples = new Uint32[max];
+
+ for (int i = 0; i < m_size; ++i)
+ m_samples[i] = 0;
+
+ m_end = -1;
+
+ m_start = 0;
+}
+
+bt::SampleQueue::~ SampleQueue()
+{
+ delete [] m_samples;
+}
+
+void bt::SampleQueue::push(Uint32 sample)
+{
+ if (m_count < m_size)
+ {
+ //it's not full yet
+ m_samples[(++m_end) % m_size ] = sample;
+ m_count++;
+
+ return;
+ }
+
+ //since it's full I'll just replace the oldest value with new one and update all variables.
+ m_end = (++m_end) % m_size;
+
+ m_start = (++m_start) % m_size;
+
+ m_samples[m_end] = sample;
+}
+
+Uint32 bt::SampleQueue::first()
+{
+ return m_samples[m_start];
+}
+
+Uint32 bt::SampleQueue::last()
+{
+ return m_samples[m_end];
+}
+
+bool bt::SampleQueue::isFull()
+{
+ return m_count >= m_size;
+}
+
+int bt::SampleQueue::count()
+{
+ return m_count;
+}
+
+Uint32 bt::SampleQueue::sum()
+{
+ Uint32 s = 0;
+
+ for (int i = 0; i < m_count; ++i)
+ s += m_samples[i];
+
+ return s;
+}
+
+void bt::TimeEstimator::setAlgorithm(const ETAlgorithm& theValue)
+{
+ m_algorithm = theValue;
+}
+
+Uint32 bt::TimeEstimator::estimateKT()
+{
+ const TorrentStats& s = m_tc->getStats();
+
+ Uint32 sample = (Uint32) s.download_rate;
+
+ //push new sample
+ m_samples->push(sample);
+
+ double perc = (double) s.bytes_downloaded / (double) s.total_bytes;
+
+ int percentage = (int)(perc) * 100;
+
+ //calculate percentage increasement
+ double delta = 1 - 1 / (perc / m_perc);
+
+ //remember last percentage
+ m_perc = perc;
+
+
+ if (s.bytes_downloaded < 1024*1024*100 && sample > 0) // < 100KB
+ {
+ m_lastETA = estimateGASA();
+ return m_lastETA;
+ }
+
+ if (percentage >= 99 && sample > 0 && s.bytes_left_to_download <= 10*1024*1024*1024) //1% of a very large torrent could be hundreds of MB so limit it to 10MB
+ {
+
+ if (!m_samples->isFull())
+ {
+ m_lastETA = estimateWINX();
+
+ if (m_lastETA == (Uint32) - 1)
+ m_lastETA = estimateGASA();
+
+ return m_lastETA;
+ }
+ else
+ {
+ m_lastETA = (Uint32) - 1;
+
+ if (delta > 0.0001)
+ m_lastETA = estimateMAVG();
+
+ if (m_lastETA == (Uint32) - 1)
+ m_lastETA = estimateGASA();
+ }
+
+ return m_lastETA;
+ }
+
+ m_lastETA = estimateGASA();
+
+ return m_lastETA;
+}
diff --git a/libktorrent/torrent/timeestimator.h b/libktorrent/torrent/timeestimator.h
new file mode 100644
index 0000000..972e239
--- /dev/null
+++ b/libktorrent/torrent/timeestimator.h
@@ -0,0 +1,119 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 BTTIMEESTIMATOR_H
+#define BTTIMEESTIMATOR_H
+
+#include <util/constants.h>
+
+namespace bt
+{
+ class TorrentControl;
+
+ /**
+ * Simple queue class for samples. Optimized for speed and size
+ * without posibility to dynamically resize itself.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class SampleQueue
+ {
+ public:
+ SampleQueue(int max);
+ ~SampleQueue();
+
+ /**
+ * Inserts new sample into the queue. The oldest sample is overwritten.
+ */
+ void push(Uint32 sample);
+
+ Uint32 first();
+ Uint32 last();
+
+ bool isFull();
+
+ /**
+ * This function will return the number of samples in queue until it counts m_size number of elements.
+ * After this point it will always return m_size since no samples are being deleted.
+ */
+ int count();
+
+ /**
+ * Returns the sum of all samples.
+ */
+ Uint32 sum();
+
+ private:
+ int m_size;
+ int m_count;
+
+ int m_start;
+ int m_end;
+
+ Uint32* m_samples;
+ };
+
+ /**
+ * ETA estimator class. It will use different algorithms for different download phases.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class TimeEstimator
+ {
+ public:
+
+ enum ETAlgorithm
+ {
+ ETA_KT, //ktorrent default algorithm - combination of the following according to our tests
+ ETA_CSA, //current speed algorithm
+ ETA_GASA, //global average speed algorithm
+ ETA_WINX, //window of X algorithm
+ ETA_MAVG //moving average algorithm
+ };
+
+ TimeEstimator(TorrentControl* tc);
+ ~TimeEstimator();
+
+ ///Returns ETA for m_tc torrent.
+ Uint32 estimate();
+
+ void setAlgorithm(const ETAlgorithm& theValue);
+ ETAlgorithm algorithm() const { return m_algorithm; }
+
+ private:
+
+ Uint32 estimateCSA();
+ Uint32 estimateGASA();
+ Uint32 estimateWINX();
+ Uint32 estimateMAVG();
+ Uint32 estimateKT();
+
+ TorrentControl* m_tc;
+ SampleQueue* m_samples;
+
+ Uint32 m_lastAvg;
+ Uint32 m_lastETA;
+
+ //last percentage
+ double m_perc;
+
+ ETAlgorithm m_algorithm;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/torrent.cpp b/libktorrent/torrent/torrent.cpp
new file mode 100644
index 0000000..6b8739b
--- /dev/null
+++ b/libktorrent/torrent/torrent.cpp
@@ -0,0 +1,449 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <qfile.h>
+#include <qdatastream.h>
+#include <qstringlist.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <util/error.h>
+#include <util/sha1hashgen.h>
+#include <time.h>
+#include <stdlib.h>
+#include "torrent.h"
+#include "bdecoder.h"
+#include "bnode.h"
+#include "announcelist.h"
+
+#include <klocale.h>
+
+namespace bt
+{
+
+ Torrent::Torrent() : piece_length(0),file_length(0),priv_torrent(false)
+ {
+ encoding = "utf8";
+ trackers = 0;
+ }
+
+
+ Torrent::~Torrent()
+ {
+ delete trackers;
+ }
+
+
+ void Torrent::load(const QByteArray & data,bool verbose)
+ {
+ BNode* node = 0;
+
+ try
+ {
+ BDecoder decoder(data,verbose);
+ node = decoder.decode();
+ BDictNode* dict = dynamic_cast<BDictNode*>(node);
+ if (!dict)
+ throw Error(i18n("Corrupted torrent!"));
+
+ // see if we can find an encoding node
+ BValueNode* enc = dict->getValue("encoding");
+ if (enc)
+ {
+ encoding = enc->data().toString();
+ Out() << "Encoding : " << encoding << endl;
+ }
+
+ BValueNode* announce = dict->getValue("announce");
+ BListNode* nodes = dict->getList("nodes");
+ if (!announce && !nodes)
+ throw Error(i18n("Torrent has no announce or nodes field"));
+
+ if (announce)
+ loadTrackerURL(announce);
+
+ if (nodes) // DHT torrrents have a node key
+ loadNodes(nodes);
+
+ loadInfo(dict->getDict("info"));
+ loadAnnounceList(dict->getData("announce-list"));
+ BNode* n = dict->getData("info");
+ SHA1HashGen hg;
+ Uint8* info = (Uint8*)data.data();
+ info_hash = hg.generate(info + n->getOffset(),n->getLength());
+ delete node;
+ }
+ catch (...)
+ {
+ delete node;
+ throw;
+ }
+ }
+
+ void Torrent::load(const QString & file,bool verbose)
+ {
+ QFile fptr(file);
+ if (!fptr.open(IO_ReadOnly))
+ throw Error(i18n(" Unable to open torrent file %1 : %2")
+ .arg(file).arg(fptr.errorString()));
+
+ QByteArray data(fptr.size());
+ // Out() << "File size = " << fptr.size() << endl;
+ fptr.readBlock(data.data(),fptr.size());
+
+ load(data,verbose);
+ }
+
+ void Torrent::loadInfo(BDictNode* dict)
+ {
+ if (!dict)
+ throw Error(i18n("Corrupted torrent!"));
+
+ loadPieceLength(dict->getValue("piece length"));
+ BValueNode* n = dict->getValue("length");
+ if (n)
+ loadFileLength(n);
+ else
+ loadFiles(dict->getList("files"));
+
+ loadHash(dict->getValue("pieces"));
+ loadName(dict->getValue("name"));
+ n = dict->getValue("private");
+ if (n && n->data().toInt() == 1)
+ priv_torrent = true;
+
+ // do a safety check to see if the number of hashes matches the file_length
+ Uint32 num_chunks = (file_length / this->piece_length);
+ if (file_length % piece_length > 0)
+ num_chunks++;
+
+ if (num_chunks != hash_pieces.count())
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "File sizes and number of hashes do not match for " << name_suggestion << endl;
+ throw Error(i18n("Corrupted torrent!"));
+ }
+ }
+
+ void Torrent::loadFiles(BListNode* node)
+ {
+ Out() << "Multi file torrent" << endl;
+ if (!node)
+ throw Error(i18n("Corrupted torrent!"));
+ Uint32 idx = 0;
+ BListNode* fl = node;
+ for (Uint32 i = 0;i < fl->getNumChildren();i++)
+ {
+ BDictNode* d = fl->getDict(i);
+ if (!d)
+ throw Error(i18n("Corrupted torrent!"));
+
+ BListNode* ln = d->getList("path");
+ if (!ln)
+ throw Error(i18n("Corrupted torrent!"));
+
+ QString path;
+ for (Uint32 j = 0;j < ln->getNumChildren();j++)
+ {
+ BValueNode* v = ln->getValue(j);
+ if (!v || v->data().getType() != Value::STRING)
+ throw Error(i18n("Corrupted torrent!"));
+
+ QString sd = v->data().toString(encoding);
+ path += sd;
+ if (j + 1 < ln->getNumChildren())
+ path += bt::DirSeparator();
+ }
+
+ // we do not want empty dirs
+ if (path.endsWith(bt::DirSeparator()))
+ continue;
+
+ if (!checkPathForDirectoryTraversal(path))
+ throw Error(i18n("Corrupted torrent!"));
+
+ BValueNode* v = d->getValue("length");
+ if (!v)
+ throw Error(i18n("Corrupted torrent!"));
+
+ if (v->data().getType() == Value::INT || v->data().getType() == Value::INT64)
+ {
+ Uint64 s = v->data().toInt64();
+ TorrentFile file(idx,path,file_length,s,piece_length);
+
+ // update file_length
+ file_length += s;
+ files.append(file);
+ }
+ else
+ {
+ throw Error(i18n("Corrupted torrent!"));
+ }
+ idx++;
+ }
+ }
+
+ void Torrent::loadTrackerURL(BValueNode* node)
+ {
+ if (!node || node->data().getType() != Value::STRING)
+ throw Error(i18n("Corrupted torrent!"));
+
+ // tracker_urls.append(KURL(node->data().toString(encoding).stripWhiteSpace()));
+ if (!trackers)
+ trackers = new TrackerTier();
+
+ trackers->urls.append(KURL(node->data().toString(encoding).stripWhiteSpace()));
+ }
+
+ void Torrent::loadPieceLength(BValueNode* node)
+ {
+ if (!node)
+ throw Error(i18n("Corrupted torrent!"));
+
+ if (node->data().getType() == Value::INT)
+ piece_length = node->data().toInt();
+ else if (node->data().getType() == Value::INT64)
+ piece_length = node->data().toInt64();
+ else
+ throw Error(i18n("Corrupted torrent!"));
+ }
+
+ void Torrent::loadFileLength(BValueNode* node)
+ {
+ if (!node)
+ throw Error(i18n("Corrupted torrent!"));
+
+ if (node->data().getType() == Value::INT)
+ file_length = node->data().toInt();
+ else if (node->data().getType() == Value::INT64)
+ file_length = node->data().toInt64();
+ else
+ throw Error(i18n("Corrupted torrent!"));
+ }
+
+ void Torrent::loadHash(BValueNode* node)
+ {
+ if (!node || node->data().getType() != Value::STRING)
+ throw Error(i18n("Corrupted torrent!"));
+
+
+ QByteArray hash_string = node->data().toByteArray();
+ for (unsigned int i = 0;i < hash_string.size();i+=20)
+ {
+ Uint8 h[20];
+ memcpy(h,hash_string.data()+i,20);
+ SHA1Hash hash(h);
+ hash_pieces.append(hash);
+ }
+ }
+
+ void Torrent::loadName(BValueNode* node)
+ {
+ if (!node || node->data().getType() != Value::STRING)
+ throw Error(i18n("Corrupted torrent!"));
+
+ name_suggestion = node->data().toString(encoding);
+ }
+
+ void Torrent::loadAnnounceList(BNode* node)
+ {
+ if (!node)
+ return;
+
+ BListNode* ml = dynamic_cast<BListNode*>(node);
+ if (!ml)
+ return;
+
+ if (!trackers)
+ trackers = new TrackerTier();
+
+ TrackerTier* tier = trackers;
+ //ml->printDebugInfo();
+ for (Uint32 i = 0;i < ml->getNumChildren();i++)
+ {
+ BListNode* url = dynamic_cast<BListNode*>(ml->getChild(i));
+ if (!url)
+ throw Error(i18n("Parse Error"));
+
+ for (Uint32 j = 0;j < url->getNumChildren();j++)
+ {
+ BValueNode* vn = dynamic_cast<BValueNode*>(url->getChild(j));
+ if (!vn)
+ throw Error(i18n("Parse Error"));
+
+ KURL url(vn->data().toString().stripWhiteSpace());
+ tier->urls.append(url);
+ //Out() << "Added tracker " << url << endl;
+ }
+ tier->next = new TrackerTier();
+ tier = tier->next;
+ }
+ }
+
+ void Torrent::loadNodes(BListNode* node)
+ {
+ for (Uint32 i = 0;i < node->getNumChildren();i++)
+ {
+ BListNode* c = node->getList(i);
+ if (!c || c->getNumChildren() != 2)
+ throw Error(i18n("Corrupted torrent!"));
+
+ // first child is the IP, second the port
+ BValueNode* ip = c->getValue(0);
+ BValueNode* port = c->getValue(1);
+ if (!ip || !port)
+ throw Error(i18n("Corrupted torrent!"));
+
+ if (ip->data().getType() != Value::STRING)
+ throw Error(i18n("Corrupted torrent!"));
+
+ if (port->data().getType() != Value::INT)
+ throw Error(i18n("Corrupted torrent!"));
+
+ // add the DHT node
+ kt::DHTNode n;
+ n.ip = ip->data().toString();
+ n.port = port->data().toInt();
+ nodes.append(n);
+ }
+ }
+
+ void Torrent::debugPrintInfo()
+ {
+ Out() << "Name : " << name_suggestion << endl;
+
+// for (KURL::List::iterator i = tracker_urls.begin();i != tracker_urls.end();i++)
+// Out() << "Tracker URL : " << *i << endl;
+
+ Out() << "Piece Length : " << piece_length << endl;
+ if (this->isMultiFile())
+ {
+ Out() << "Files : " << endl;
+ Out() << "===================================" << endl;
+ for (Uint32 i = 0;i < getNumFiles();i++)
+ {
+ TorrentFile & tf = getFile(i);
+ Out() << "Path : " << tf.getPath() << endl;
+ Out() << "Size : " << tf.getSize() << endl;
+ Out() << "First Chunk : " << tf.getFirstChunk() << endl;
+ Out() << "Last Chunk : " << tf.getLastChunk() << endl;
+ Out() << "First Chunk Off : " << tf.getFirstChunkOffset() << endl;
+ Out() << "Last Chunk Size : " << tf.getLastChunkSize() << endl;
+ Out() << "===================================" << endl;
+ }
+ }
+ else
+ {
+ Out() << "File Length : " << file_length << endl;
+ }
+ Out() << "Pieces : " << hash_pieces.size() << endl;
+ }
+
+ bool Torrent::verifyHash(const SHA1Hash & h,Uint32 index)
+ {
+ if (index >= hash_pieces.count())
+ return false;
+
+ const SHA1Hash & ph = hash_pieces[index];
+ return ph == h;
+ }
+
+ const SHA1Hash & Torrent::getHash(Uint32 idx) const
+ {
+ if (idx >= hash_pieces.count())
+ throw Error(QString("Torrent::getHash %1 is out of bounds").arg(idx));
+
+ return hash_pieces[idx];
+ }
+
+ TorrentFile & Torrent::getFile(Uint32 idx)
+ {
+ if (idx >= files.size())
+ return TorrentFile::null;
+
+ return files.at(idx);
+ }
+
+ const TorrentFile & Torrent::getFile(Uint32 idx) const
+ {
+ if (idx >= files.size())
+ return TorrentFile::null;
+
+ return files.at(idx);
+ }
+
+ unsigned int Torrent::getNumTrackerURLs() const
+ {
+ Uint32 count = 0;
+ TrackerTier* tt = trackers;
+ while (tt)
+ {
+ count += tt->urls.count();
+ tt = tt->next;
+ }
+ return count;
+ }
+
+ void Torrent::calcChunkPos(Uint32 chunk,QValueList<Uint32> & file_list) const
+ {
+ file_list.clear();
+ if (chunk >= hash_pieces.size() || files.empty())
+ return;
+
+ for (Uint32 i = 0;i < files.count();i++)
+ {
+ const TorrentFile & f = files[i];
+ if (chunk >= f.getFirstChunk() && chunk <= f.getLastChunk() && f.getSize() != 0)
+ file_list.append(f.getIndex());
+ }
+ }
+
+ bool Torrent::isMultimedia() const
+ {
+ return IsMultimediaFile(this->getNameSuggestion());
+ }
+
+ void Torrent::updateFilePercentage(const BitSet & bs)
+ {
+ for (Uint32 i = 0;i < files.count();i++)
+ {
+ TorrentFile & f = files[i];
+ f.updateNumDownloadedChunks(bs);
+ }
+ }
+
+ void Torrent::updateFilePercentage(Uint32 chunk,const BitSet & bs)
+ {
+ QValueList<Uint32> cfiles;
+ calcChunkPos(chunk,cfiles);
+
+ QValueList<Uint32>::iterator i = cfiles.begin();
+ while (i != cfiles.end())
+ {
+ TorrentFile & f = getFile(*i);
+ f.updateNumDownloadedChunks(bs);
+ i++;
+ }
+ }
+
+ bool Torrent::checkPathForDirectoryTraversal(const QString & p)
+ {
+ QStringList sl = QStringList::split(bt::DirSeparator(),p);
+ return !sl.contains("..");
+ }
+}
diff --git a/libktorrent/torrent/torrent.h b/libktorrent/torrent/torrent.h
new file mode 100644
index 0000000..04c45cd
--- /dev/null
+++ b/libktorrent/torrent/torrent.h
@@ -0,0 +1,218 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 BTTORRENT_H
+#define BTTORRENT_H
+
+#include <kurl.h>
+#include <qvaluevector.h>
+#include <util/sha1hash.h>
+#include <util/constants.h>
+#include <interfaces/torrentinterface.h>
+#include "globals.h"
+#include "peerid.h"
+#include "torrentfile.h"
+
+
+
+namespace bt
+{
+ class BNode;
+ class BValueNode;
+ class BDictNode;
+ class BListNode;
+
+
+ struct TrackerTier
+ {
+ KURL::List urls;
+ TrackerTier* next;
+
+ TrackerTier() : next(0)
+ {}
+
+ ~TrackerTier()
+ {
+ delete next;
+ }
+ };
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Loads a .torrent file
+ *
+ * Loads a torrent file and calculates some miscelanious other data,
+ * like the info_hash and the peer_id.
+ */
+ class Torrent
+ {
+ public:
+ Torrent();
+ virtual ~Torrent();
+
+ /**
+ * Load a .torrent file.
+ * @param file The file
+ * @param verbose Wether to print information to the log
+ * @throw Error if something goes wrong
+ */
+ void load(const QString & file,bool verbose);
+
+ /**
+ * Load a .torrent file.
+ * @param data The data
+ * @param verbose Wether to print information to the log
+ * @throw Error if something goes wrong
+ */
+ void load(const QByteArray & data,bool verbose);
+
+ void debugPrintInfo();
+
+ /// Get the number of chunks.
+ Uint32 getNumChunks() const {return hash_pieces.size();}
+
+ /// Get the size of a chunk.
+ Uint64 getChunkSize() const {return piece_length;}
+
+ /// Get the info_hash.
+ const SHA1Hash & getInfoHash() const {return info_hash;}
+
+ /// Get our peer_id.
+ const PeerID & getPeerID() const {return peer_id;}
+
+ /// Get the file size in number of bytes.
+ Uint64 getFileLength() const {return file_length;}
+
+ /// Get the suggested name.
+ QString getNameSuggestion() const {return name_suggestion;}
+
+ /**
+ * Verify wether a hash matches the hash
+ * of a Chunk
+ * @param h The hash
+ * @param index The index of the chunk
+ * @return true if they match
+ */
+ bool verifyHash(const SHA1Hash & h,Uint32 index);
+
+ /// Get the number of tracker URL's
+ unsigned int getNumTrackerURLs() const;
+
+ /**
+ * Get the hash of a Chunk. Throws an Error
+ * if idx is out of bounds.
+ * @param idx Index of Chunk
+ * @return The SHA1 hash of the chunk
+ */
+ const SHA1Hash & getHash(Uint32 idx) const;
+
+ /// See if we have a multi file torrent.
+ bool isMultiFile() const {return files.count() > 0;}
+
+ /// Get the number of files in a multi file torrent.
+ /// If we have a single file torrent, this will return 0.
+ Uint32 getNumFiles() const {return files.count();}
+
+ /**
+ * Get a TorrentFile. If the index is out of range, or
+ * we have a single file torrent we return a null TorrentFile.
+ * @param idx Index of the file
+ * @param A reference to the file
+ */
+ TorrentFile & getFile(Uint32 idx);
+
+ /**
+ * Get a TorrentFile. If the index is out of range, or
+ * we have a single file torrent we return a null TorrentFile.
+ * @param idx Index of the file
+ * @param A reference to the file
+ */
+ const TorrentFile & getFile(Uint32 idx) const;
+
+ /**
+ * Calculate in which file(s) a Chunk lies. A list will
+ * get filled with the indices of all the files. The list gets cleared at
+ * the beginning. If something is wrong only the list will
+ * get cleared.
+ * @param chunk The index of the chunk
+ * @param file_list This list will be filled with all the indices
+ */
+ void calcChunkPos(Uint32 chunk,QValueList<Uint32> & file_list) const;
+
+ /**
+ * Checks if torrent file is audio or video.
+ **/
+ bool isMultimedia() const;
+
+ /// See if the torrent is private
+ bool isPrivate() const {return priv_torrent;}
+
+ ///Gets a pointer to AnnounceList
+ const TrackerTier* getTrackerList() const { return trackers; }
+
+ /// Get the number of initial DHT nodes
+ Uint32 getNumDHTNodes() const {return nodes.count();}
+
+ /// Get a DHT node
+ const kt::DHTNode & getDHTNode(Uint32 i) {return nodes[i];}
+
+ /**
+ * Update the percentage of all files.
+ * @param bs The BitSet with all downloaded chunks
+ */
+ void updateFilePercentage(const BitSet & bs);
+
+ /**
+ * Update the percentage of a all files which have a particular chunk.
+ * @param bs The BitSet with all downloaded chunks
+ */
+ void updateFilePercentage(Uint32 chunk,const BitSet & bs);
+
+
+ private:
+ void loadInfo(BDictNode* node);
+ void loadTrackerURL(BValueNode* node);
+ void loadPieceLength(BValueNode* node);
+ void loadFileLength(BValueNode* node);
+ void loadHash(BValueNode* node);
+ void loadName(BValueNode* node);
+ void loadFiles(BListNode* node);
+ void loadNodes(BListNode* node);
+ void loadAnnounceList(BNode* node);
+ bool checkPathForDirectoryTraversal(const QString & p);
+
+ private:
+ TrackerTier* trackers;
+ QString name_suggestion;
+ Uint64 piece_length;
+ Uint64 file_length;
+ SHA1Hash info_hash;
+ PeerID peer_id;
+ QValueVector<SHA1Hash> hash_pieces;
+ QValueVector<TorrentFile> files;
+ QValueVector<kt::DHTNode> nodes;
+ QString encoding;
+ bool priv_torrent;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/torrentcontrol.cpp b/libktorrent/torrent/torrentcontrol.cpp
new file mode 100644
index 0000000..71b4e64
--- /dev/null
+++ b/libktorrent/torrent/torrentcontrol.cpp
@@ -0,0 +1,1770 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <qdir.h>
+#include <qfile.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+#include <qtextstream.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <util/bitset.h>
+#include <util/functions.h>
+#include <util/fileops.h>
+#include <util/waitjob.h>
+#include <interfaces/functions.h>
+#include <interfaces/trackerslist.h>
+#include <datachecker/singledatachecker.h>
+#include <datachecker/multidatachecker.h>
+#include <datachecker/datacheckerlistener.h>
+#include <datachecker/datacheckerthread.h>
+#include <migrate/ccmigrate.h>
+#include <migrate/cachemigrate.h>
+#include <kademlia/dhtbase.h>
+
+#include "downloader.h"
+#include "uploader.h"
+#include "peersourcemanager.h"
+#include "chunkmanager.h"
+#include "torrent.h"
+#include "peermanager.h"
+
+#include "torrentfile.h"
+#include "torrentcontrol.h"
+
+#include "peer.h"
+#include "choker.h"
+
+#include "globals.h"
+#include "server.h"
+#include "packetwriter.h"
+#include "httptracker.h"
+#include "udptracker.h"
+#include "downloadcap.h"
+#include "uploadcap.h"
+#include "queuemanager.h"
+#include "statsfile.h"
+#include "announcelist.h"
+#include "preallocationthread.h"
+#include "timeestimator.h"
+#include "settings.h"
+
+#include <net/socketmonitor.h>
+
+
+using namespace kt;
+
+namespace bt
+{
+
+
+
+ TorrentControl::TorrentControl()
+ : tor(0),psman(0),cman(0),pman(0),down(0),up(0),choke(0),tmon(0),prealloc(false)
+ {
+ istats.last_announce = 0;
+ stats.imported_bytes = 0;
+ stats.trk_bytes_downloaded = 0;
+ stats.trk_bytes_uploaded = 0;
+ stats.running = false;
+ stats.started = false;
+ stats.stopped_by_error = false;
+ stats.session_bytes_downloaded = 0;
+ stats.session_bytes_uploaded = 0;
+ istats.session_bytes_uploaded = 0;
+ old_datadir = QString::null;
+ stats.status = NOT_STARTED;
+ stats.autostart = true;
+ stats.user_controlled = false;
+ stats.priv_torrent = false;
+ stats.seeders_connected_to = stats.seeders_total = 0;
+ stats.leechers_connected_to = stats.leechers_total = 0;
+ istats.running_time_dl = istats.running_time_ul = 0;
+ istats.prev_bytes_dl = 0;
+ istats.prev_bytes_ul = 0;
+ istats.trk_prev_bytes_dl = istats.trk_prev_bytes_ul = 0;
+ istats.io_error = false;
+ istats.priority = 0;
+ stats.max_share_ratio = 0.00f;
+ istats.custom_output_name = false;
+ istats.diskspace_warning_emitted = false;
+ stats.max_seed_time = 0;
+ updateStats();
+ prealoc_thread = 0;
+ dcheck_thread = 0;
+ istats.dht_on = false;
+ stats.num_corrupted_chunks = 0;
+
+ m_eta = new TimeEstimator(this);
+ // by default no torrent limits
+ upload_gid = download_gid = 0;
+ upload_limit = download_limit = 0;
+ moving_files = false;
+ }
+
+
+
+
+ TorrentControl::~TorrentControl()
+ {
+ if (stats.running)
+ stop(false);
+
+ if (tmon)
+ tmon->destroyed();
+ delete choke;
+ delete down;
+ delete up;
+ delete cman;
+ delete pman;
+ delete psman;
+ delete tor;
+ delete m_eta;
+ }
+
+ void TorrentControl::update()
+ {
+ UpdateCurrentTime();
+ if (stats.status == kt::CHECKING_DATA || moving_files)
+ return;
+
+ if (istats.io_error)
+ {
+ stop(false);
+ emit stoppedByError(this, error_msg);
+ return;
+ }
+
+ if (prealoc_thread)
+ {
+ if (prealoc_thread->isDone())
+ {
+ // thread done
+ if (prealoc_thread->errorHappened())
+ {
+ // upon error just call onIOError and return
+ onIOError(prealoc_thread->errorMessage());
+ delete prealoc_thread;
+ prealoc_thread = 0;
+ prealloc = true; // still need to do preallocation
+ return;
+ }
+ else
+ {
+ // continue the startup of the torrent
+ delete prealoc_thread;
+ prealoc_thread = 0;
+ prealloc = false;
+ stats.status = kt::NOT_STARTED;
+ saveStats();
+ continueStart();
+ }
+ }
+ else
+ return; // preallocation still going on, so just return
+ }
+
+
+ try
+ {
+ // first update peermanager
+ pman->update();
+ bool comp = stats.completed;
+
+ //helper var, check if needed to move completed files somewhere
+ bool moveCompleted = false;
+
+ // then the downloader and uploader
+ up->update(choke->getOptimisticlyUnchokedPeerID());
+ down->update();
+
+ stats.completed = cman->completed();
+ if (stats.completed && !comp)
+ {
+ pman->killSeeders();
+ QDateTime now = QDateTime::currentDateTime();
+ istats.running_time_dl += istats.time_started_dl.secsTo(now);
+ updateStatusMsg();
+ updateStats();
+
+ // download has just been completed
+ // only sent completed to tracker when we have all chunks (so no excluded chunks)
+ if (cman->haveAllChunks())
+ psman->completed();
+
+ finished(this);
+
+ //Move completed download to specified directory if needed
+ if(Settings::useCompletedDir())
+ {
+ moveCompleted = true;
+ }
+ }
+ else if (!stats.completed && comp)
+ {
+ // restart download if necesarry
+ // when user selects that files which were previously excluded,
+ // should now be downloaded
+ if (!psman->isStarted())
+ psman->start();
+ else
+ psman->manualUpdate();
+ istats.last_announce = bt::GetCurrentTime();
+ istats.time_started_dl = QDateTime::currentDateTime();
+ }
+ updateStatusMsg();
+
+ // get rid of dead Peers
+ Uint32 num_cleared = pman->clearDeadPeers();
+
+ // we may need to update the choker
+ if (choker_update_timer.getElapsedSinceUpdate() >= 10000 || num_cleared > 0)
+ {
+ // also get rid of seeders & uninterested when download is finished
+ // no need to keep them around, but also no need to do this
+ // every update, so once every 10 seconds is fine
+ if (stats.completed)
+ {
+ pman->killSeeders();
+ }
+
+ doChoking();
+ choker_update_timer.update();
+ // a good opportunity to make sure we are not keeping to much in memory
+ cman->checkMemoryUsage();
+ }
+
+ // to satisfy people obsessed with their share ratio
+ if (stats_save_timer.getElapsedSinceUpdate() >= 5*60*1000)
+ {
+ saveStats();
+ stats_save_timer.update();
+ }
+
+ // Update DownloadCap
+ updateStats();
+
+ if (stats.download_rate > 0)
+ stalled_timer.update();
+
+ // do a manual update if we are stalled for more then 2 minutes
+ // we do not do this for private torrents
+ if (stalled_timer.getElapsedSinceUpdate() > 120000 && !stats.completed &&
+ !stats.priv_torrent)
+ {
+ Out(SYS_TRK|LOG_NOTICE) << "Stalled for too long, time to get some fresh blood" << endl;
+ psman->manualUpdate();
+ stalled_timer.update();
+ }
+
+ if(overMaxRatio() || overMaxSeedTime())
+ {
+ if(istats.priority!=0) //if it's queued make sure to dequeue it
+ {
+ setPriority(0);
+ stats.user_controlled = true;
+ }
+
+ stop(true);
+ emit seedingAutoStopped(this, overMaxRatio() ? kt::MAX_RATIO_REACHED : kt::MAX_SEED_TIME_REACHED);
+ }
+
+ //Update diskspace if needed (every 1 min)
+ if(!stats.completed && stats.running && bt::GetCurrentTime() - last_diskspace_check >= 60 * 1000)
+ {
+ checkDiskSpace(true);
+ }
+
+ //Move completed files if needed:
+ if (moveCompleted)
+ {
+ QString outdir = Settings::completedDir();
+ if(!outdir.endsWith(bt::DirSeparator()))
+ outdir += bt::DirSeparator();
+
+ changeOutputDir(outdir);
+ }
+ }
+ catch (Error & e)
+ {
+ onIOError(e.toString());
+ }
+ }
+
+ void TorrentControl::onIOError(const QString & msg)
+ {
+ Out(SYS_DIO|LOG_IMPORTANT) << "Error : " << msg << endl;
+ stats.stopped_by_error = true;
+ stats.status = ERROR;
+ error_msg = msg;
+ istats.io_error = true;
+ }
+
+ void TorrentControl::start()
+ {
+ // do not start running torrents
+ if (stats.running || stats.status == kt::ALLOCATING_DISKSPACE || moving_files)
+ return;
+
+ stats.stopped_by_error = false;
+ istats.diskspace_warning_emitted = false;
+ istats.io_error = false;
+ try
+ {
+ bool ret = true;
+ aboutToBeStarted(this,ret);
+ if (!ret)
+ return;
+ }
+ catch (Error & err)
+ {
+ // something went wrong when files were recreated, set error and rethrow
+ onIOError(err.toString());
+ return;
+ }
+
+ try
+ {
+ cman->start();
+ }
+ catch (Error & e)
+ {
+ onIOError(e.toString());
+ throw;
+ }
+
+ istats.time_started_ul = istats.time_started_dl = QDateTime::currentDateTime();
+ resetTrackerStats();
+
+ if (prealloc)
+ {
+ // only start preallocation if we are allowed by the settings
+ if (Settings::diskPrealloc() && !cman->haveAllChunks())
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Pre-allocating diskspace" << endl;
+ prealoc_thread = new PreallocationThread(cman);
+ stats.running = true;
+ stats.status = kt::ALLOCATING_DISKSPACE;
+ prealoc_thread->start();
+ return;
+ }
+ else
+ {
+ prealloc = false;
+ }
+ }
+
+ continueStart();
+ }
+
+ void TorrentControl::continueStart()
+ {
+ // continues start after the prealoc_thread has finished preallocation
+ pman->start();
+ pman->loadPeerList(datadir + "peer_list");
+ try
+ {
+ down->loadDownloads(datadir + "current_chunks");
+ }
+ catch (Error & e)
+ {
+ // print out warning in case of failure
+ // we can still continue the download
+ Out(SYS_GEN|LOG_NOTICE) << "Warning : " << e.toString() << endl;
+ }
+
+ loadStats();
+ stats.running = true;
+ stats.started = true;
+ stats.autostart = true;
+ choker_update_timer.update();
+ stats_save_timer.update();
+
+
+ stalled_timer.update();
+ psman->start();
+ istats.last_announce = bt::GetCurrentTime();
+ stalled_timer.update();
+ }
+
+
+ void TorrentControl::stop(bool user,WaitJob* wjob)
+ {
+ QDateTime now = QDateTime::currentDateTime();
+ if(!stats.completed)
+ istats.running_time_dl += istats.time_started_dl.secsTo(now);
+ istats.running_time_ul += istats.time_started_ul.secsTo(now);
+ istats.time_started_ul = istats.time_started_dl = now;
+
+ // stop preallocation thread if necesarry
+ if (prealoc_thread)
+ {
+ prealoc_thread->stop();
+ prealoc_thread->wait();
+
+ if (prealoc_thread->errorHappened() || prealoc_thread->isNotFinished())
+ {
+ delete prealoc_thread;
+ prealoc_thread = 0;
+ prealloc = true;
+ saveStats(); // save stats, so that we will start preallocating the next time
+ }
+ else
+ {
+ delete prealoc_thread;
+ prealoc_thread = 0;
+ prealloc = false;
+ }
+ }
+
+ if (stats.running)
+ {
+ psman->stop(wjob);
+
+ if (tmon)
+ tmon->stopped();
+
+ try
+ {
+ down->saveDownloads(datadir + "current_chunks");
+ }
+ catch (Error & e)
+ {
+ // print out warning in case of failure
+ // it doesn't corrupt the data, so just a couple of lost chunks
+ Out(SYS_GEN|LOG_NOTICE) << "Warning : " << e.toString() << endl;
+ }
+
+ down->clearDownloads();
+ if (user)
+ {
+ //make this torrent user controlled
+ setPriority(0);
+ stats.autostart = false;
+ }
+ }
+ pman->savePeerList(datadir + "peer_list");
+ pman->stop();
+ pman->closeAllConnections();
+ pman->clearDeadPeers();
+ cman->stop();
+
+ stats.running = false;
+ saveStats();
+ updateStatusMsg();
+ updateStats();
+ stats.trk_bytes_downloaded = 0;
+ stats.trk_bytes_uploaded = 0;
+
+ emit torrentStopped(this);
+ }
+
+ void TorrentControl::setMonitor(kt::MonitorInterface* tmo)
+ {
+ tmon = tmo;
+ down->setMonitor(tmon);
+ if (tmon)
+ {
+ for (Uint32 i = 0;i < pman->getNumConnectedPeers();i++)
+ tmon->peerAdded(pman->getPeer(i));
+ }
+ }
+
+
+ void TorrentControl::init(QueueManager* qman,
+ const QString & torrent,
+ const QString & tmpdir,
+ const QString & ddir,
+ const QString & default_save_dir)
+ {
+ // first load the torrent file
+ tor = new Torrent();
+ try
+ {
+ tor->load(torrent,false);
+ }
+ catch (...)
+ {
+ delete tor;
+ tor = 0;
+ throw Error(i18n("An error occurred while loading the torrent."
+ " The torrent is probably corrupt or is not a torrent file.\n%1").arg(torrent));
+ }
+
+ initInternal(qman,tmpdir,ddir,default_save_dir,torrent.startsWith(tmpdir));
+
+ // copy torrent in tor dir
+ QString tor_copy = datadir + "torrent";
+ if (tor_copy != torrent)
+ {
+ bt::CopyFile(torrent,tor_copy);
+ }
+
+ }
+
+
+ void TorrentControl::init(QueueManager* qman, const QByteArray & data,const QString & tmpdir,
+ const QString & ddir,const QString & default_save_dir)
+ {
+ // first load the torrent file
+ tor = new Torrent();
+ try
+ {
+ tor->load(data,false);
+ }
+ catch (...)
+ {
+ delete tor;
+ tor = 0;
+ throw Error(i18n("An error occurred while loading the torrent."
+ " The torrent is probably corrupt or is not a torrent file."));
+ }
+
+ initInternal(qman,tmpdir,ddir,default_save_dir,true);
+ // copy data into torrent file
+ QString tor_copy = datadir + "torrent";
+ QFile fptr(tor_copy);
+ if (!fptr.open(IO_WriteOnly))
+ throw Error(i18n("Unable to create %1 : %2")
+ .arg(tor_copy).arg(fptr.errorString()));
+
+ fptr.writeBlock(data.data(),data.size());
+ }
+
+ void TorrentControl::checkExisting(QueueManager* qman)
+ {
+ // check if we haven't already loaded the torrent
+ // only do this when qman isn't 0
+ if (qman && qman->allreadyLoaded(tor->getInfoHash()))
+ {
+ if (!stats.priv_torrent)
+ {
+ qman->mergeAnnounceList(tor->getInfoHash(),tor->getTrackerList());
+
+ throw Error(i18n("You are already downloading this torrent %1, the list of trackers of both torrents has been merged.").arg(tor->getNameSuggestion()));
+ }
+ else
+ {
+ throw Error(i18n("You are already downloading the torrent %1")
+ .arg(tor->getNameSuggestion()));
+ }
+ }
+ }
+
+ void TorrentControl::setupDirs(const QString & tmpdir,const QString & ddir)
+ {
+ datadir = tmpdir;
+
+ if (!datadir.endsWith(DirSeparator()))
+ datadir += DirSeparator();
+
+ outputdir = ddir.stripWhiteSpace();
+ if (outputdir.length() > 0 && !outputdir.endsWith(DirSeparator()))
+ outputdir += DirSeparator();
+
+ if (!bt::Exists(datadir))
+ {
+ bt::MakeDir(datadir);
+ }
+ }
+
+ void TorrentControl::setupStats()
+ {
+ stats.completed = false;
+ stats.running = false;
+ stats.torrent_name = tor->getNameSuggestion();
+ stats.multi_file_torrent = tor->isMultiFile();
+ stats.total_bytes = tor->getFileLength();
+ stats.priv_torrent = tor->isPrivate();
+
+ // check the stats file for the custom_output_name variable
+ StatsFile st(datadir + "stats");
+ if (st.hasKey("CUSTOM_OUTPUT_NAME") && st.readULong("CUSTOM_OUTPUT_NAME") == 1)
+ {
+ istats.custom_output_name = true;
+ }
+
+ // load outputdir if outputdir is null
+ if (outputdir.isNull() || outputdir.length() == 0)
+ loadOutputDir();
+ }
+
+ void TorrentControl::setupData(const QString & ddir)
+ {
+ // create PeerManager and Tracker
+ pman = new PeerManager(*tor);
+ //Out() << "Tracker url " << url << " " << url.protocol() << " " << url.prettyURL() << endl;
+ psman = new PeerSourceManager(this,pman);
+ connect(psman,SIGNAL(statusChanged( const QString& )),
+ this,SLOT(trackerStatusChanged( const QString& )));
+
+
+ // Create chunkmanager, load the index file if it exists
+ // else create all the necesarry files
+ cman = new ChunkManager(*tor,datadir,outputdir,istats.custom_output_name);
+ // outputdir is null, see if the cache has figured out what it is
+ if (outputdir.length() == 0)
+ outputdir = cman->getDataDir();
+
+ // store the outputdir into the output_path variable, so others can access it
+
+ connect(cman,SIGNAL(updateStats()),this,SLOT(updateStats()));
+ if (bt::Exists(datadir + "index"))
+ cman->loadIndexFile();
+
+ stats.completed = cman->completed();
+
+ // create downloader,uploader and choker
+ down = new Downloader(*tor,*pman,*cman);
+ connect(down,SIGNAL(ioError(const QString& )),
+ this,SLOT(onIOError(const QString& )));
+ up = new Uploader(*cman,*pman);
+ choke = new Choker(*pman,*cman);
+
+
+ connect(pman,SIGNAL(newPeer(Peer* )),this,SLOT(onNewPeer(Peer* )));
+ connect(pman,SIGNAL(peerKilled(Peer* )),this,SLOT(onPeerRemoved(Peer* )));
+ connect(cman,SIGNAL(excluded(Uint32, Uint32 )),down,SLOT(onExcluded(Uint32, Uint32 )));
+ connect(cman,SIGNAL(included( Uint32, Uint32 )),down,SLOT(onIncluded( Uint32, Uint32 )));
+ connect(cman,SIGNAL(corrupted( Uint32 )),this,SLOT(corrupted( Uint32 )));
+ }
+
+ void TorrentControl::initInternal(QueueManager* qman,
+ const QString & tmpdir,
+ const QString & ddir,
+ const QString & default_save_dir,
+ bool first_time)
+ {
+ checkExisting(qman);
+ setupDirs(tmpdir,ddir);
+ setupStats();
+
+ if (!first_time)
+ {
+ // if we do not need to copy the torrent, it is an existing download and we need to see
+ // if it is not an old download
+ try
+ {
+ migrateTorrent(default_save_dir);
+ }
+ catch (Error & err)
+ {
+
+ throw Error(
+ i18n("Cannot migrate %1 : %2")
+ .arg(tor->getNameSuggestion()).arg(err.toString()));
+ }
+ }
+ setupData(ddir);
+
+ updateStatusMsg();
+
+ // to get rid of phantom bytes we need to take into account
+ // the data from downloads already in progress
+ try
+ {
+ Uint64 db = down->bytesDownloaded();
+ Uint64 cb = down->getDownloadedBytesOfCurrentChunksFile(datadir + "current_chunks");
+ istats.prev_bytes_dl = db + cb;
+
+ // Out() << "Downloaded : " << kt::BytesToString(db) << endl;
+ // Out() << "current_chunks : " << kt::BytesToString(cb) << endl;
+ }
+ catch (Error & e)
+ {
+ // print out warning in case of failure
+ Out() << "Warning : " << e.toString() << endl;
+ istats.prev_bytes_dl = down->bytesDownloaded();
+ }
+
+ loadStats();
+ updateStats();
+ saveStats();
+ stats.output_path = cman->getOutputPath();
+ /* if (stats.output_path.isNull())
+ {
+ cman->createFiles();
+ stats.output_path = cman->getOutputPath();
+ }*/
+ Out() << "OutputPath = " << stats.output_path << endl;
+ }
+
+
+
+ bool TorrentControl::announceAllowed()
+ {
+ if(istats.last_announce == 0)
+ return true;
+
+ if (psman && psman->getNumFailures() == 0)
+ return bt::GetCurrentTime() - istats.last_announce >= 60 * 1000;
+ else
+ return true;
+ }
+
+ void TorrentControl::updateTracker()
+ {
+ if (stats.running && announceAllowed())
+ {
+ psman->manualUpdate();
+ istats.last_announce = bt::GetCurrentTime();
+ }
+ }
+
+ void TorrentControl::onNewPeer(Peer* p)
+ {
+ connect(p,SIGNAL(gotPortPacket( const QString&, Uint16 )),
+ this,SLOT(onPortPacket( const QString&, Uint16 )));
+
+ if (p->getStats().fast_extensions)
+ {
+ const BitSet & bs = cman->getBitSet();
+ if (bs.allOn())
+ p->getPacketWriter().sendHaveAll();
+ else if (bs.numOnBits() == 0)
+ p->getPacketWriter().sendHaveNone();
+ else
+ p->getPacketWriter().sendBitSet(bs);
+ }
+ else
+ {
+ p->getPacketWriter().sendBitSet(cman->getBitSet());
+ }
+
+ if (!stats.completed)
+ p->getPacketWriter().sendInterested();
+
+ if (!stats.priv_torrent)
+ {
+ if (p->isDHTSupported())
+ p->getPacketWriter().sendPort(Globals::instance().getDHT().getPort());
+ else
+ // WORKAROUND so we can contact µTorrent's DHT
+ // They do not properly support the standard and do not turn on
+ // the DHT bit in the handshake, so we just ping each peer by default.
+ p->emitPortPacket();
+ }
+
+ // set group ID's for traffic shaping
+ p->setGroupIDs(upload_gid,download_gid);
+
+ if (tmon)
+ tmon->peerAdded(p);
+ }
+
+ void TorrentControl::onPeerRemoved(Peer* p)
+ {
+ disconnect(p,SIGNAL(gotPortPacket( const QString&, Uint16 )),
+ this,SLOT(onPortPacket( const QString&, Uint16 )));
+ if (tmon)
+ tmon->peerRemoved(p);
+ }
+
+ void TorrentControl::doChoking()
+ {
+ choke->update(stats.completed,stats);
+ }
+
+ bool TorrentControl::changeDataDir(const QString & new_dir)
+ {
+ int pos = datadir.findRev(bt::DirSeparator(),-2);
+ if (pos == -1)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Could not find torX part in " << datadir << endl;
+ return false;
+ }
+
+ QString ndatadir = new_dir + datadir.mid(pos + 1);
+
+ Out(SYS_GEN|LOG_DEBUG) << datadir << " -> " << ndatadir << endl;
+ try
+ {
+ bt::Move(datadir,ndatadir);
+ old_datadir = datadir;
+ datadir = ndatadir;
+ }
+ catch (Error & err)
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Could not move " << datadir << " to " << ndatadir << endl;
+ return false;
+ }
+
+ cman->changeDataDir(datadir);
+ return true;
+ }
+
+ bool TorrentControl::changeOutputDir(const QString & new_dir, bool moveFiles)
+ {
+ if (moving_files)
+ return false;
+
+ Out(SYS_GEN|LOG_NOTICE) << "Moving data for torrent " << stats.torrent_name << " to " << new_dir << endl;
+
+ restart_torrent_after_move_data_files = false;
+
+ //check if torrent is running and stop it before moving data
+ if(stats.running)
+ {
+ restart_torrent_after_move_data_files = true;
+ this->stop(false);
+ }
+
+ moving_files = true;
+ try
+ {
+ QString nd;
+ if (istats.custom_output_name)
+ {
+ int slash_pos = stats.output_path.findRev(bt::DirSeparator(),-2);
+ nd = new_dir + stats.output_path.mid(slash_pos + 1);
+ }
+ else
+ {
+ nd = new_dir + tor->getNameSuggestion();
+ }
+
+ if (stats.output_path != nd)
+ {
+ KIO::Job* j = 0;
+ if(moveFiles)
+ {
+ if (stats.multi_file_torrent)
+ j = cman->moveDataFiles(nd);
+ else
+ j = cman->moveDataFiles(new_dir);
+ }
+
+ move_data_files_destination_path = nd;
+ if (j)
+ {
+ connect(j,SIGNAL(result(KIO::Job*)),this,SLOT(moveDataFilesJobDone(KIO::Job*)));
+ return true;
+ }
+ else
+ {
+ moveDataFilesJobDone(0);
+ }
+ }
+ else
+ {
+ Out(SYS_GEN|LOG_NOTICE) << "Source is the same as destination, so doing nothing" << endl;
+ }
+ }
+ catch (Error& err)
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Could not move " << stats.output_path << " to " << new_dir << ". Exception: " << err.toString() << endl;
+ moving_files = false;
+ return false;
+ }
+
+ moving_files = false;
+ if (restart_torrent_after_move_data_files)
+ {
+ this->start();
+ }
+
+ return true;
+ }
+
+ void TorrentControl::moveDataFilesJobDone(KIO::Job* job)
+ {
+ if (job)
+ cman->moveDataFilesCompleted(job);
+
+ if (!job || (job && !job->error()))
+ {
+ cman->changeOutputPath(move_data_files_destination_path);
+ outputdir = stats.output_path = move_data_files_destination_path;
+ istats.custom_output_name = true;
+
+ saveStats();
+ Out(SYS_GEN|LOG_NOTICE) << "Data directory changed for torrent " << "'" << stats.torrent_name << "' to: " << move_data_files_destination_path << endl;
+ }
+ else if (job->error())
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Could not move " << stats.output_path << " to " << move_data_files_destination_path << endl;
+ }
+
+ moving_files = false;
+ if (restart_torrent_after_move_data_files)
+ {
+ this->start();
+ }
+ }
+
+
+ void TorrentControl::rollback()
+ {
+ try
+ {
+ bt::Move(datadir,old_datadir);
+ datadir = old_datadir;
+ cman->changeDataDir(datadir);
+ }
+ catch (Error & err)
+ {
+ Out(SYS_GEN|LOG_IMPORTANT) << "Could not move " << datadir << " to " << old_datadir << endl;
+ }
+ }
+
+ void TorrentControl::updateStatusMsg()
+ {
+ if (stats.stopped_by_error)
+ stats.status = kt::ERROR;
+ else if (!stats.started)
+ stats.status = kt::NOT_STARTED;
+ else if(!stats.running && !stats.user_controlled)
+ stats.status = kt::QUEUED;
+ else if (!stats.running && stats.completed && (overMaxRatio() || overMaxSeedTime()))
+ stats.status = kt::SEEDING_COMPLETE;
+ else if (!stats.running && stats.completed)
+ stats.status = kt::DOWNLOAD_COMPLETE;
+ else if (!stats.running)
+ stats.status = kt::STOPPED;
+ else if (stats.running && stats.completed)
+ stats.status = kt::SEEDING;
+ else if (stats.running)
+ // protocol messages are also included in speed calculation, so lets not compare with 0
+ stats.status = down->downloadRate() > 100 ?
+ kt::DOWNLOADING : kt::STALLED;
+ }
+
+ const BitSet & TorrentControl::downloadedChunksBitSet() const
+ {
+ if (cman)
+ return cman->getBitSet();
+ else
+ return BitSet::null;
+ }
+
+ const BitSet & TorrentControl::availableChunksBitSet() const
+ {
+ if (!pman)
+ return BitSet::null;
+ else
+ return pman->getAvailableChunksBitSet();
+ }
+
+ const BitSet & TorrentControl::excludedChunksBitSet() const
+ {
+ if (!cman)
+ return BitSet::null;
+ else
+ return cman->getExcludedBitSet();
+ }
+
+ const BitSet & TorrentControl::onlySeedChunksBitSet() const
+ {
+ if (!cman)
+ return BitSet::null;
+ else
+ return cman->getOnlySeedBitSet();
+ }
+
+ void TorrentControl::saveStats()
+ {
+ StatsFile st(datadir + "stats");
+
+ st.write("OUTPUTDIR", cman->getDataDir());
+
+ if (cman->getDataDir() != outputdir)
+ outputdir = cman->getDataDir();
+
+ st.write("UPLOADED", QString::number(up->bytesUploaded()));
+
+ if (stats.running)
+ {
+ QDateTime now = QDateTime::currentDateTime();
+ st.write("RUNNING_TIME_DL",QString("%1").arg(istats.running_time_dl + istats.time_started_dl.secsTo(now)));
+ st.write("RUNNING_TIME_UL",QString("%1").arg(istats.running_time_ul + istats.time_started_ul.secsTo(now)));
+ }
+ else
+ {
+ st.write("RUNNING_TIME_DL", QString("%1").arg(istats.running_time_dl));
+ st.write("RUNNING_TIME_UL", QString("%1").arg(istats.running_time_ul));
+ }
+
+ st.write("PRIORITY", QString("%1").arg(istats.priority));
+ st.write("AUTOSTART", QString("%1").arg(stats.autostart));
+ st.write("IMPORTED", QString("%1").arg(stats.imported_bytes));
+ st.write("CUSTOM_OUTPUT_NAME",istats.custom_output_name ? "1" : "0");
+ st.write("MAX_RATIO", QString("%1").arg(stats.max_share_ratio,0,'f',2));
+ st.write("MAX_SEED_TIME",QString::number(stats.max_seed_time));
+ st.write("RESTART_DISK_PREALLOCATION",prealloc ? "1" : "0");
+
+ if(!stats.priv_torrent)
+ {
+ //save dht and pex
+ st.write("DHT", isFeatureEnabled(kt::DHT_FEATURE) ? "1" : "0");
+ st.write("UT_PEX", isFeatureEnabled(kt::UT_PEX_FEATURE) ? "1" : "0");
+ }
+
+ st.write("UPLOAD_LIMIT",QString::number(upload_limit));
+ st.write("DOWNLOAD_LIMIT",QString::number(download_limit));
+
+ st.writeSync();
+ }
+
+ void TorrentControl::loadStats()
+ {
+ StatsFile st(datadir + "stats");
+
+ Uint64 val = st.readUint64("UPLOADED");
+ // stats.session_bytes_uploaded will be calculated based upon prev_bytes_ul
+ // seeing that this will change here, we need to save it
+ istats.session_bytes_uploaded = stats.session_bytes_uploaded;
+ istats.prev_bytes_ul = val;
+ up->setBytesUploaded(val);
+
+ this->istats.running_time_dl = st.readULong("RUNNING_TIME_DL");
+ this->istats.running_time_ul = st.readULong("RUNNING_TIME_UL");
+ outputdir = st.readString("OUTPUTDIR").stripWhiteSpace();
+ if (st.hasKey("CUSTOM_OUTPUT_NAME") && st.readULong("CUSTOM_OUTPUT_NAME") == 1)
+ {
+ istats.custom_output_name = true;
+ }
+
+ setPriority(st.readInt("PRIORITY"));
+ stats.user_controlled = istats.priority == 0 ? true : false;
+ stats.autostart = st.readBoolean("AUTOSTART");
+
+ stats.imported_bytes = st.readUint64("IMPORTED");
+ float rat = st.readFloat("MAX_RATIO");
+ stats.max_share_ratio = rat;
+ if (st.hasKey("RESTART_DISK_PREALLOCATION"))
+ prealloc = st.readString("RESTART_DISK_PREALLOCATION") == "1";
+
+ stats.max_seed_time = st.readFloat("MAX_SEED_TIME");
+
+ if (!stats.priv_torrent)
+ {
+ if(st.hasKey("DHT"))
+ istats.dht_on = st.readBoolean("DHT");
+ else
+ istats.dht_on = true;
+
+ setFeatureEnabled(kt::DHT_FEATURE,istats.dht_on);
+ if (st.hasKey("UT_PEX"))
+ setFeatureEnabled(kt::UT_PEX_FEATURE,st.readBoolean("UT_PEX"));
+ }
+
+ net::SocketMonitor & smon = net::SocketMonitor::instance();
+
+ Uint32 nl = st.readInt("UPLOAD_LIMIT");
+ if (nl != upload_limit)
+ {
+ if (nl > 0)
+ {
+ if (upload_gid)
+ smon.setGroupLimit(net::SocketMonitor::UPLOAD_GROUP,upload_gid,nl);
+ else
+ upload_gid = smon.newGroup(net::SocketMonitor::UPLOAD_GROUP,nl);
+ }
+ else
+ {
+ smon.removeGroup(net::SocketMonitor::UPLOAD_GROUP,upload_gid);
+ upload_gid = 0;
+ }
+ }
+ upload_limit = nl;
+
+ nl = st.readInt("DOWNLOAD_LIMIT");
+ if (nl != download_limit)
+ {
+ if (nl > 0)
+ {
+ if (download_gid)
+ smon.setGroupLimit(net::SocketMonitor::DOWNLOAD_GROUP,download_gid,nl);
+ else
+ download_gid = smon.newGroup(net::SocketMonitor::DOWNLOAD_GROUP,nl);
+ }
+ else
+ {
+ smon.removeGroup(net::SocketMonitor::DOWNLOAD_GROUP,download_gid);
+ download_gid = 0;
+ }
+ }
+ download_limit = nl;
+ }
+
+ void TorrentControl::loadOutputDir()
+ {
+ StatsFile st(datadir + "stats");
+ if (!st.hasKey("OUTPUTDIR"))
+ return;
+
+ outputdir = st.readString("OUTPUTDIR").stripWhiteSpace();
+ if (st.hasKey("CUSTOM_OUTPUT_NAME") && st.readULong("CUSTOM_OUTPUT_NAME") == 1)
+ {
+ istats.custom_output_name = true;
+ }
+ }
+
+ bool TorrentControl::readyForPreview(int start_chunk, int end_chunk)
+ {
+ if ( !tor->isMultimedia() && !tor->isMultiFile()) return false;
+
+ const BitSet & bs = downloadedChunksBitSet();
+ for(int i = start_chunk; i<end_chunk; ++i)
+ {
+ if ( !bs.get(i) ) return false;
+ }
+ return true;
+ }
+
+ Uint32 TorrentControl::getTimeToNextTrackerUpdate() const
+ {
+ if (psman)
+ return psman->getTimeToNextUpdate();
+ else
+ return 0;
+ }
+
+ void TorrentControl::updateStats()
+ {
+ stats.num_chunks_downloading = down ? down->numActiveDownloads() : 0;
+ stats.num_peers = pman ? pman->getNumConnectedPeers() : 0;
+ stats.upload_rate = up && stats.running ? up->uploadRate() : 0;
+ stats.download_rate = down && stats.running ? down->downloadRate() : 0;
+ stats.bytes_left = cman ? cman->bytesLeft() : 0;
+ stats.bytes_left_to_download = cman ? cman->bytesLeftToDownload() : 0;
+ stats.bytes_uploaded = up ? up->bytesUploaded() : 0;
+ stats.bytes_downloaded = down ? down->bytesDownloaded() : 0;
+ stats.total_chunks = tor ? tor->getNumChunks() : 0;
+ stats.num_chunks_downloaded = cman ? cman->chunksDownloaded() : 0;
+ stats.num_chunks_excluded = cman ? cman->chunksExcluded() : 0;
+ stats.chunk_size = tor ? tor->getChunkSize() : 0;
+ stats.num_chunks_left = cman ? cman->chunksLeft() : 0;
+ stats.total_bytes_to_download = (tor && cman) ? tor->getFileLength() - cman->bytesExcluded() : 0;
+
+ if (stats.bytes_downloaded >= istats.prev_bytes_dl)
+ stats.session_bytes_downloaded = stats.bytes_downloaded - istats.prev_bytes_dl;
+ else
+ stats.session_bytes_downloaded = 0;
+
+ if (stats.bytes_uploaded >= istats.prev_bytes_ul)
+ stats.session_bytes_uploaded = (stats.bytes_uploaded - istats.prev_bytes_ul) + istats.session_bytes_uploaded;
+ else
+ stats.session_bytes_uploaded = istats.session_bytes_uploaded;
+ /*
+ Safety check, it is possible that stats.bytes_downloaded gets subtracted in Downloader.
+ Which can cause stats.bytes_downloaded to be smaller the istats.trk_prev_bytes_dl.
+ This can screw up your download ratio.
+ */
+ if (stats.bytes_downloaded >= istats.trk_prev_bytes_dl)
+ stats.trk_bytes_downloaded = stats.bytes_downloaded - istats.trk_prev_bytes_dl;
+ else
+ stats.trk_bytes_downloaded = 0;
+
+ if (stats.bytes_uploaded >= istats.trk_prev_bytes_ul)
+ stats.trk_bytes_uploaded = stats.bytes_uploaded - istats.trk_prev_bytes_ul;
+ else
+ stats.trk_bytes_uploaded = 0;
+
+ getSeederInfo(stats.seeders_total,stats.seeders_connected_to);
+ getLeecherInfo(stats.leechers_total,stats.leechers_connected_to);
+ }
+
+ void TorrentControl::getSeederInfo(Uint32 & total,Uint32 & connected_to) const
+ {
+ total = 0;
+ connected_to = 0;
+ if (!pman || !psman)
+ return;
+
+ for (Uint32 i = 0;i < pman->getNumConnectedPeers();i++)
+ {
+ if (pman->getPeer(i)->isSeeder())
+ connected_to++;
+ }
+ total = psman->getNumSeeders();
+ if (total == 0)
+ total = connected_to;
+ }
+
+ void TorrentControl::getLeecherInfo(Uint32 & total,Uint32 & connected_to) const
+ {
+ total = 0;
+ connected_to = 0;
+ if (!pman || !psman)
+ return;
+
+ for (Uint32 i = 0;i < pman->getNumConnectedPeers();i++)
+ {
+ if (!pman->getPeer(i)->isSeeder())
+ connected_to++;
+ }
+ total = psman->getNumLeechers();
+ if (total == 0)
+ total = connected_to;
+ }
+
+ Uint32 TorrentControl::getRunningTimeDL() const
+ {
+ if (!stats.running || stats.completed)
+ return istats.running_time_dl;
+ else
+ return istats.running_time_dl + istats.time_started_dl.secsTo(QDateTime::currentDateTime());
+ }
+
+ Uint32 TorrentControl::getRunningTimeUL() const
+ {
+ if (!stats.running)
+ return istats.running_time_ul;
+ else
+ return istats.running_time_ul + istats.time_started_ul.secsTo(QDateTime::currentDateTime());
+ }
+
+ Uint32 TorrentControl::getNumFiles() const
+ {
+ if (tor && tor->isMultiFile())
+ return tor->getNumFiles();
+ else
+ return 0;
+ }
+
+ TorrentFileInterface & TorrentControl::getTorrentFile(Uint32 index)
+ {
+ if (tor)
+ return tor->getFile(index);
+ else
+ return TorrentFile::null;
+ }
+
+ void TorrentControl::migrateTorrent(const QString & default_save_dir)
+ {
+ if (bt::Exists(datadir + "current_chunks") && bt::IsPreMMap(datadir + "current_chunks"))
+ {
+ // in case of error copy torX dir to migrate-failed-tor
+ QString dd = datadir;
+ int pos = dd.findRev("tor");
+ if (pos != - 1)
+ {
+ dd = dd.replace(pos,3,"migrate-failed-tor");
+ Out() << "Copying " << datadir << " to " << dd << endl;
+ bt::CopyDir(datadir,dd,true);
+ }
+
+ bt::MigrateCurrentChunks(*tor,datadir + "current_chunks");
+ if (outputdir.isNull() && bt::IsCacheMigrateNeeded(*tor,datadir + "cache"))
+ {
+ // if the output dir is NULL
+ if (default_save_dir.isNull())
+ {
+ KMessageBox::information(0,
+ i18n("The torrent %1 was started with a previous version of KTorrent."
+ " To make sure this torrent still works with this version of KTorrent, "
+ "we will migrate this torrent. You will be asked for a location to save "
+ "the torrent to. If you press cancel, we will select your home directory.")
+ .arg(tor->getNameSuggestion()));
+ outputdir = KFileDialog::getExistingDirectory(QString::null, 0,i18n("Select Folder to Save To"));
+ if (outputdir.isNull())
+ outputdir = QDir::homeDirPath();
+ }
+ else
+ {
+ outputdir = default_save_dir;
+ }
+
+ if (!outputdir.endsWith(bt::DirSeparator()))
+ outputdir += bt::DirSeparator();
+
+ bt::MigrateCache(*tor,datadir + "cache",outputdir);
+ }
+
+ // delete backup
+ if (pos != - 1)
+ bt::Delete(dd);
+ }
+ }
+
+ void TorrentControl::setPriority(int p)
+ {
+ istats.priority = p;
+ stats.user_controlled = p == 0 ? true : false;
+ if(p)
+ stats.status = kt::QUEUED;
+ else
+ updateStatusMsg();
+
+ saveStats();
+ }
+
+ void TorrentControl::setMaxShareRatio(float ratio)
+ {
+ if(ratio == 1.00f)
+ {
+ if (stats.max_share_ratio != ratio)
+ stats.max_share_ratio = ratio;
+ }
+ else
+ stats.max_share_ratio = ratio;
+
+ if(stats.completed && !stats.running && !stats.user_controlled && (kt::ShareRatio(stats) >= stats.max_share_ratio))
+ setPriority(0); //dequeue it
+
+ saveStats();
+ emit maxRatioChanged(this);
+ }
+
+ void TorrentControl::setMaxSeedTime(float hours)
+ {
+ stats.max_seed_time = hours;
+ saveStats();
+ }
+
+ bool TorrentControl::overMaxRatio()
+ {
+ if(stats.completed && stats.bytes_uploaded != 0 && stats.bytes_downloaded != 0 && stats.max_share_ratio > 0)
+ {
+ if(kt::ShareRatio(stats) >= stats.max_share_ratio)
+ return true;
+ }
+
+ return false;
+ }
+
+ bool TorrentControl::overMaxSeedTime()
+ {
+ if(stats.completed && stats.bytes_uploaded != 0 && stats.bytes_downloaded != 0 && stats.max_seed_time > 0)
+ {
+ Uint32 dl = getRunningTimeDL();
+ Uint32 ul = getRunningTimeUL();
+ if ((ul - dl) / 3600.0f > stats.max_seed_time)
+ return true;
+ }
+
+ return false;
+ }
+
+
+ QString TorrentControl::statusToString() const
+ {
+ switch (stats.status)
+ {
+ case kt::NOT_STARTED :
+ return i18n("Not started");
+ case kt::DOWNLOAD_COMPLETE :
+ return i18n("Download completed");
+ case kt::SEEDING_COMPLETE :
+ return i18n("Seeding completed");
+ case kt::SEEDING :
+ return i18n("Seeding");
+ case kt::DOWNLOADING:
+ return i18n("Downloading");
+ case kt::STALLED:
+ return i18n("Stalled");
+ case kt::STOPPED:
+ return i18n("Stopped");
+ case kt::ERROR :
+ return i18n("Error: ") + getShortErrorMessage();
+ case kt::ALLOCATING_DISKSPACE:
+ return i18n("Allocating diskspace");
+ case kt::QUEUED:
+ return i18n("Queued");
+ case kt::CHECKING_DATA:
+ return i18n("Checking data");
+ case kt::NO_SPACE_LEFT:
+ return i18n("Stopped. No space left on device.");
+ }
+ return QString::null;
+ }
+
+ TrackersList* TorrentControl::getTrackersList()
+ {
+ return psman;
+ }
+
+ const TrackersList* TorrentControl::getTrackersList() const
+ {
+ return psman;
+ }
+
+ void TorrentControl::onPortPacket(const QString & ip,Uint16 port)
+ {
+ if (Globals::instance().getDHT().isRunning() && !stats.priv_torrent)
+ Globals::instance().getDHT().portRecieved(ip,port);
+ }
+
+ void TorrentControl::startDataCheck(bt::DataCheckerListener* lst,bool auto_import)
+ {
+ if (stats.status == kt::ALLOCATING_DISKSPACE)
+ return;
+
+
+ DataChecker* dc = 0;
+ stats.status = kt::CHECKING_DATA;
+ stats.num_corrupted_chunks = 0; // reset the number of corrupted chunks found
+ if (stats.multi_file_torrent)
+ dc = new MultiDataChecker();
+ else
+ dc = new SingleDataChecker();
+
+ dc->setListener(lst);
+
+ dcheck_thread = new DataCheckerThread(dc,stats.output_path,*tor,datadir + "dnd" + bt::DirSeparator());
+
+ // dc->check(stats.output_path,*tor,datadir + "dnd" + bt::DirSeparator());
+ dcheck_thread->start();
+ }
+
+ void TorrentControl::afterDataCheck()
+ {
+ DataChecker* dc = dcheck_thread->getDataChecker();
+ DataCheckerListener* lst = dc->getListener();
+
+ bool err = !dcheck_thread->getError().isNull();
+ if (err)
+ {
+ // show a queued error message when an error has occurred
+ KMessageBox::queuedMessageBox(0,KMessageBox::Error,dcheck_thread->getError());
+ lst->stop();
+ }
+
+ if (lst && !lst->isStopped())
+ {
+ down->dataChecked(dc->getDownloaded());
+ // update chunk manager
+ cman->dataChecked(dc->getDownloaded());
+ if (lst->isAutoImport())
+ {
+ down->recalcDownloaded();
+ stats.imported_bytes = down->bytesDownloaded();
+ if (cman->haveAllChunks())
+ stats.completed = true;
+ }
+ else
+ {
+ Uint64 downloaded = stats.bytes_downloaded;
+ down->recalcDownloaded();
+ updateStats();
+ if (stats.bytes_downloaded > downloaded)
+ stats.imported_bytes = stats.bytes_downloaded - downloaded;
+
+ if (cman->haveAllChunks())
+ stats.completed = true;
+ }
+ }
+
+ stats.status = kt::NOT_STARTED;
+ // update the status
+ updateStatusMsg();
+ updateStats();
+ if (lst)
+ lst->finished();
+ delete dcheck_thread;
+ dcheck_thread = 0;
+ }
+
+ bool TorrentControl::isCheckingData(bool & finished) const
+ {
+ if (dcheck_thread)
+ {
+ finished = !dcheck_thread->isRunning();
+ return true;
+ }
+ return false;
+ }
+
+ bool TorrentControl::hasExistingFiles() const
+ {
+ return cman->hasExistingFiles();
+ }
+
+ bool TorrentControl::hasMissingFiles(QStringList & sl)
+ {
+ return cman->hasMissingFiles(sl);
+ }
+
+ void TorrentControl::recreateMissingFiles()
+ {
+ try
+ {
+ cman->recreateMissingFiles();
+ prealloc = true; // set prealloc to true so files will be truncated again
+ down->dataChecked(cman->getBitSet()); // update chunk selector
+ }
+ catch (Error & err)
+ {
+ onIOError(err.toString());
+ throw;
+ }
+ }
+
+ void TorrentControl::dndMissingFiles()
+ {
+ try
+ {
+ cman->dndMissingFiles();
+ prealloc = true; // set prealloc to true so files will be truncated again
+ missingFilesMarkedDND(this);
+ down->dataChecked(cman->getBitSet()); // update chunk selector
+ }
+ catch (Error & err)
+ {
+ onIOError(err.toString());
+ throw;
+ }
+ }
+
+ void TorrentControl::handleError(const QString & err)
+ {
+ onIOError(err);
+ }
+
+ Uint32 TorrentControl::getNumDHTNodes() const
+ {
+ return tor->getNumDHTNodes();
+ }
+
+ const kt::DHTNode & TorrentControl::getDHTNode(Uint32 i) const
+ {
+ return tor->getDHTNode(i);
+ }
+
+ void TorrentControl::deleteDataFiles()
+ {
+ cman->deleteDataFiles();
+ }
+
+ const bt::SHA1Hash & TorrentControl::getInfoHash() const
+ {
+ return tor->getInfoHash();
+ }
+
+ void TorrentControl::resetTrackerStats()
+ {
+ istats.trk_prev_bytes_dl = stats.bytes_downloaded,
+ istats.trk_prev_bytes_ul = stats.bytes_uploaded,
+ stats.trk_bytes_downloaded = 0;
+ stats.trk_bytes_uploaded = 0;
+ }
+
+ void TorrentControl::trackerStatusChanged(const QString & ns)
+ {
+ stats.trackerstatus = ns;
+ }
+
+ void TorrentControl::addPeerSource(kt::PeerSource* ps)
+ {
+ if (psman)
+ psman->addPeerSource(ps);
+ }
+
+ void TorrentControl::removePeerSource(kt::PeerSource* ps)
+ {
+ if (psman)
+ psman->removePeerSource(ps);
+ }
+
+ void TorrentControl::corrupted(Uint32 chunk)
+ {
+ // make sure we will redownload the chunk
+ down->corrupted(chunk);
+ if (stats.completed)
+ stats.completed = false;
+
+ // emit signal to show a systray message
+ stats.num_corrupted_chunks++;
+ corruptedDataFound(this);
+ }
+
+ Uint32 TorrentControl::getETA()
+ {
+ return m_eta->estimate();
+ }
+
+
+
+ const bt::PeerID & TorrentControl::getOwnPeerID() const
+ {
+ return tor->getPeerID();
+ }
+
+
+ bool TorrentControl::isFeatureEnabled(TorrentFeature tf)
+ {
+ switch (tf)
+ {
+ case kt::DHT_FEATURE:
+ return psman->dhtStarted();
+ case kt::UT_PEX_FEATURE:
+ return pman->isPexEnabled();
+ default:
+ return false;
+ }
+ }
+
+ void TorrentControl::setFeatureEnabled(TorrentFeature tf,bool on)
+ {
+ switch (tf)
+ {
+ case kt::DHT_FEATURE:
+ if (on)
+ {
+ if(!stats.priv_torrent)
+ {
+ psman->addDHT();
+ istats.dht_on = psman->dhtStarted();
+ saveStats();
+ }
+ }
+ else
+ {
+ psman->removeDHT();
+ istats.dht_on = false;
+ saveStats();
+ }
+ break;
+ case kt::UT_PEX_FEATURE:
+ if (on)
+ {
+ if (!stats.priv_torrent && !pman->isPexEnabled())
+ {
+ pman->setPexEnabled(true);
+ }
+ }
+ else
+ {
+ pman->setPexEnabled(false);
+ }
+ break;
+ }
+ }
+
+ void TorrentControl::createFiles()
+ {
+ cman->createFiles(true);
+ stats.output_path = cman->getOutputPath();
+ }
+
+ bool TorrentControl::checkDiskSpace(bool emit_sig)
+ {
+ last_diskspace_check = bt::GetCurrentTime();
+
+ //calculate free disk space
+ Uint64 bytes_free = 0;
+ if (FreeDiskSpace(getDataDir(),bytes_free))
+ {
+ Uint64 bytes_to_download = stats.total_bytes_to_download;
+ Uint64 downloaded = 0;
+ try
+ {
+ downloaded = cman->diskUsage();
+ }
+ catch (bt::Error & err)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Error : " << err.toString() << endl;
+ }
+ Uint64 remaining = 0;
+ if (downloaded <= bytes_to_download)
+ remaining = bytes_to_download - downloaded;
+
+ if (remaining > bytes_free)
+ {
+ bool toStop = bytes_free < (Uint64) Settings::minDiskSpace() * 1024 * 1024;
+
+ // if we don't need to stop the torrent, only emit the signal once
+ // so that we do bother the user continously
+ if (emit_sig && (toStop || !istats.diskspace_warning_emitted))
+ {
+ emit diskSpaceLow(this, toStop);
+ istats.diskspace_warning_emitted = true;
+ }
+
+ if (!stats.running)
+ {
+ stats.status = NO_SPACE_LEFT;
+ }
+
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ void TorrentControl::setTrafficLimits(Uint32 up,Uint32 down)
+ {
+ net::SocketMonitor & smon = net::SocketMonitor::instance();
+ if (up && !upload_gid)
+ {
+ // create upload group
+ upload_gid = smon.newGroup(net::SocketMonitor::UPLOAD_GROUP,up);
+ upload_limit = up;
+ }
+ else if (up && upload_gid)
+ {
+ // change existing group limit
+ smon.setGroupLimit(net::SocketMonitor::UPLOAD_GROUP,upload_gid,up);
+ upload_limit = up;
+ }
+ else if (!up && !upload_gid)
+ {
+ upload_limit = up;
+ }
+ else // !up && upload_gid
+ {
+ // remove existing group
+ smon.removeGroup(net::SocketMonitor::UPLOAD_GROUP,upload_gid);
+ upload_gid = upload_limit = 0;
+ }
+
+ if (down && !download_gid)
+ {
+ // create download grodown
+ download_gid = smon.newGroup(net::SocketMonitor::DOWNLOAD_GROUP,down);
+ download_limit = down;
+ }
+ else if (down && download_gid)
+ {
+ // change existing grodown limit
+ smon.setGroupLimit(net::SocketMonitor::DOWNLOAD_GROUP,download_gid,down);
+ download_limit = down;
+ }
+ else if (!down && !download_gid)
+ {
+ download_limit = down;
+ }
+ else // !down && download_gid
+ {
+ // remove existing grodown
+ smon.removeGroup(net::SocketMonitor::DOWNLOAD_GROUP,download_gid);
+ download_gid = download_limit = 0;
+ }
+
+ saveStats();
+ pman->setGroupIDs(upload_gid,download_gid);
+ }
+
+ void TorrentControl::getTrafficLimits(Uint32 & up,Uint32 & down)
+ {
+ up = upload_limit;
+ down = download_limit;
+ }
+
+ const PeerManager * TorrentControl::getPeerMgr() const
+ {
+ return pman;
+ }
+}
+
+#include "torrentcontrol.moc"
diff --git a/libktorrent/torrent/torrentcontrol.h b/libktorrent/torrent/torrentcontrol.h
new file mode 100644
index 0000000..33610de
--- /dev/null
+++ b/libktorrent/torrent/torrentcontrol.h
@@ -0,0 +1,394 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 BTTORRENTCONTROL_H
+#define BTTORRENTCONTROL_H
+
+#include <qobject.h>
+#include <qcstring.h>
+#include <qtimer.h>
+#include <kurl.h>
+#include "globals.h"
+#include <util/timer.h>
+#include <interfaces/torrentinterface.h>
+#include <interfaces/monitorinterface.h>
+#include <interfaces/trackerslist.h>
+
+class QStringList;
+class QString;
+
+namespace KIO
+{
+ class Job;
+}
+
+
+namespace bt
+{
+ class Choker;
+ class Torrent;
+ class PeerSourceManager;
+ class ChunkManager;
+ class PeerManager;
+ class Downloader;
+ class Uploader;
+ class Peer;
+ class BitSet;
+ class QueueManager;
+ class PreallocationThread;
+ class TimeEstimator;
+ class DataCheckerThread;
+ class WaitJob;
+
+ /**
+ * @author Joris Guisson
+ * @brief Controls just about everything
+ *
+ * This is the interface which any user gets to deal with.
+ * This class controls the uploading, downloading, choking,
+ * updating the tracker and chunk management.
+ */
+ class TorrentControl : public kt::TorrentInterface
+ {
+ Q_OBJECT
+ public:
+ TorrentControl();
+ virtual ~TorrentControl();
+
+ /**
+ * Get a BitSet of the status of all Chunks
+ */
+ const BitSet & downloadedChunksBitSet() const;
+
+ /**
+ * Get a BitSet of the availability of all Chunks
+ */
+ const BitSet & availableChunksBitSet() const;
+
+ /**
+ * Get a BitSet of the excluded Chunks
+ */
+ const BitSet & excludedChunksBitSet() const;
+
+ /**
+ * Get a BitSet of the only seed chunks
+ */
+ const BitSet & onlySeedChunksBitSet() const;
+
+ /**
+ * Initialize the TorrentControl.
+ * @param qman The QueueManager
+ * @param torrent The filename of the torrent file
+ * @param tmpdir The directory to store temporary data
+ * @param datadir The directory to store the actual file(s)
+ * (only used the first time we load a torrent)
+ * @param default_save_dir Default save directory (null if not set)
+ * @throw Error when something goes wrong
+ */
+ void init(QueueManager* qman,
+ const QString & torrent,
+ const QString & tmpdir,
+ const QString & datadir,
+ const QString & default_save_dir);
+
+ /**
+ * Initialize the TorrentControl.
+ * @param qman The QueueManager
+ * @param data The data of the torrent
+ * @param tmpdir The directory to store temporary data
+ * @param datadir The directory to store the actual file(s)
+ * (only used the first time we load a torrent)
+ * @param default_save_dir Default save directory (null if not set)
+ * @throw Error when something goes wrong
+ */
+ void init(QueueManager* qman,
+ const QByteArray & data,
+ const QString & tmpdir,
+ const QString & datadir,
+ const QString & default_save_dir);
+
+ /**
+ * Change to a new data dir. If this fails
+ * we will fall back on the old directory.
+ * @param new_dir The new directory
+ * @return true upon succes
+ */
+ bool changeDataDir(const QString & new_dir);
+
+
+ /**
+ * Change torrents output directory. If this fails we will fall back on the old directory.
+ * @param new_dir The new directory
+ * @param moveFiles Wheather to actually move the files or just change the directory without moving them.
+ * @return true upon success.
+ */
+ bool changeOutputDir(const QString& new_dir, bool moveFiles = true);
+
+ /**
+ * Roll back the previous changeDataDir call.
+ * Does nothing if there was no previous changeDataDir call.
+ */
+ void rollback();
+
+ /// Gets the TrackersList interface
+ kt::TrackersList* getTrackersList();
+
+ /// Gets the TrackersList interface
+ const kt::TrackersList* getTrackersList() const;
+
+ /// Get the data directory of this torrent
+ QString getDataDir() const {return outputdir;}
+
+ /// Get the torX dir.
+ QString getTorDir() const {return datadir;}
+
+ /// Set the monitor
+ void setMonitor(kt::MonitorInterface* tmo);
+
+ /// Get the Torrent.
+ const Torrent & getTorrent() const {return *tor;}
+
+ /**
+ * Get the download running time of this torrent in seconds
+ * @return Uint32 - time in seconds
+ */
+ Uint32 getRunningTimeDL() const;
+
+ /**
+ * Get the upload running time of this torrent in seconds
+ * @return Uint32 - time in seconds
+ */
+ Uint32 getRunningTimeUL() const;
+
+ /**
+ * Checks if torrent is multimedial and chunks needed for preview are downloaded
+ * @param start_chunk The index of starting chunk to check
+ * @param end_chunk The index of the last chunk to check
+ * In case of single torrent file defaults can be used (0,1)
+ **/
+ bool readyForPreview(int start_chunk = 0, int end_chunk = 1);
+
+ /// Get the time to the next tracker update in seconds.
+ Uint32 getTimeToNextTrackerUpdate() const;
+
+ /// Get a short error message
+ QString getShortErrorMessage() const {return error_msg;}
+
+ virtual Uint32 getNumFiles() const;
+ virtual kt::TorrentFileInterface & getTorrentFile(Uint32 index);
+ virtual void recreateMissingFiles();
+ virtual void dndMissingFiles();
+ virtual void addPeerSource(kt::PeerSource* ps);
+ virtual void removePeerSource(kt::PeerSource* ps);
+
+ int getPriority() const { return istats.priority; }
+ void setPriority(int p);
+
+ virtual bool overMaxRatio();
+ virtual void setMaxShareRatio(float ratio);
+ virtual float getMaxShareRatio() const { return stats.max_share_ratio; }
+
+ virtual bool overMaxSeedTime();
+ virtual void setMaxSeedTime(float hours);
+ virtual float getMaxSeedTime() const {return stats.max_seed_time;}
+
+ /// Tell the TorrentControl obj to preallocate diskspace in the next update
+ void setPreallocateDiskSpace(bool pa) {prealloc = pa;}
+
+ /// Make a string out of the status message
+ virtual QString statusToString() const;
+
+ /// Checks if tracker announce is allowed (minimum interval 60 seconds)
+ bool announceAllowed();
+
+ void startDataCheck(bt::DataCheckerListener* lst,bool auto_import);
+
+ /// Test if the torrent has existing files, only works the first time a torrent is loaded
+ bool hasExistingFiles() const;
+
+ /**
+ * Test all files and see if they are not missing.
+ * If so put them in a list
+ */
+ bool hasMissingFiles(QStringList & sl);
+
+
+ virtual Uint32 getNumDHTNodes() const;
+ virtual const kt::DHTNode & getDHTNode(Uint32 i) const;
+ virtual void deleteDataFiles();
+ virtual const SHA1Hash & getInfoHash() const;
+ virtual const bt::PeerID & getOwnPeerID() const;
+
+ /**
+ * Called by the PeerSourceManager when it is going to start a new tracker.
+ */
+ void resetTrackerStats();
+
+ /**
+ * Returns estimated time left for finishing download. Returned value is in seconds.
+ * Uses TimeEstimator class to calculate this value.
+ */
+ Uint32 getETA();
+
+ /// Is a feature enabled
+ bool isFeatureEnabled(kt::TorrentFeature tf);
+
+ /// Disable or enable a feature
+ void setFeatureEnabled(kt::TorrentFeature tf,bool on);
+
+ /// Create all the necessary files
+ void createFiles();
+
+ ///Checks if diskspace is low
+ bool checkDiskSpace(bool emit_sig = true);
+
+ virtual void setTrafficLimits(Uint32 up,Uint32 down);
+ virtual void getTrafficLimits(Uint32 & up,Uint32 & down);
+
+ ///Get the PeerManager
+ const PeerManager * getPeerMgr() const;
+
+ /// Are we in the process of moving files
+ bool isMovingFiles() const {return moving_files;}
+
+ public slots:
+ /**
+ * Update the object, should be called periodically.
+ */
+ void update();
+
+ /**
+ * Start the download of the torrent.
+ */
+ void start();
+
+ /**
+ * Stop the download, closes all connections.
+ * @param user wether or not the user did this explicitly
+ * @param wjob WaitJob to wait at exit for the completion of stopped requests
+ */
+ void stop(bool user,WaitJob* wjob = 0);
+
+ /**
+ * Update the tracker, this should normally handled internally.
+ * We leave it public so that the user can do a manual announce.
+ */
+ void updateTracker();
+
+ /**
+ * The tracker status has changed.
+ * @param ns New status
+ */
+ void trackerStatusChanged(const QString & ns);
+
+ private slots:
+ void onNewPeer(Peer* p);
+ void onPeerRemoved(Peer* p);
+ void doChoking();
+ void onIOError(const QString & msg);
+ void onPortPacket(const QString & ip,Uint16 port);
+ /// Update the stats of the torrent.
+ void updateStats();
+ void corrupted(Uint32 chunk);
+ void moveDataFilesJobDone(KIO::Job* job);
+
+ private:
+ void updateTracker(const QString & ev,bool last_succes = true);
+ void updateStatusMsg();
+ void saveStats();
+ void loadStats();
+ void loadOutputDir();
+ void getSeederInfo(Uint32 & total,Uint32 & connected_to) const;
+ void getLeecherInfo(Uint32 & total,Uint32 & connected_to) const;
+ void migrateTorrent(const QString & default_save_dir);
+ void continueStart();
+ virtual void handleError(const QString & err);
+
+ void initInternal(QueueManager* qman,const QString & tmpdir,
+ const QString & ddir,const QString & default_save_dir,bool first_time);
+
+ void checkExisting(QueueManager* qman);
+ void setupDirs(const QString & tmpdir,const QString & ddir);
+ void setupStats();
+ void setupData(const QString & ddir);
+ virtual void afterDataCheck();
+ virtual bool isCheckingData(bool & finished) const;
+
+ private:
+ Torrent* tor;
+ PeerSourceManager* psman;
+ ChunkManager* cman;
+ PeerManager* pman;
+ Downloader* down;
+ Uploader* up;
+ Choker* choke;
+ TimeEstimator* m_eta;
+ kt::MonitorInterface* tmon;
+
+ Timer choker_update_timer;
+ Timer stats_save_timer;
+ Timer stalled_timer;
+
+ QString datadir;
+ QString old_datadir;
+ QString outputdir;
+ QString error_msg;
+
+ QString move_data_files_destination_path;
+ bool restart_torrent_after_move_data_files;
+
+ bool prealloc;
+ PreallocationThread* prealoc_thread;
+ DataCheckerThread* dcheck_thread;
+ TimeStamp last_diskspace_check;
+ bool moving_files;
+
+ struct InternalStats
+ {
+ QDateTime time_started_dl;
+ QDateTime time_started_ul;
+ Uint32 running_time_dl;
+ Uint32 running_time_ul;
+ Uint64 prev_bytes_dl;
+ Uint64 prev_bytes_ul;
+ Uint64 trk_prev_bytes_dl;
+ Uint64 trk_prev_bytes_ul;
+ Uint64 session_bytes_uploaded;
+ bool io_error;
+ bool custom_output_name;
+ Uint16 port;
+ int priority;
+ bool dht_on;
+ TimeStamp last_announce;
+ bool diskspace_warning_emitted;
+ };
+
+ Uint32 upload_gid; // group ID for upload
+ Uint32 upload_limit;
+ Uint32 download_gid; // group ID for download
+ Uint32 download_limit;
+
+ InternalStats istats;
+ };
+
+
+}
+
+#endif
diff --git a/libktorrent/torrent/torrentcreator.cpp b/libktorrent/torrent/torrentcreator.cpp
new file mode 100644
index 0000000..7b132b8
--- /dev/null
+++ b/libktorrent/torrent/torrentcreator.cpp
@@ -0,0 +1,388 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qdir.h>
+#include <qfileinfo.h>
+#include <klocale.h>
+#include <time.h>
+#include <util/error.h>
+#include <ktversion.h>
+#include "torrentcontrol.h"
+#include "torrentcreator.h"
+#include "bencoder.h"
+#include <util/file.h>
+#include <util/sha1hash.h>
+#include <util/fileops.h>
+#include <util/log.h>
+#include <util/array.h>
+#include <util/functions.h>
+#include "globals.h"
+#include "chunkmanager.h"
+#include "statsfile.h"
+
+namespace bt
+{
+
+ TorrentCreator::TorrentCreator(const QString & tar,
+ const QStringList & track,
+ Uint32 cs,
+ const QString & name,
+ const QString & comments,bool priv, bool decentralized)
+ : target(tar),trackers(track),chunk_size(cs),
+ name(name),comments(comments),cur_chunk(0),priv(priv),tot_size(0), decentralized(decentralized)
+ {
+ this->chunk_size *= 1024;
+ QFileInfo fi(target);
+ if (fi.isDir())
+ {
+ if (!this->target.endsWith(bt::DirSeparator()))
+ this->target += bt::DirSeparator();
+
+ tot_size = 0;
+ buildFileList("");
+ num_chunks = tot_size / chunk_size;
+ if (tot_size % chunk_size > 0)
+ num_chunks++;
+ last_size = tot_size % chunk_size;
+ Out() << "Tot Size : " << tot_size << endl;
+ }
+ else
+ {
+ tot_size = bt::FileSize(target);
+ num_chunks = tot_size / chunk_size;
+ if (tot_size % chunk_size > 0)
+ num_chunks++;
+ last_size = tot_size % chunk_size;
+ Out() << "Tot Size : " << tot_size << endl;
+ }
+
+ if (last_size == 0)
+ last_size = chunk_size;
+
+ Out() << "Num Chunks : " << num_chunks << endl;
+ Out() << "Chunk Size : " << chunk_size << endl;
+ Out() << "Last Size : " << last_size << endl;
+ }
+
+
+ TorrentCreator::~TorrentCreator()
+ {}
+
+ void TorrentCreator::buildFileList(const QString & dir)
+ {
+ QDir d(target + dir);
+ // first get all files (we ignore symlinks)
+ QStringList dfiles = d.entryList(QDir::Files|QDir::NoSymLinks);
+ Uint32 cnt = 0; // counter to keep track of file index
+ for (QStringList::iterator i = dfiles.begin();i != dfiles.end();++i)
+ {
+ // add a TorrentFile to the list
+ Uint64 fs = bt::FileSize(target + dir + *i);
+ TorrentFile f(cnt,dir + *i,tot_size,fs,chunk_size);
+ files.append(f);
+ // update total size
+ tot_size += fs;
+ cnt++;
+ }
+
+ // now for each subdir do a buildFileList
+ QStringList subdirs = d.entryList(QDir::Dirs|QDir::NoSymLinks);
+ for (QStringList::iterator i = subdirs.begin();i != subdirs.end();++i)
+ {
+ if (*i == "." || *i == "..")
+ continue;
+
+ QString sd = dir + *i;
+ if (!sd.endsWith(bt::DirSeparator()))
+ sd += bt::DirSeparator();
+ buildFileList(sd);
+ }
+ }
+
+
+ void TorrentCreator::saveTorrent(const QString & url)
+ {
+ File fptr;
+ if (!fptr.open(url,"wb"))
+ throw Error(i18n("Cannot open file %1: %2").arg(url).arg(fptr.errorString()));
+
+ BEncoder enc(&fptr);
+ enc.beginDict(); // top dict
+
+ if(!decentralized)
+ {
+ enc.write("announce"); enc.write(trackers[0]);
+ if (trackers.count() > 1)
+ {
+ enc.write("announce-list");
+ enc.beginList();
+ enc.beginList();
+ for (Uint32 i = 0;i < trackers.count();i++)
+ enc.write(trackers[i]);
+ enc.end();
+ enc.end();
+
+ }
+ }
+
+
+ if (comments.length() > 0)
+ {
+ enc.write("comments");
+ enc.write(comments);
+ }
+ enc.write("created by");enc.write(QString("KTorrent %1").arg(kt::VERSION_STRING));
+ enc.write("creation date");enc.write((Uint64)time(0));
+ enc.write("info");
+ saveInfo(enc);
+ // save the nodes list after the info hash, keys must be sorted !
+ if (decentralized)
+ {
+ //DHT torrent
+ enc.write("nodes");
+ enc.beginList();
+
+ for(int i=0; i < trackers.count(); ++i)
+ {
+ QString t = trackers[i];
+ enc.beginList();
+ enc.write(t.section(',',0,0));
+ enc.write((Uint32)t.section(',',1,1).toInt());
+ enc.end();
+ }
+ enc.end();
+ }
+
+ enc.end();
+ }
+
+ void TorrentCreator::saveInfo(BEncoder & enc)
+ {
+ enc.beginDict();
+
+ QFileInfo fi(target);
+ if (fi.isDir())
+ {
+ enc.write("files");
+ enc.beginList();
+ QValueList<TorrentFile>::iterator i = files.begin();
+ while (i != files.end())
+ {
+ saveFile(enc,*i);
+ i++;
+ }
+ enc.end();
+ }
+ else
+ {
+ enc.write("length"); enc.write(bt::FileSize(target));
+ }
+ enc.write("name"); enc.write(name);
+ enc.write("piece length"); enc.write((Uint64)chunk_size);
+ enc.write("pieces"); savePieces(enc);
+ if (priv)
+ {
+ enc.write("private");
+ enc.write((Uint64)1);
+ }
+ enc.end();
+ }
+
+ void TorrentCreator::saveFile(BEncoder & enc,const TorrentFile & file)
+ {
+ enc.beginDict();
+ enc.write("length");enc.write(file.getSize());
+ enc.write("path");
+ enc.beginList();
+ QStringList sl = QStringList::split(bt::DirSeparator(),file.getPath());
+ for (QStringList::iterator i = sl.begin();i != sl.end();i++)
+ enc.write(*i);
+ enc.end();
+ enc.end();
+ }
+
+ void TorrentCreator::savePieces(BEncoder & enc)
+ {
+ if (hashes.empty())
+ while (!calculateHash())
+ ;
+
+ Array<Uint8> big_hash(num_chunks*20);
+ for (Uint32 i = 0;i < num_chunks;++i)
+ {
+ memcpy(big_hash+(20*i),hashes[i].getData(),20);
+ }
+ enc.write(big_hash,num_chunks*20);
+ }
+
+ bool TorrentCreator::calcHashSingle()
+ {
+ Array<Uint8> buf(chunk_size);
+ File fptr;
+ if (!fptr.open(target,"rb"))
+ throw Error(i18n("Cannot open file %1: %2")
+ .arg(target).arg(fptr.errorString()));
+
+ Uint32 s = cur_chunk != num_chunks - 1 ? chunk_size : last_size;
+ fptr.seek(File::BEGIN,(Int64)cur_chunk*chunk_size);
+
+ fptr.read(buf,s);
+ SHA1Hash h = SHA1Hash::generate(buf,s);
+ hashes.append(h);
+ cur_chunk++;
+ return cur_chunk >= num_chunks;
+ }
+
+ bool TorrentCreator::calcHashMulti()
+ {
+ Uint32 s = cur_chunk != num_chunks - 1 ? chunk_size : last_size;
+ // first find the file(s) the chunk lies in
+ Array<Uint8> buf(s);
+ QValueList<TorrentFile> file_list;
+ Uint32 i = 0;
+ while (i < files.size())
+ {
+ const TorrentFile & tf = files[i];
+ if (cur_chunk >= tf.getFirstChunk() && cur_chunk <= tf.getLastChunk())
+ {
+ file_list.append(tf);
+ }
+
+ i++;
+ }
+
+ Uint32 read = 0;
+ for (i = 0;i < file_list.count();i++)
+ {
+ const TorrentFile & f = file_list[i];
+ File fptr;
+ if (!fptr.open(target + f.getPath(),"rb"))
+ {
+ throw Error(i18n("Cannot open file %1: %2")
+ .arg(f.getPath()).arg(fptr.errorString()));
+ }
+
+ // first calculate offset into file
+ // only the first file can have an offset
+ // the following files will start at the beginning
+ Uint64 off = 0;
+ if (i == 0)
+ off = f.fileOffset(cur_chunk,chunk_size);
+
+ Uint32 to_read = 0;
+ // then the amount of data we can read from this file
+ if (file_list.count() == 1)
+ to_read = s;
+ else if (i == 0)
+ to_read = f.getLastChunkSize();
+ else if (i == file_list.count() - 1)
+ to_read = s - read;
+ else
+ to_read = f.getSize();
+
+ // read part of data
+ fptr.seek(File::BEGIN,(Int64)off);
+ fptr.read(buf + read,to_read);
+ read += to_read;
+ }
+
+ // generate hash
+ SHA1Hash h = SHA1Hash::generate(buf,s);
+ hashes.append(h);
+
+ cur_chunk++;
+ // Out() << "=============================================" << endl;
+ return cur_chunk >= num_chunks;
+ }
+
+ bool TorrentCreator::calculateHash()
+ {
+ if (cur_chunk >= num_chunks)
+ return true;
+ if (files.empty())
+ return calcHashSingle();
+ else
+ return calcHashMulti();
+ }
+
+ TorrentControl* TorrentCreator::makeTC(const QString & data_dir)
+ {
+ QString dd = data_dir;
+ if (!dd.endsWith(bt::DirSeparator()))
+ dd += bt::DirSeparator();
+
+ // make data dir if necessary
+ if (!bt::Exists(dd))
+ bt::MakeDir(dd);
+
+ // save the torrent
+ saveTorrent(dd + "torrent");
+ // write full index file
+ File fptr;
+ if (!fptr.open(dd + "index","wb"))
+ throw Error(i18n("Cannot create index file: %1").arg(fptr.errorString()));
+
+ for (Uint32 i = 0;i < num_chunks;i++)
+ {
+ NewChunkHeader hdr;
+ hdr.index = i;
+ fptr.write(&hdr,sizeof(NewChunkHeader));
+ }
+ fptr.close();
+
+ // now create the torrentcontrol object
+ TorrentControl* tc = new TorrentControl();
+ try
+ {
+ // get the parent dir of target
+ QFileInfo fi = QFileInfo(target);
+
+ QString odir;
+ StatsFile st(dd + "stats");
+ if (fi.fileName() == name)
+ {
+ st.write("OUTPUTDIR", fi.dirPath(true));
+ odir = fi.dirPath(true);
+ }
+ else
+ {
+ st.write("CUSTOM_OUTPUT_NAME","1");
+ st.write("OUTPUTDIR", target);
+ odir = target;
+ }
+ st.write("UPLOADED", "0");
+ st.write("RUNNING_TIME_DL","0");
+ st.write("RUNNING_TIME_UL","0");
+ st.write("PRIORITY", "0");
+ st.write("AUTOSTART", "1");
+ st.write("IMPORTED", QString::number(tot_size));
+ st.writeSync();
+
+ tc->init(0,dd + "torrent",dd,odir,QString::null);
+ tc->createFiles();
+ }
+ catch (...)
+ {
+ delete tc;
+ throw;
+ }
+
+ return tc;
+ }
+}
diff --git a/libktorrent/torrent/torrentcreator.h b/libktorrent/torrent/torrentcreator.h
new file mode 100644
index 0000000..c7057e2
--- /dev/null
+++ b/libktorrent/torrent/torrentcreator.h
@@ -0,0 +1,114 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTTORRENTCREATOR_H
+#define BTTORRENTCREATOR_H
+
+#include <qstringlist.h>
+#include "torrent.h"
+#include <util/sha1hash.h>
+
+namespace bt
+{
+ class BEncoder;
+ class TorrentControl;
+
+ /**
+ * @author Joris Guisson
+ * @brief Class to generate torrent files
+ *
+ * This class generates torrent files.
+ * It also allows to create a TorrentControl object, so
+ * that we immediately can start to share the torrent.
+ */
+ class TorrentCreator
+ {
+ // input values
+ QString target;
+ QStringList trackers;
+ int chunk_size;
+ QString name,comments;
+ // calculated values
+ Uint32 num_chunks;
+ Uint64 last_size;
+ QValueList<TorrentFile> files;
+ QValueList<SHA1Hash> hashes;
+ //
+ Uint32 cur_chunk;
+ bool priv;
+ Uint64 tot_size;
+ bool decentralized;
+ public:
+ /**
+ * Constructor.
+ * @param target The file or directory to make a torrent of
+ * @param trackers A list of tracker urls
+ * @param chunk_size The size of each chunk
+ * @param name The name suggestion
+ * @param comments The comments field of the torrent
+ * @param priv Private torrent or not
+ */
+ TorrentCreator(const QString & target,const QStringList & trackers,
+ Uint32 chunk_size,const QString & name,
+ const QString & comments,bool priv,bool decentralized);
+ virtual ~TorrentCreator();
+
+
+ /**
+ * Calculate the hash of a chunk, this function should be called
+ * until it returns true. We do it this way so that the calling
+ * function can display a progress dialog.
+ * @return true if all hashes are calculated, false otherwise
+ */
+ bool calculateHash();
+
+ /// Get the number of chunks
+ Uint32 getNumChunks() const {return num_chunks;}
+
+ /**
+ * Save the torrent file.
+ * @param url Filename
+ * @throw Error if something goes wrong
+ */
+ void saveTorrent(const QString & url);
+
+ /**
+ * Make a TorrentControl object for this torrent.
+ * This will also create the files :
+ * data_dir/index
+ * data_dir/torrent
+ * data_dir/cache (symlink to target)
+ * @param data_dir The data directory
+ * @throw Error if something goes wrong
+ * @return The newly created object
+ */
+ TorrentControl* makeTC(const QString & data_dir);
+
+ private:
+ void saveInfo(BEncoder & enc);
+ void saveFile(BEncoder & enc,const TorrentFile & file);
+ void savePieces(BEncoder & enc);
+ void buildFileList(const QString & dir);
+ bool calcHashSingle();
+ bool calcHashMulti();
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/torrentfile.cpp b/libktorrent/torrent/torrentfile.cpp
new file mode 100644
index 0000000..9c21a4a
--- /dev/null
+++ b/libktorrent/torrent/torrentfile.cpp
@@ -0,0 +1,200 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 <math.h>
+#include <util/log.h>
+#include <util/bitset.h>
+#include <util/functions.h>
+#include "globals.h"
+#include "torrentfile.h"
+
+namespace bt
+{
+
+ TorrentFile::TorrentFile() : TorrentFileInterface(QString::null,0),missing(false),filetype(UNKNOWN)
+ {}
+
+ TorrentFile::TorrentFile(Uint32 index,const QString & path,
+ Uint64 off,Uint64 size,Uint64 chunk_size)
+ : TorrentFileInterface(path,size),index(index),cache_offset(off),missing(false),filetype(UNKNOWN)
+ {
+ first_chunk = off / chunk_size;
+ first_chunk_off = off % chunk_size;
+ if (size > 0)
+ last_chunk = (off + size - 1) / chunk_size;
+ else
+ last_chunk = first_chunk;
+ last_chunk_size = (off + size) - last_chunk * chunk_size;
+ priority = old_priority = NORMAL_PRIORITY;
+ }
+
+ TorrentFile::TorrentFile(const TorrentFile & tf)
+ : TorrentFileInterface(QString::null,0)
+ {
+ index = tf.getIndex();
+ path = tf.getPath();
+ size = tf.getSize();
+ cache_offset = tf.getCacheOffset();
+ first_chunk = tf.getFirstChunk();
+ first_chunk_off = tf.getFirstChunkOffset();
+ last_chunk = tf.getLastChunk();
+ last_chunk_size = tf.getLastChunkSize();
+ old_priority = priority = tf.getPriority();
+ missing = tf.isMissing();
+ filetype = UNKNOWN;
+ }
+
+ TorrentFile::~TorrentFile()
+ {}
+
+ void TorrentFile::setDoNotDownload(bool dnd)
+ {
+ if (priority != EXCLUDED && dnd)
+ {
+ if(m_emitDlStatusChanged)
+ old_priority = priority;
+
+ priority = EXCLUDED;
+
+ if(m_emitDlStatusChanged)
+ emit downloadPriorityChanged(this,priority,old_priority);
+ }
+ if (priority == EXCLUDED && (!dnd))
+ {
+ if(m_emitDlStatusChanged)
+ old_priority = priority;
+
+ priority = NORMAL_PRIORITY;
+
+ if(m_emitDlStatusChanged)
+ emit downloadPriorityChanged(this,priority,old_priority);
+ }
+ }
+
+ void TorrentFile::emitDownloadStatusChanged()
+ {
+ // only emit when old_priority is not equal to the new priority
+ if (priority != old_priority)
+ emit downloadPriorityChanged(this,priority,old_priority);
+ }
+
+
+ bool TorrentFile::isMultimedia() const
+ {
+ if (filetype == UNKNOWN)
+ {
+ if (IsMultimediaFile(getPath()))
+ {
+ filetype = MULTIMEDIA;
+ return true;
+ }
+ else
+ {
+ filetype = NORMAL;
+ return false;
+ }
+ }
+ return filetype == MULTIMEDIA;
+ }
+
+ void TorrentFile::setPriority(Priority newpriority)
+ {
+ if(priority != newpriority)
+ {
+ if (priority == EXCLUDED)
+ {
+ setDoNotDownload(false);
+ }
+ if (newpriority == EXCLUDED)
+ {
+ setDoNotDownload(true);
+ }
+ else
+ {
+ old_priority = priority;
+ priority = newpriority;
+ emit downloadPriorityChanged(this,newpriority,old_priority);
+ }
+ }
+ }
+
+ TorrentFile & TorrentFile::operator = (const TorrentFile & tf)
+ {
+ index = tf.getIndex();
+ path = tf.getPath();
+ size = tf.getSize();
+ cache_offset = tf.getCacheOffset();
+ first_chunk = tf.getFirstChunk();
+ first_chunk_off = tf.getFirstChunkOffset();
+ last_chunk = tf.getLastChunk();
+ last_chunk_size = tf.getLastChunkSize();
+ priority = tf.getPriority();
+ missing = tf.isMissing();
+ return *this;
+ }
+
+ TorrentFile TorrentFile::null;
+
+
+ Uint64 TorrentFile::fileOffset(Uint32 cindex,Uint64 chunk_size) const
+ {
+ Uint64 off = 0;
+ if (getFirstChunkOffset() == 0)
+ {
+ off = (cindex - getFirstChunk()) * chunk_size;
+ }
+ else
+ {
+ if (cindex - this->getFirstChunk() > 0)
+ off = (cindex - this->getFirstChunk() - 1) * chunk_size;
+ if (cindex > 0)
+ off += (chunk_size - this->getFirstChunkOffset());
+ }
+ return off;
+ }
+
+ void TorrentFile::updateNumDownloadedChunks(const BitSet & bs)
+ {
+ float p = getDownloadPercentage();
+ num_chunks_downloaded = 0;
+ bool prev = preview;
+ preview = true;
+ for (Uint32 i = first_chunk;i <= last_chunk;i++)
+ {
+ if (bs.get(i))
+ {
+ num_chunks_downloaded++;
+ }
+ else if (i == first_chunk || i == first_chunk + 1)
+ {
+ preview = false;
+ }
+ }
+ preview = isMultimedia() && preview;
+
+ float np = getDownloadPercentage();
+ if (fabs(np - p) >= 0.01f)
+ downloadPercentageChanged(np);
+
+ if (prev != preview)
+ previewAvailable(preview);
+ }
+}
+#include "torrentfile.moc"
diff --git a/libktorrent/torrent/torrentfile.h b/libktorrent/torrent/torrentfile.h
new file mode 100644
index 0000000..9e0c397
--- /dev/null
+++ b/libktorrent/torrent/torrentfile.h
@@ -0,0 +1,158 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Ivan Vasic <ivasic@gmail.com> *
+ * *
+ * 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 BTTORRENTFILE_H
+#define BTTORRENTFILE_H
+
+#include <qstring.h>
+#include <util/constants.h>
+#include <interfaces/torrentfileinterface.h>
+
+namespace bt
+{
+ class BitSet;
+
+ /**
+ * @author Joris Guisson
+ *
+ * File in a multi file torrent. Keeps track of the path of the file,
+ * it's size, offset into the cache and between which chunks it lies.
+ */
+ class TorrentFile : public kt::TorrentFileInterface
+ {
+ Q_OBJECT
+
+ Uint32 index;
+ Uint64 cache_offset;
+ Uint64 first_chunk_off;
+ Uint64 last_chunk_size;
+ Priority priority;
+ Priority old_priority;
+ bool missing;
+ enum FileType
+ {
+ UNKNOWN,
+ MULTIMEDIA,
+ NORMAL
+ };
+ mutable FileType filetype;
+ public:
+ /**
+ * Default constructor. Creates a null TorrentFile.
+ */
+ TorrentFile();
+
+ /**
+ * Constructor.
+ * @param index Index number of the file
+ * @param path Path of the file
+ * @param off Offset into the torrent
+ * (i.e. how many bytes were all the previous files in the torrent combined)
+ * @param size Size of the file
+ * @param chunk_size Size of each chunk
+ */
+ TorrentFile(Uint32 index,const QString & path,Uint64 off,Uint64 size,Uint64 chunk_size);
+
+ /**
+ * Copy constructor.
+ * @param tf The TorrentFile to copy
+ */
+ TorrentFile(const TorrentFile & tf);
+ virtual ~TorrentFile();
+
+ /// Get the index of the file
+ Uint32 getIndex() const {return index;}
+
+ /// Get the offset into the torrent
+ Uint64 getCacheOffset() const {return cache_offset;}
+
+ /// Get the offset at which the file starts in the first chunk
+ Uint64 getFirstChunkOffset() const {return first_chunk_off;}
+
+ /// Get how many bytes the files takes up of the last chunk
+ Uint64 getLastChunkSize() const {return last_chunk_size;}
+
+ /// Check if this file doesn't have to be downloaded
+ bool doNotDownload() const
+ {if(priority == EXCLUDED) return true; else return false;}
+
+ /// Set wether we have to not download this file
+ void setDoNotDownload(bool dnd);
+
+ /// Checks if this file is multimedial
+ bool isMultimedia() const;
+
+ /// Gets the priority of the file
+ Priority getPriority() const {return priority;}
+
+ /// Sets the priority of the file
+ void setPriority(Priority newpriority = NORMAL_PRIORITY);
+
+ /// Get the previous priority value
+ Priority getOldPriority() const {return old_priority;}
+
+
+ /// emits signal.
+ void emitDownloadStatusChanged();
+
+ void setEmitDownloadStatusChanged(bool show) { m_emitDlStatusChanged = show; }
+
+ /**
+ * Assignment operator
+ * @param tf The file to copy
+ * @return *this
+ */
+ TorrentFile & operator = (const TorrentFile & tf);
+
+ /// See if the file is missing
+ bool isMissing() const {return missing;}
+
+ /// Set the file to be missing or not
+ void setMissing(bool m) {missing = m;}
+
+ /**
+ * Calculate the offset of a chunk in the file
+ * @param cindex Index of chunk
+ * @param chunk_size Size of each chunk
+ */
+ Uint64 fileOffset(Uint32 cindex,Uint64 chunk_size) const;
+
+ static TorrentFile null;
+
+ /**
+ * Update the number of downloaded chunks for this file.
+ * @param bs The current bitset of all chunks
+ */
+ void updateNumDownloadedChunks(const BitSet & bs);
+
+ signals:
+ /**
+ * Signal emitted when the Priority variable changes.
+ * @param tf The TorrentFile which emitted the signal
+ * @param newpriority THe new priority of the file
+ * @param oldpriority Previous priority
+ */
+ void downloadPriorityChanged(TorrentFile* tf,Priority newpriority,Priority oldpriority);
+
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/torrentmonitor.cpp b/libktorrent/torrent/torrentmonitor.cpp
new file mode 100644
index 0000000..ff33acb
--- /dev/null
+++ b/libktorrent/torrent/torrentmonitor.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "torrentmonitor.h"
+
+namespace bt
+{
+
+ TorrentMonitor::TorrentMonitor()
+ {}
+
+
+ TorrentMonitor::~TorrentMonitor()
+ {}
+
+
+}
diff --git a/libktorrent/torrent/torrentmonitor.h b/libktorrent/torrent/torrentmonitor.h
new file mode 100644
index 0000000..52e3835
--- /dev/null
+++ b/libktorrent/torrent/torrentmonitor.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTTORRENTMONITOR_H
+#define BTTORRENTMONITOR_H
+
+namespace bt
+{
+ class Peer;
+ class ChunkDownload;
+
+ /**
+ @author Joris Guisson
+ */
+ class TorrentMonitor
+ {
+ public:
+ TorrentMonitor();
+ virtual ~TorrentMonitor();
+
+ virtual void peerAdded(Peer* peer) = 0;
+ virtual void peerRemoved(Peer* peer) = 0;
+ virtual void downloadStarted(ChunkDownload* cd) = 0;
+ virtual void downloadRemoved(ChunkDownload* cd) = 0;
+ virtual void stopped() = 0;
+ virtual void destroyed() = 0;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/tracker.cpp b/libktorrent/torrent/tracker.cpp
new file mode 100644
index 0000000..261169c
--- /dev/null
+++ b/libktorrent/torrent/tracker.cpp
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <time.h>
+#include <kurl.h>
+#include <kresolver.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <interfaces/torrentinterface.h>
+#include <kademlia/dhtbase.h>
+#include <kademlia/dhttrackerbackend.h>
+#include "server.h"
+#include "tracker.h"
+#include "udptracker.h"
+#include "httptracker.h"
+
+using namespace KNetwork;
+
+namespace bt
+{
+ static QString custom_ip;
+ static QString custom_ip_resolved;
+
+ Tracker::Tracker(const KURL & url,kt::TorrentInterface* tor,const PeerID & id,int tier)
+ : url(url),tier(tier),peer_id(id),tor(tor)
+ {
+ // default 5 minute interval
+ interval = 5 * 60 * 1000;
+ seeders = leechers = 0;
+ srand(time(0));
+ key = rand();
+ started = false;
+ }
+
+ Tracker::~Tracker()
+ {
+ }
+
+ void Tracker::setCustomIP(const QString & ip)
+ {
+ if (custom_ip == ip)
+ return;
+
+ Out(SYS_TRK|LOG_NOTICE) << "Setting custom ip to " << ip << endl;
+ custom_ip = ip;
+ custom_ip_resolved = QString::null;
+ if (ip.isNull())
+ return;
+
+ KResolverResults res = KResolver::resolve(ip,QString::null);
+ if (res.error() || res.empty())
+ {
+ custom_ip = custom_ip_resolved = QString::null;
+ }
+ else
+ {
+ custom_ip_resolved = res.first().address().nodeName();
+ Out(SYS_TRK|LOG_NOTICE) << "custom_ip_resolved = " << custom_ip_resolved << endl;
+ }
+ }
+
+ QString Tracker::getCustomIP()
+ {
+ return custom_ip_resolved;
+ }
+
+ void Tracker::timedDelete(int ms)
+ {
+ QTimer::singleShot(ms,this,SLOT(deleteLater()));
+ connect(this,SIGNAL(stopDone()),this,SLOT(deleteLater()));
+ }
+
+}
+
+#include "tracker.moc"
diff --git a/libktorrent/torrent/tracker.h b/libktorrent/torrent/tracker.h
new file mode 100644
index 0000000..d254b63
--- /dev/null
+++ b/libktorrent/torrent/tracker.h
@@ -0,0 +1,136 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTTRACKER_H
+#define BTTRACKER_H
+
+#include <kurl.h>
+#include <util/sha1hash.h>
+#include <interfaces/peersource.h>
+#include "globals.h"
+#include "peerid.h"
+
+class KURL;
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+
+namespace bt
+{
+ class Tracker;
+
+ /**
+ * Base class for all tracker classes.
+ */
+ class Tracker : public kt::PeerSource
+ {
+ Q_OBJECT
+ public:
+ Tracker(const KURL & url,kt::TorrentInterface* tor,const PeerID & id,int tier);
+ virtual ~Tracker();
+
+ /// See if a start request succeeded
+ bool isStarted() const {return started;}
+
+ /**
+ * Set the custom IP
+ * @param str
+ */
+ static void setCustomIP(const QString & str);
+
+ /// get the tracker url
+ KURL trackerURL() const {return url;}
+
+ /**
+ * Delete the tracker in ms milliseconds, or when the stopDone signal is emitted.
+ * @param ms Number of ms to wait
+ */
+ void timedDelete(int ms);
+
+ /**
+ * Get the number of failed attempts to reach a tracker.
+ * @return The number of failed attempts
+ */
+ virtual Uint32 failureCount() const = 0;
+
+ /**
+ * Do a tracker scrape to get more accurate stats about a torrent.
+ * Does nothing if the tracker does not support this.
+ */
+ virtual void scrape() = 0;
+
+ /// Get the trackers tier
+ int getTier() const {return tier;}
+
+ /**
+ * Get the update interval in ms
+ * @return interval
+ */
+ Uint32 getInterval() const {return interval;}
+
+ /// Set the interval
+ void setInterval(Uint32 i) {interval = i;}
+
+ /// Get the number of seeders
+ Uint32 getNumSeeders() const {return seeders;}
+
+ /// Get the number of leechers
+ Uint32 getNumLeechers() const {return leechers;}
+
+ /// Get the custom ip to use, null if none is set
+ static QString getCustomIP();
+ signals:
+ /**
+ * Emitted when an error happens.
+ * @param failure_reason The reason why we couldn't reach the tracker
+ */
+ void requestFailed(const QString & failure_reason);
+
+ /**
+ * Emitted when a stop is done.
+ */
+ void stopDone();
+
+ /**
+ * Emitted when a request to the tracker succeeded
+ */
+ void requestOK();
+
+ /**
+ * A request to the tracker has been started.
+ */
+ void requestPending();
+
+ protected:
+ KURL url;
+ int tier;
+ PeerID peer_id;
+ kt::TorrentInterface* tor;
+ Uint32 interval,seeders,leechers,key;
+ bool started;
+ private:
+ //static QString custom_ip,custom_ip_resolved;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/udptracker.cpp b/libktorrent/torrent/udptracker.cpp
new file mode 100644
index 0000000..2dd4a01
--- /dev/null
+++ b/libktorrent/torrent/udptracker.cpp
@@ -0,0 +1,291 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <kresolver.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include <ksocketaddress.h>
+#include "peermanager.h"
+#include "udptracker.h"
+#include "torrentcontrol.h"
+#include "globals.h"
+#include "server.h"
+#include "udptrackersocket.h"
+
+
+using namespace kt;
+using namespace KNetwork;
+
+namespace bt
+{
+
+ UDPTrackerSocket* UDPTracker::socket = 0;
+ Uint32 UDPTracker::num_instances = 0;
+
+
+ UDPTracker::UDPTracker(const KURL & url,kt::TorrentInterface* tor,const PeerID & id,int tier)
+ : Tracker(url,tor,id,tier)
+ {
+ num_instances++;
+ if (!socket)
+ socket = new UDPTrackerSocket();
+
+ connection_id = 0;
+ transaction_id = 0;
+ interval = 0;
+
+ connect(&conn_timer,SIGNAL(timeout()),this,SLOT(onConnTimeout()));
+ connect(socket,SIGNAL(announceRecieved(Int32, const QByteArray &)),
+ this,SLOT(announceRecieved(Int32, const QByteArray& )));
+ connect(socket,SIGNAL(connectRecieved(Int32, Int64 )),
+ this,SLOT(connectRecieved(Int32, Int64 )));
+ connect(socket,SIGNAL(error(Int32, const QString& )),
+ this,SLOT(onError(Int32, const QString& )));
+
+ KResolver::resolveAsync(this,SLOT(onResolverResults(KResolverResults )),
+ url.host(),QString::number(url.port()));
+ }
+
+
+ UDPTracker::~UDPTracker()
+ {
+ num_instances--;
+ if (num_instances == 0)
+ {
+ delete socket;
+ socket = 0;
+ }
+ }
+
+ void UDPTracker::start()
+ {
+ event = STARTED;
+ conn_timer.stop();
+ doRequest();
+ }
+
+ void UDPTracker::stop(WaitJob* )
+ {
+ if (!started)
+ return;
+
+ event = STOPPED;
+ conn_timer.stop();
+ doRequest();
+ started = false;
+ }
+
+ void UDPTracker::completed()
+ {
+ event = COMPLETED;
+ conn_timer.stop();
+ doRequest();
+ }
+
+ void UDPTracker::manualUpdate()
+ {
+ conn_timer.stop();
+ if (!started)
+ event = STARTED;
+ doRequest();
+ }
+
+ void UDPTracker::connectRecieved(Int32 tid,Int64 cid)
+ {
+ if (tid != transaction_id)
+ return;
+
+ connection_id = cid;
+ n = 0;
+ sendAnnounce();
+ }
+
+ void UDPTracker::announceRecieved(Int32 tid,const QByteArray & data)
+ {
+ if (tid != transaction_id)
+ return;
+
+ const Uint8* buf = (const Uint8*)data.data();
+
+ /*
+ 0 32-bit integer action 1
+ 4 32-bit integer transaction_id
+ 8 32-bit integer interval
+ 12 32-bit integer leechers
+ 16 32-bit integer seeders
+ 20 + 6 * n 32-bit integer IP address
+ 24 + 6 * n 16-bit integer TCP port
+ 20 + 6 * N
+ */
+ interval = ReadInt32(buf,8);
+ leechers = ReadInt32(buf,12);
+ seeders = ReadInt32(buf,16);
+
+ Uint32 nip = leechers + seeders;
+ Uint32 j = 0;
+ for (Uint32 i = 20;i < data.size() && j < nip;i+=6,j++)
+ {
+ Uint32 ip = ReadUint32(buf,i);
+ addPeer(QString("%1.%2.%3.%4")
+ .arg((ip & (0xFF000000)) >> 24)
+ .arg((ip & (0x00FF0000)) >> 16)
+ .arg((ip & (0x0000FF00)) >> 8)
+ .arg(ip & 0x000000FF),
+ ReadUint16(buf,i+4));
+ }
+
+ peersReady(this);
+ connection_id = 0;
+ conn_timer.stop();
+ if (event != STOPPED)
+ {
+ if (event == STARTED)
+ started = true;
+ event = NONE;
+ requestOK();
+ }
+ else
+ {
+ stopDone();
+ requestOK();
+ }
+ }
+
+ void UDPTracker::onError(Int32 tid,const QString & error_string)
+ {
+ if (tid != transaction_id)
+ return;
+
+ Out(SYS_TRK|LOG_IMPORTANT) << "UDPTracker::error : " << error_string << endl;
+ requestFailed(error_string);
+ }
+
+
+ bool UDPTracker::doRequest()
+ {
+ Out(SYS_TRK|LOG_NOTICE) << "Doing tracker request to url : " << url << endl;
+ if (connection_id == 0)
+ {
+ n = 0;
+ sendConnect();
+ }
+ else
+ sendAnnounce();
+
+ requestPending();
+ return true;
+ }
+
+ void UDPTracker::scrape()
+ {
+ }
+
+ void UDPTracker::sendConnect()
+ {
+ transaction_id = socket->newTransactionID();
+ socket->sendConnect(transaction_id,address);
+ int tn = 1;
+ for (int i = 0;i < n;i++)
+ tn *= 2;
+ conn_timer.start(60000 * tn,true);
+ }
+
+ void UDPTracker::sendAnnounce()
+ {
+ // Out(SYS_TRK|LOG_NOTICE) << "UDPTracker::sendAnnounce()" << endl;
+ transaction_id = socket->newTransactionID();
+ /*
+ 0 64-bit integer connection_id
+ 8 32-bit integer action 1
+ 12 32-bit integer transaction_id
+ 16 20-byte string info_hash
+ 36 20-byte string peer_id
+ 56 64-bit integer downloaded
+ 64 64-bit integer left
+ 72 64-bit integer uploaded
+ 80 32-bit integer event
+ 84 32-bit integer IP address 0
+ 88 32-bit integer key
+ 92 32-bit integer num_want -1
+ 96 16-bit integer port
+ 98
+ */
+
+ Uint32 ev = event;
+ const TorrentStats & s = tor->getStats();
+ Uint16 port = Globals::instance().getServer().getPortInUse();
+ Uint8 buf[98];
+ WriteInt64(buf,0,connection_id);
+ WriteInt32(buf,8,ANNOUNCE);
+ WriteInt32(buf,12,transaction_id);
+ const SHA1Hash & info_hash = tor->getInfoHash();
+ memcpy(buf+16,info_hash.getData(),20);
+ memcpy(buf+36,peer_id.data(),20);
+ WriteInt64(buf,56,s.trk_bytes_downloaded);
+ if (ev == COMPLETED)
+ WriteInt64(buf,64,0);
+ else
+ WriteInt64(buf,64,s.bytes_left);
+ WriteInt64(buf,72,s.trk_bytes_uploaded);
+ WriteInt32(buf,80,ev);
+ QString cip = Tracker::getCustomIP();
+ if (cip.isNull())
+ {
+ WriteUint32(buf,84,0);
+ }
+ else
+ {
+ KNetwork::KIpAddress addr(cip);
+ WriteUint32(buf,84,addr.IPv4Addr(true));
+ }
+ WriteUint32(buf,88,key);
+ if (ev != STOPPED)
+ WriteInt32(buf,92,100);
+ else
+ WriteInt32(buf,92,0);
+ WriteUint16(buf,96,port);
+
+ socket->sendAnnounce(transaction_id,buf,address);
+ }
+
+ void UDPTracker::onConnTimeout()
+ {
+ if (connection_id)
+ {
+ connection_id = 0;
+ n++;
+ if (event != STOPPED)
+ sendConnect();
+ else
+ stopDone();
+ }
+ else
+ {
+ doRequest();
+ }
+ }
+
+ void UDPTracker::onResolverResults(KResolverResults res)
+ {
+ address = res.front().address();
+ }
+
+}
+#include "udptracker.moc"
diff --git a/libktorrent/torrent/udptracker.h b/libktorrent/torrent/udptracker.h
new file mode 100644
index 0000000..5107fb9
--- /dev/null
+++ b/libktorrent/torrent/udptracker.h
@@ -0,0 +1,105 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTUDPTRACKER_H
+#define BTUDPTRACKER_H
+
+#include <kurl.h>
+#include <qvaluelist.h>
+#include <qcstring.h>
+#include <qtimer.h>
+#include <ksocketaddress.h>
+#include "tracker.h"
+#include "globals.h"
+#include "peermanager.h"
+
+
+
+namespace KNetwork
+{
+ class KResolverResults;
+}
+
+
+namespace bt
+{
+ using KNetwork::KResolverResults;
+
+ enum Event
+ {
+ NONE = 0,
+ COMPLETED = 1,
+ STARTED = 2,
+ STOPPED = 3
+ };
+
+ class UDPTrackerSocket;
+
+ /**
+ * @author Joris Guisson
+ * @brief Communicates with an UDP tracker
+ *
+ * This class is able to communicate with an UDP tracker.
+ * This is an implementation of the protocol described in
+ * http://xbtt.sourceforge.net/udp_tracker_protocol.html
+ */
+ class UDPTracker : public Tracker
+ {
+ Q_OBJECT
+ public:
+ UDPTracker(const KURL & url,kt::TorrentInterface* tor,const PeerID & id,int tier);
+ virtual ~UDPTracker();
+
+ virtual void start();
+ virtual void stop(WaitJob* wjob = 0);
+ virtual void completed();
+ virtual void manualUpdate();
+ virtual Uint32 failureCount() const {return n;}
+ virtual void scrape();
+
+ private slots:
+ void onConnTimeout();
+ void connectRecieved(Int32 tid,Int64 connection_id);
+ void announceRecieved(Int32 tid,const QByteArray & buf);
+ void onError(Int32 tid,const QString & error_string);
+ void onResolverResults(KResolverResults res);
+
+ private:
+ void sendConnect();
+ void sendAnnounce();
+ bool doRequest();
+
+ private:
+ KNetwork::KSocketAddress address;
+
+ Int32 transaction_id;
+ Int64 connection_id;
+
+ Uint32 data_read;
+ int n;
+ QTimer conn_timer;
+ Event event;
+
+ static UDPTrackerSocket* socket;
+ static Uint32 num_instances;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/udptrackersocket.cpp b/libktorrent/torrent/udptrackersocket.cpp
new file mode 100644
index 0000000..43ef2b6
--- /dev/null
+++ b/libktorrent/torrent/udptrackersocket.cpp
@@ -0,0 +1,222 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <time.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <util/array.h>
+#include <ksocketaddress.h>
+#include <kdatagramsocket.h>
+#include <ksocketdevice.h>
+#include <net/portlist.h>
+#include <util/log.h>
+#include <util/functions.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include "globals.h"
+#include "udptrackersocket.h"
+
+using namespace KNetwork;
+
+namespace bt
+{
+ Uint16 UDPTrackerSocket::port = 4444;
+
+ UDPTrackerSocket::UDPTrackerSocket()
+ {
+ sock = new KNetwork::KDatagramSocket(this);
+ sock->setAddressReuseable(true);
+ connect(sock,SIGNAL(readyRead()),this,SLOT(dataReceived()));
+ int i = 0;
+ if (port == 0)
+ port = 4444;
+
+ bool bound = false;
+
+ while (!(bound = sock->bind(QString::null,QString::number(port + i))) && i < 10)
+ {
+ Out() << "Failed to bind socket to port " << (port+i) << endl;
+ i++;
+ }
+
+
+ if (!bound)
+ {
+ KMessageBox::error(0,
+ i18n("Cannot bind to udp port %1 or the 10 following ports.").arg(port));
+ }
+ else
+ {
+ port = port + i;
+ Globals::instance().getPortList().addNewPort(port,net::UDP,true);
+ }
+ }
+
+
+ UDPTrackerSocket::~UDPTrackerSocket()
+ {
+ Globals::instance().getPortList().removePort(port,net::UDP);
+ delete sock;
+ }
+
+ void UDPTrackerSocket::sendConnect(Int32 tid,const KNetwork::KSocketAddress & addr)
+ {
+ Int64 cid = 0x41727101980LL;
+ Uint8 buf[16];
+
+ WriteInt64(buf,0,cid);
+ WriteInt32(buf,8,CONNECT);
+ WriteInt32(buf,12,tid);
+
+ sock->send(KDatagramPacket((char*)buf,16,addr));
+ transactions.insert(tid,CONNECT);
+ }
+
+ void UDPTrackerSocket::sendAnnounce(Int32 tid,const Uint8* data,const KNetwork::KSocketAddress & addr)
+ {
+ transactions.insert(tid,ANNOUNCE);
+ sock->send(KDatagramPacket((char*)data,98,addr));
+ }
+
+ void UDPTrackerSocket::cancelTransaction(Int32 tid)
+ {
+ transactions.remove(tid);
+ }
+
+ void UDPTrackerSocket::handleConnect(const QByteArray & data)
+ {
+ const Uint8* buf = (const Uint8*)data.data();
+
+ // Read the transaction_id and check it
+ Int32 tid = ReadInt32(buf,4);
+ QMap<Int32,Action>::iterator i = transactions.find(tid);
+ // if we can't find the transaction, just return
+ if (i == transactions.end())
+ {
+ return;
+ }
+
+ // check wether the transaction is a CONNECT
+ if (i.data() != CONNECT)
+ {
+ transactions.erase(i);
+ error(tid,QString::null);
+ return;
+ }
+
+ // everything ok, emit signal
+ transactions.erase(i);
+ connectRecieved(tid,ReadInt64(buf,8));
+ }
+
+ void UDPTrackerSocket::handleAnnounce(const QByteArray & data)
+ {
+ const Uint8* buf = (const Uint8*)data.data();
+
+ // Read the transaction_id and check it
+ Int32 tid = ReadInt32(buf,4);
+ QMap<Int32,Action>::iterator i = transactions.find(tid);
+ // if we can't find the transaction, just return
+ if (i == transactions.end())
+ return;
+
+ // check wether the transaction is a ANNOUNCE
+ if (i.data() != ANNOUNCE)
+ {
+ transactions.erase(i);
+ error(tid,QString::null);
+ return;
+ }
+
+ // everything ok, emit signal
+ transactions.erase(i);
+ announceRecieved(tid,data);
+ }
+
+ void UDPTrackerSocket::handleError(const QByteArray & data)
+ {
+ const Uint8* buf = (const Uint8*)data.data();
+ // Read the transaction_id and check it
+ Int32 tid = ReadInt32(buf,4);
+ QMap<Int32,Action>::iterator it = transactions.find(tid);
+ // if we can't find the transaction, just return
+ if (it == transactions.end())
+ return;
+
+ // extract error message
+ transactions.erase(it);
+ QString msg;
+ for (Uint32 i = 8;i < data.size();i++)
+ msg += (char)buf[i];
+
+ // emit signal
+ error(tid,msg);
+ }
+
+ void UDPTrackerSocket::dataReceived()
+ {
+ if (sock->bytesAvailable() == 0)
+ {
+ Out(SYS_TRK|LOG_NOTICE) << "0 byte UDP packet " << endl;
+ // KDatagramSocket wrongly handles UDP packets with no payload
+ // so we need to deal with it oursleves
+ int fd = sock->socketDevice()->socket();
+ char tmp;
+ read(fd,&tmp,1);
+ return;
+ }
+
+ KDatagramPacket pck = sock->receive();
+ const QByteArray & data = pck.data();
+ const Uint8* buf = (const Uint8*)data.data();
+ Uint32 type = ReadUint32(buf,0);
+ switch (type)
+ {
+ case CONNECT:
+ handleConnect(data);
+ break;
+ case ANNOUNCE:
+ handleAnnounce(data);
+ break;
+ case ERROR:
+ handleError(data);
+ break;
+ }
+ }
+
+ Int32 UDPTrackerSocket::newTransactionID()
+ {
+ Int32 transaction_id = rand() * time(0);
+ while (transactions.contains(transaction_id))
+ transaction_id++;
+ return transaction_id;
+ }
+
+ void UDPTrackerSocket::setPort(Uint16 p)
+ {
+ port = p;
+ }
+
+ Uint16 UDPTrackerSocket::getPort()
+ {
+ return port;
+ }
+}
+
+#include "udptrackersocket.moc"
diff --git a/libktorrent/torrent/udptrackersocket.h b/libktorrent/torrent/udptrackersocket.h
new file mode 100644
index 0000000..1537598
--- /dev/null
+++ b/libktorrent/torrent/udptrackersocket.h
@@ -0,0 +1,139 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTUDPTRACKERSOCKET_H
+#define BTUDPTRACKERSOCKET_H
+
+#include <qobject.h>
+#include <qmap.h>
+#include <qcstring.h>
+#include <util/constants.h>
+
+
+namespace KNetwork
+{
+ class KDatagramSocket;
+ class KSocketAddress;
+}
+
+namespace bt
+{
+
+
+ enum Action
+ {
+ CONNECT = 0,
+ ANNOUNCE = 1,
+ SCRAPE = 2,
+ ERROR = 3
+ };
+
+
+
+ /**
+ * @author Joris Guisson
+ *
+ * Class which handles communication with one or more UDP trackers.
+ */
+ class UDPTrackerSocket : public QObject
+ {
+ Q_OBJECT
+ public:
+ UDPTrackerSocket();
+ virtual ~UDPTrackerSocket();
+
+ /**
+ * Send a connect message. As a response to this, the connectRecieved
+ * signal will be emitted, classes recieving this signal should check if
+ * the transaction_id is the same.
+ * @param tid The transaction_id
+ * @param addr The address to send to
+ */
+ void sendConnect(Int32 tid,const KNetwork::KSocketAddress & addr);
+
+ /**
+ * Send an announce message. As a response to this, the announceRecieved
+ * signal will be emitted, classes recieving this signal should check if
+ * the transaction_id is the same.
+ * @param tid The transaction_id
+ * @param data The data to send (connect input structure, in UDP Tracker specifaction)
+ * @param addr The address to send to
+ */
+ void sendAnnounce(Int32 tid,const Uint8* data,const KNetwork::KSocketAddress & addr);
+
+ /**
+ * If a transaction times out, this should be used to cancel it.
+ * @param tid
+ */
+ void cancelTransaction(Int32 tid);
+
+
+ /**
+ * Compute a free transaction_id.
+ * @return A free transaction_id
+ */
+ Int32 newTransactionID();
+
+ /**
+ * Set the port ot use.
+ * @param p The port
+ */
+ static void setPort(Uint16 p);
+
+ /// Get the port in use.
+ static Uint16 getPort();
+ private slots:
+ void dataReceived();
+
+ signals:
+ /**
+ * Emitted when a connect message is received.
+ * @param tid The transaction_id
+ * @param connection_id The connection_id returned
+ */
+ void connectRecieved(Int32 tid,Int64 connection_id);
+
+ /**
+ * Emitted when an announce message is received.
+ * @param tid The transaction_id
+ * @param buf The data
+ */
+ void announceRecieved(Int32 tid,const QByteArray & buf);
+
+ /**
+ * Signal emitted, when an error occurs during a transaction.
+ * @param tid The transaction_id
+ * @param error_string Potential error string
+ */
+ void error(Int32 tid,const QString & error_string);
+
+ private:
+ void handleConnect(const QByteArray & buf);
+ void handleAnnounce(const QByteArray & buf);
+ void handleError(const QByteArray & buf);
+
+ private:
+ Uint16 udp_port;
+ KNetwork::KDatagramSocket* sock;
+ QMap<Int32,Action> transactions;
+ static Uint16 port;
+ };
+}
+
+#endif
diff --git a/libktorrent/torrent/uploadcap.cpp b/libktorrent/torrent/uploadcap.cpp
new file mode 100644
index 0000000..701d854
--- /dev/null
+++ b/libktorrent/torrent/uploadcap.cpp
@@ -0,0 +1,46 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#if 0
+#include <math.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "uploadcap.h"
+#include "peer.h"
+#include "packetwriter.h"
+
+namespace bt
+{
+
+ UploadCap UploadCap::self;
+
+ UploadCap::UploadCap() : Cap(false)
+ {
+ }
+
+ UploadCap::~UploadCap()
+ {
+ }
+
+
+
+
+}
+#endif
+
diff --git a/libktorrent/torrent/uploadcap.h b/libktorrent/torrent/uploadcap.h
new file mode 100644
index 0000000..f766f59
--- /dev/null
+++ b/libktorrent/torrent/uploadcap.h
@@ -0,0 +1,56 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTUPLOADCAP_H
+#define BTUPLOADCAP_H
+
+// DEPRECATED
+#if 0
+#include "cap.h"
+
+namespace bt
+{
+ class PacketWriter;
+
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Keeps the upload rate under control
+ *
+ * Before a PeerUploader can send a piece, it must first ask
+ * permission to a UploadCap object. This object will make sure
+ * that the upload rate remains under a specified threshold. When the
+ * threshold is set to 0, no upload capping will be done.
+ */
+ class UploadCap : public Cap
+ {
+ static UploadCap self;
+
+ UploadCap();
+ public:
+ virtual ~UploadCap();
+
+
+ static UploadCap & instance() {return self;}
+ };
+
+}
+#endif
+#endif
diff --git a/libktorrent/torrent/uploader.cpp b/libktorrent/torrent/uploader.cpp
new file mode 100644
index 0000000..0cf3677
--- /dev/null
+++ b/libktorrent/torrent/uploader.cpp
@@ -0,0 +1,67 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include "uploader.h"
+#include "peer.h"
+#include "chunkmanager.h"
+#include "request.h"
+#include "uploader.h"
+#include "peeruploader.h"
+#include "peermanager.h"
+
+
+namespace bt
+{
+
+ Uploader::Uploader(ChunkManager & cman,PeerManager & pman)
+ : cman(cman),pman(pman),uploaded(0)
+ {}
+
+
+ Uploader::~Uploader()
+ {
+ }
+
+
+
+ void Uploader::update(Uint32 opt_unchoked)
+ {
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();++i)
+ {
+ PeerUploader* p = pman.getPeer(i)->getPeerUploader();
+ uploaded += p->update(cman,opt_unchoked);
+ }
+ }
+
+
+ Uint32 Uploader::uploadRate() const
+ {
+ Uint32 rate = 0;
+ for (Uint32 i = 0;i < pman.getNumConnectedPeers();++i)
+ {
+ const Peer* p = pman.getPeer(i);
+ rate += p->getUploadRate();
+ }
+ return rate;
+ }
+
+
+}
+#include "uploader.moc"
diff --git a/libktorrent/torrent/uploader.h b/libktorrent/torrent/uploader.h
new file mode 100644
index 0000000..4370d69
--- /dev/null
+++ b/libktorrent/torrent/uploader.h
@@ -0,0 +1,75 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTUPLOADER_H
+#define BTUPLOADER_H
+
+#include <qobject.h>
+#include "globals.h"
+
+namespace bt
+{
+ class Peer;
+ class PeerID;
+ class ChunkManager;
+ class Request;
+ class PeerManager;
+
+
+ /**
+ * @author Joris Guisson
+ *
+ * Class which manages the uploading of data. It has a PeerUploader for
+ * each Peer.
+ */
+ class Uploader : public QObject
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, sets the ChunkManager.
+ * @param cman The ChunkManager
+ */
+ Uploader(ChunkManager & cman,PeerManager & pman);
+ virtual ~Uploader();
+
+ /// Get the number of bytes uploaded.
+ Uint64 bytesUploaded() const {return uploaded;}
+
+ /// Get the upload rate of all Peers combined.
+ Uint32 uploadRate() const;
+
+ /// Set the number of bytes which have been uploaded.
+ void setBytesUploaded(Uint64 b) {uploaded = b;}
+ public slots:
+ /**
+ * Update every PeerUploader.
+ * @param opt_unchoked ID of optimisticly unchoked peer
+ */
+ void update(Uint32 opt_unchoked);
+
+ private:
+ ChunkManager & cman;
+ PeerManager & pman;
+ Uint64 uploaded;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/upspeedestimater.cpp b/libktorrent/torrent/upspeedestimater.cpp
new file mode 100644
index 0000000..0d6c544
--- /dev/null
+++ b/libktorrent/torrent/upspeedestimater.cpp
@@ -0,0 +1,148 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "upspeedestimater.h"
+
+namespace bt
+{
+
+ UpSpeedEstimater::UpSpeedEstimater()
+ {
+ accumulated_bytes = 0;
+ upload_rate = 0.0;
+ proto_upload_rate = 0.0;
+ }
+
+
+ UpSpeedEstimater::~UpSpeedEstimater()
+ {}
+
+
+ void UpSpeedEstimater::writeBytes(Uint32 bytes,bool proto)
+ {
+ // add entry to outstanding_bytes
+ Entry e;
+ e.bytes = bytes;
+ e.data = !proto;
+ e.start_time = GetCurrentTime();
+ outstanding_bytes.append(e);
+ }
+
+ void UpSpeedEstimater::bytesWritten(Uint32 bytes)
+ {
+ QValueList<Entry>::iterator i = outstanding_bytes.begin();
+ TimeStamp now = GetCurrentTime();
+ while (bytes > 0 && i != outstanding_bytes.end())
+ {
+ Entry e = *i;
+ if (e.bytes <= bytes + accumulated_bytes)
+ {
+ // first remove outstanding bytes
+ i = outstanding_bytes.erase(i);
+ bytes -= e.bytes;
+ accumulated_bytes = 0;
+ if (e.data)
+ {
+ // if it's data move it to the written_bytes list
+ // but first store time it takes to send in e.t
+ e.duration = now - e.start_time;
+ written_bytes.append(e);
+ }
+ else
+ {
+ e.duration = now - e.start_time;
+#ifdef MEASURE_PROTO_OVERHEAD
+ proto_bytes.append(e);
+#endif
+ }
+ }
+ else
+ {
+ accumulated_bytes += bytes;
+ bytes = 0;
+ }
+ }
+ }
+
+ double UpSpeedEstimater::rate(QValueList<Entry> & el)
+ {
+ TimeStamp now = GetCurrentTime();
+ const Uint32 INTERVAL = 3000;
+
+ Uint32 tot_bytes = 0;
+ Uint32 oldest_time = now;
+
+ QValueList<Entry>::iterator i = el.begin();
+ while (i != el.end())
+ {
+ Entry & e = *i;
+ Uint32 end_time = e.start_time + e.duration;
+
+ if (now - end_time > INTERVAL)
+ {
+ // get rid of old entries
+ i = el.erase(i);
+ }
+ else if (now - e.start_time <= INTERVAL)
+ {
+ // entry was fully sent in the last 3 seconds
+ // so fully add it
+ tot_bytes += e.bytes;
+ if (e.start_time < oldest_time)
+ oldest_time = e.start_time;
+ i++;
+ }
+ else
+ {
+ // entry was partially sent in the last 3 seconds
+ // so we need to take into account a part of the bytes;
+ Uint32 part_dur = end_time - (now - INTERVAL);
+ double dur_perc = (double)part_dur / e.duration;
+ tot_bytes += (Uint32)ceil(dur_perc * e.bytes);
+ oldest_time = (now - INTERVAL);
+ i++;
+ }
+ }
+
+ return (double)tot_bytes / (INTERVAL * 0.001);
+ }
+
+ void UpSpeedEstimater::update()
+ {
+ if (!written_bytes.empty())
+ {
+ upload_rate = 0;
+ upload_rate = rate(written_bytes);
+ }
+
+
+#ifdef MEASURE_PROTO_OVERHEAD
+ if (!proto_bytes.empty())
+ {
+ proto_upload_rate = 0;
+ proto_upload_rate = rate(proto_bytes);
+ }
+#endif
+ }
+
+}
diff --git a/libktorrent/torrent/upspeedestimater.h b/libktorrent/torrent/upspeedestimater.h
new file mode 100644
index 0000000..6503499
--- /dev/null
+++ b/libktorrent/torrent/upspeedestimater.h
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTUPSPEEDESTIMATER_H
+#define BTUPSPEEDESTIMATER_H
+
+#include <qvaluelist.h>
+#include <util/constants.h>
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ *
+ * Measures upload speed.
+ */
+ class UpSpeedEstimater
+ {
+ struct Entry
+ {
+ Uint32 bytes;
+ TimeStamp start_time;
+ Uint32 duration;
+ bool data;
+ };
+ public:
+ UpSpeedEstimater();
+ virtual ~UpSpeedEstimater();
+
+ /**
+ * Start sending bytes.
+ * @param bytes The number of bytes
+ * @param rec Wether to record or not (i.e. is this data)
+ */
+ void writeBytes(Uint32 bytes,bool rec);
+
+ /**
+ * The socket has finished sending bytes.
+ * @param bytes The number of bytes.
+ */
+ void bytesWritten(Uint32 bytes);
+
+ /**
+ * Update the upload speed estimater.
+ */
+ void update();
+
+ /// Get the upload rate
+ double uploadRate() const {return upload_rate;}
+
+ /// Get the protocol overhead
+ double protocollOverhead() const {return proto_upload_rate;}
+ private:
+ double rate(QValueList<Entry> & el);
+
+ private:
+ double upload_rate;
+ double proto_upload_rate;
+ Uint32 accumulated_bytes;
+ QValueList<Entry> outstanding_bytes;
+ QValueList<Entry> written_bytes;
+#ifdef MEASURE_PROTO_OVERHEAD
+ QValueList<Entry> proto_bytes;
+#endif
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/utpex.cpp b/libktorrent/torrent/utpex.cpp
new file mode 100644
index 0000000..4933218
--- /dev/null
+++ b/libktorrent/torrent/utpex.cpp
@@ -0,0 +1,155 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <net/address.h>
+#include <util/functions.h>
+#include <util/log.h>
+#include "utpex.h"
+#include "peer.h"
+#include "packetwriter.h"
+#include "bdecoder.h"
+#include "bencoder.h"
+#include "bnode.h"
+#include "peermanager.h"
+
+
+namespace bt
+{
+
+ UTPex::UTPex(Peer* peer,Uint32 id) : peer(peer),id(id),last_updated(0)
+ {}
+
+
+ UTPex::~UTPex()
+ {}
+
+
+
+ void UTPex::handlePexPacket(const Uint8* packet,Uint32 size)
+ {
+ if (size <= 2 || packet[1] != 1)
+ return;
+
+ QByteArray tmp;
+ tmp.setRawData((const char*)packet,size);
+ BNode* node = 0;
+ try
+ {
+ BDecoder dec(tmp,false,2);
+ node = dec.decode();
+ if (node && node->getType() == BNode::DICT)
+ {
+ BDictNode* dict = (BDictNode*)node;
+
+ // ut_pex packet, emit signal to notify PeerManager
+ BValueNode* val = dict->getValue("added");
+ if (val)
+ {
+ QByteArray data = val->data().toByteArray();
+ peer->emitPex(data);
+ }
+ }
+ }
+ catch (...)
+ {
+ // just ignore invalid packets
+ Out(SYS_CON|LOG_DEBUG) << "Invalid extended packet" << endl;
+ }
+ delete node;
+ tmp.resetRawData((const char*)packet,size);
+ }
+
+ bool UTPex::needsUpdate() const
+ {
+ return bt::GetCurrentTime() - last_updated >= 60*1000;
+ }
+
+ void UTPex::update(PeerManager* pman)
+ {
+ last_updated = bt::GetCurrentTime();
+
+ std::map<Uint32,net::Address> added;
+ std::map<Uint32,net::Address> npeers;
+
+ PeerManager::CItr itr = pman->beginPeerList();
+ while (itr != pman->endPeerList())
+ {
+ const Peer* p = *itr;
+ if (p != peer)
+ {
+ npeers.insert(std::make_pair(p->getID(),p->getAddress()));
+ if (peers.count(p->getID()) == 0)
+ {
+ // new one, add to added
+ added.insert(std::make_pair(p->getID(),p->getAddress()));
+ }
+ else
+ {
+ // erase from old list, so only the dropped ones are left
+ peers.erase(p->getID());
+ }
+ }
+ itr++;
+ }
+
+ if (!(peers.size() == 0 && added.size() == 0))
+ {
+ // encode the whole lot
+ QByteArray data;
+ BEncoder enc(new BEncoderBufferOutput(data));
+ enc.beginDict();
+ enc.write("added");
+ encode(enc,added);
+ enc.write("added.f"); // no idea what this added.f thing means
+ enc.write("");
+ enc.write("dropped");
+ encode(enc,peers);
+ enc.end();
+
+ peer->getPacketWriter().sendExtProtMsg(id,data);
+ }
+
+ peers = npeers;
+ }
+
+ void UTPex::encode(BEncoder & enc,const std::map<Uint32,net::Address> & ps)
+ {
+ if (ps.size() == 0)
+ {
+ enc.write("");
+ return;
+ }
+
+ Uint8* buf = new Uint8[ps.size() * 6];
+ Uint32 size = 0;
+
+ std::map<Uint32,net::Address>::const_iterator i = ps.begin();
+ while (i != ps.end())
+ {
+ const net::Address & addr = i->second;
+ WriteUint32(buf,size,addr.ip());
+ WriteUint16(buf,size + 4,addr.port());
+ size += 6;
+ i++;
+ }
+
+ enc.write(buf,size);
+ delete [] buf;
+ }
+}
diff --git a/libktorrent/torrent/utpex.h b/libktorrent/torrent/utpex.h
new file mode 100644
index 0000000..cab2f39
--- /dev/null
+++ b/libktorrent/torrent/utpex.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTUTPEX_H
+#define BTUTPEX_H
+
+#include <map>
+#include <net/address.h>
+#include <util/constants.h>
+
+namespace bt
+{
+ class Peer;
+ class PeerManager;
+ class BEncoder;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Class which handles µTorrent's peer exchange
+ */
+ class UTPex
+ {
+ public:
+ UTPex(Peer* peer,Uint32 id);
+ virtual ~UTPex();
+
+ /**
+ * Handle a PEX packet
+ * @param packet The packet
+ * @param size The size of the packet
+ */
+ void handlePexPacket(const Uint8* packet,Uint32 size);
+
+ /// Do we need to update PEX (should happen every minute)
+ bool needsUpdate() const;
+
+ /// Send a new PEX packet to the Peer
+ void update(PeerManager* pman);
+
+ /// Change the ID used in the extended packets
+ void changeID(Uint32 nid) {id = nid;}
+ private:
+ void encode(BEncoder & enc,const std::map<Uint32,net::Address> & ps);
+
+ private:
+ Peer* peer;
+ Uint32 id;
+ std::map<Uint32,net::Address> peers;
+ TimeStamp last_updated;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/torrent/value.cpp b/libktorrent/torrent/value.cpp
new file mode 100644
index 0000000..df063ab
--- /dev/null
+++ b/libktorrent/torrent/value.cpp
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qtextcodec.h>
+#include "value.h"
+
+namespace bt
+{
+
+ Value::Value() : type(INT),ival(0),big_ival(0)
+ {}
+
+ Value::Value(int val) : type(INT),ival(val),big_ival(val)
+ {}
+
+ Value::Value(Int64 val) : type(INT64),big_ival(val)
+ {}
+
+ Value::Value(const QByteArray & val) : type(STRING),ival(0),strval(val),big_ival(0)
+ {}
+
+ Value::Value(const Value & val)
+ : type(val.type),ival(val.ival),strval(val.strval),big_ival(val.big_ival)
+ {}
+
+ Value::~Value()
+ {}
+
+
+ QString Value::toString(const QString & encoding) const
+ {
+ if (encoding.isNull() || encoding.isEmpty())
+ return toString();
+
+ QTextCodec* tc = QTextCodec::codecForName(encoding.ascii());
+ if (!tc)
+ return toString();
+
+ return tc->toUnicode(strval);
+ }
+
+
+ Value & Value::operator = (const Value & val)
+ {
+ type = val.type;
+ ival = val.ival;
+ strval = val.strval;
+ big_ival = val.big_ival;
+ return *this;
+ }
+
+ Value & Value::operator = (Int32 val)
+ {
+ type = INT;
+ ival = val;
+ big_ival = val;
+ return *this;
+ }
+
+ Value & Value::operator = (Int64 val)
+ {
+ type = INT64;
+ big_ival = val;
+ return *this;
+ }
+
+ Value & Value::operator = (const QByteArray & val)
+ {
+ type = STRING;
+ strval = val;
+ big_ival = 0;
+ return *this;
+ }
+
+}
diff --git a/libktorrent/torrent/value.h b/libktorrent/torrent/value.h
new file mode 100644
index 0000000..cd7c879
--- /dev/null
+++ b/libktorrent/torrent/value.h
@@ -0,0 +1,67 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTVALUE_H
+#define BTVALUE_H
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class Value
+ {
+ public:
+ enum Type
+ {
+ STRING,INT,INT64
+ };
+
+
+ Value();
+ Value(int val);
+ Value(Int64 val);
+ Value(const QByteArray & val);
+ Value(const Value & val);
+ ~Value();
+
+ Value & operator = (const Value & val);
+ Value & operator = (Int32 val);
+ Value & operator = (Int64 val);
+ Value & operator = (const QByteArray & val);
+
+ Type getType() const {return type;}
+ Int32 toInt() const {return ival;}
+ Int64 toInt64() const {return big_ival;}
+ QString toString() const {return QString(strval);}
+ QString toString(const QString & encoding) const;
+ QByteArray toByteArray() const {return strval;}
+ private:
+ Type type;
+ Int32 ival;
+ QByteArray strval;
+ Int64 big_ival;
+ };
+}
+
+#endif
diff --git a/libktorrent/util/Makefile.am b/libktorrent/util/Makefile.am
new file mode 100644
index 0000000..c7f46ae
--- /dev/null
+++ b/libktorrent/util/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_LTLIBRARIES = libutil.la
+libutil_la_LDFLAGS = $(all_libraries)
+
+
+libutil_la_SOURCES = array.cpp autorotatelogjob.cpp bitset.cpp error.cpp \
+ file.cpp fileops.cpp functions.cpp httprequest.cpp log.cpp mmapfile.cpp \
+ profiler.cpp ptrmap.cpp sha1hash.cpp sha1hashgen.cpp timer.cpp urlencoder.cpp \
+ waitjob.cpp
+
+
+
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
+noinst_HEADERS = autorotatelogjob.h profiler.h
diff --git a/libktorrent/util/array.cpp b/libktorrent/util/array.cpp
new file mode 100644
index 0000000..e57091d
--- /dev/null
+++ b/libktorrent/util/array.cpp
@@ -0,0 +1,27 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "array.h"
+
+namespace bt
+{
+
+
+
+}
diff --git a/libktorrent/util/array.h b/libktorrent/util/array.h
new file mode 100644
index 0000000..1694e2a
--- /dev/null
+++ b/libktorrent/util/array.h
@@ -0,0 +1,73 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTARRAY_H
+#define BTARRAY_H
+
+#include "constants.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ *
+ * Template array classes, makes creating dynamic buffers easier
+ * and safer.
+ */
+ template<class T>
+ class Array
+ {
+ Uint32 num;
+ T* data;
+ public:
+ Array(Uint32 num = 0) : num(num),data(0)
+ {
+ if (num > 0)
+ data = new T[num];
+ }
+
+ ~Array()
+ {
+ delete [] data;
+ }
+
+ T & operator [] (Uint32 i) {return data[i];}
+ const T & operator [] (Uint32 i) const {return data[i];}
+
+ operator const T* () const {return data;}
+ operator T* () {return data;}
+
+ /// Get the number of elements in the array
+ Uint32 size() const {return num;}
+
+ /**
+ * Fill the array with a value
+ * @param val The value
+ */
+ void fill(T val)
+ {
+ for (Uint32 i = 0;i < num;i++)
+ data[i] = val;
+ }
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/autorotatelogjob.cpp b/libktorrent/util/autorotatelogjob.cpp
new file mode 100644
index 0000000..c43e304
--- /dev/null
+++ b/libktorrent/util/autorotatelogjob.cpp
@@ -0,0 +1,88 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include <kprocess.h>
+#include <util/fileops.h>
+#include "autorotatelogjob.h"
+#include "log.h"
+
+namespace bt
+{
+
+ AutoRotateLogJob::AutoRotateLogJob(const QString & file,Log* lg)
+ : KIO::Job(false),file(file),cnt(10),lg(lg)
+ {
+ update();
+ }
+
+
+ AutoRotateLogJob::~AutoRotateLogJob()
+ {}
+
+ void AutoRotateLogJob::kill(bool)
+ {
+ m_error = 0;
+ emitResult();
+ }
+
+ void AutoRotateLogJob::update()
+ {
+ while (cnt > 1)
+ {
+ QString prev = QString("%1-%2.gz").arg(file).arg(cnt - 1);
+ QString curr = QString("%1-%2.gz").arg(file).arg(cnt);
+ if (bt::Exists(prev)) // if file exists start the move job
+ {
+ KIO::Job* sj = KIO::file_move(KURL::fromPathOrURL(prev),KURL::fromPathOrURL(curr),-1,true,false,false);
+ connect(sj,SIGNAL(result(KIO::Job*)),this,SLOT(moveJobDone(KIO::Job* )));
+ return;
+ }
+ else
+ {
+ cnt--;
+ }
+ }
+
+ if (cnt == 1)
+ {
+ // move current log to 1 and zip it
+ bt::Move(file,file + "-1",true);
+ KIO::Job* sj = KIO::file_move(KURL::fromPathOrURL(file),KURL::fromPathOrURL(file + "-1"),-1,true,false,false);
+ connect(sj,SIGNAL(result(KIO::Job*)),this,SLOT(moveJobDone(KIO::Job* )));
+ }
+ else
+ {
+ // final log file is moved, now zip it and end the job
+ std::system(QString("gzip " + KProcess::quote(file + "-1")).local8Bit());
+ m_error = 0;
+ lg->logRotateDone();
+ emitResult();
+ }
+ }
+
+
+ void AutoRotateLogJob::moveJobDone(KIO::Job*)
+ {
+ cnt--; // decrease counter so the newt file will be moved in update
+ update(); // don't care about result of job
+ }
+
+}
+#include "autorotatelogjob.moc"
diff --git a/libktorrent/util/autorotatelogjob.h b/libktorrent/util/autorotatelogjob.h
new file mode 100644
index 0000000..11cf06a
--- /dev/null
+++ b/libktorrent/util/autorotatelogjob.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTAUTOROTATELOGJOB_H
+#define BTAUTOROTATELOGJOB_H
+
+#include <kio/job.h>
+#include <cstdlib>
+
+namespace bt
+{
+ class Log;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Job which handles the rotation of the log file.
+ This Job must do several move jobs which must be done sequentially.
+ */
+ class AutoRotateLogJob : public KIO::Job
+ {
+ Q_OBJECT
+ public:
+ AutoRotateLogJob(const QString & file,Log* lg);
+ virtual ~AutoRotateLogJob();
+
+ virtual void kill(bool quietly=true);
+
+ private slots:
+ void moveJobDone(KIO::Job*);
+
+ private:
+ void update();
+
+ private:
+ QString file;
+ int cnt;
+ Log* lg;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/bitset.cpp b/libktorrent/util/bitset.cpp
new file mode 100644
index 0000000..6139e01
--- /dev/null
+++ b/libktorrent/util/bitset.cpp
@@ -0,0 +1,111 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <algorithm>
+#include "bitset.h"
+#include <string.h>
+
+namespace bt
+{
+ BitSet BitSet::null;
+
+ BitSet::BitSet(Uint32 num_bits) : num_bits(num_bits),data(0)
+ {
+ num_bytes = (num_bits / 8) + ((num_bits % 8 > 0) ? 1 : 0);
+ data = new Uint8[num_bytes];
+ std::fill(data,data+num_bytes,0x00);
+ num_on = 0;
+ }
+
+ BitSet::BitSet(const Uint8* d,Uint32 num_bits) : num_bits(num_bits),data(0)
+ {
+ num_bytes = (num_bits / 8) + ((num_bits % 8 > 0) ? 1 : 0);
+ data = new Uint8[num_bytes];
+ memcpy(data,d,num_bytes);
+ num_on = 0;
+ Uint32 i = 0;
+ while (i < num_bits)
+ {
+ if (get(i))
+ num_on++;
+ i++;
+ }
+ }
+
+ BitSet::BitSet(const BitSet & bs) : num_bits(bs.num_bits),num_bytes(bs.num_bytes),data(0),num_on(bs.num_on)
+ {
+ data = new Uint8[num_bytes];
+ std::copy(bs.data,bs.data+num_bytes,data);
+ }
+
+ BitSet::~BitSet()
+ {
+ delete [] data;
+ }
+
+
+
+ BitSet & BitSet::operator = (const BitSet & bs)
+ {
+ if (data)
+ delete [] data;
+ num_bytes = bs.num_bytes;
+ num_bits = bs.num_bits;
+ data = new Uint8[num_bytes];
+ std::copy(bs.data,bs.data+num_bytes,data);
+ num_on = bs.num_on;
+ return *this;
+ }
+
+ void BitSet::setAll(bool on)
+ {
+ std::fill(data,data+num_bytes,on ? 0xFF : 0x00);
+ num_on = on ? num_bits : 0;
+ }
+
+ void BitSet::clear()
+ {
+ setAll(false);
+ }
+
+ void BitSet::orBitSet(const BitSet & other)
+ {
+ Uint32 i = 0;
+ while (i < num_bits)
+ {
+ bool val = get(i) || other.get(i);
+ set(i,val);
+ i++;
+ }
+ }
+
+ bool BitSet::allOn() const
+ {
+ return num_on == num_bits;
+ }
+
+ bool BitSet::operator == (const BitSet & bs)
+ {
+ if (this->getNumBits() != bs.getNumBits())
+ return false;
+
+ return memcmp(data,bs.data,num_bytes) == 0;
+ }
+}
+
diff --git a/libktorrent/util/bitset.h b/libktorrent/util/bitset.h
new file mode 100644
index 0000000..32e7e48
--- /dev/null
+++ b/libktorrent/util/bitset.h
@@ -0,0 +1,157 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTBITSET_H
+#define BTBITSET_H
+
+#include "constants.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Simple implementation of a BitSet
+ *
+ * Simple implementation of a BitSet, can only turn on and off bits.
+ * BitSet's are used to indicate which chunks we have or not.
+ */
+ class BitSet
+ {
+ Uint32 num_bits,num_bytes;
+ Uint8* data;
+ Uint32 num_on;
+ public:
+ /**
+ * Constructor.
+ * @param num_bits The number of bits
+ */
+ BitSet(Uint32 num_bits = 8);
+
+ /**
+ * Manually set data.
+ * @param data The data
+ * @param num_bits The number of bits
+ */
+ BitSet(const Uint8* data,Uint32 num_bits);
+
+ /**
+ * Copy constructor.
+ * @param bs BitSet to copy
+ * @return
+ */
+ BitSet(const BitSet & bs);
+ virtual ~BitSet();
+
+ /// See if the BitSet is null
+ bool isNull() const {return num_bits == 0;}
+
+ /**
+ * Get the value of a bit, false means 0, true 1.
+ * @param i Index of Bit
+ */
+ bool get(Uint32 i) const;
+
+ /**
+ * Set the value of a bit, false means 0, true 1.
+ * @param i Index of Bit
+ * @param on False means 0, true 1
+ */
+ void set(Uint32 i,bool on);
+
+ /// Set all bits on or off
+ void setAll(bool on);
+
+ Uint32 getNumBytes() const {return num_bytes;}
+ Uint32 getNumBits() const {return num_bits;}
+ const Uint8* getData() const {return data;}
+ Uint8* getData() {return data;}
+
+ /// Get the number of on bits
+ Uint32 numOnBits() const {return num_on;}
+
+ /**
+ * Set all bits to 0
+ */
+ void clear();
+
+ /**
+ * or this BitSet with another.
+ * @param other The other BitSet
+ */
+ void orBitSet(const BitSet & other);
+
+ /**
+ * Assignment operator.
+ * @param bs BitSet to copy
+ * @return *this
+ */
+ BitSet & operator = (const BitSet & bs);
+
+ /// Check if all bit are set to 1
+ bool allOn() const;
+
+ /**
+ * Check for equality of bitsets
+ * @param bs BitSet to compare
+ * @return true if equal
+ */
+ bool operator == (const BitSet & bs);
+
+ /**
+ * Opposite of operator ==
+ */
+ bool operator != (const BitSet & bs) {return ! operator == (bs);}
+
+ static BitSet null;
+ };
+
+ inline bool BitSet::get(Uint32 i) const
+ {
+ if (i >= num_bits)
+ return false;
+
+ Uint32 byte = i / 8;
+ Uint32 bit = i % 8;
+ Uint8 b = data[byte] & (0x01 << (7 - bit));
+ return b != 0x00;
+ }
+
+ inline void BitSet::set(Uint32 i,bool on)
+ {
+ if (i >= num_bits)
+ return;
+
+ Uint32 byte = i / 8;
+ Uint32 bit = i % 8;
+ if (on && !get(i))
+ {
+ num_on++;
+ data[byte] |= (0x01 << (7 - bit));
+ }
+ else if (!on && get(i))
+ {
+ num_on--;
+ Uint8 b = (0x01 << (7 - bit));
+ data[byte] &= (~b);
+ }
+ }
+}
+
+#endif
diff --git a/libktorrent/util/constants.h b/libktorrent/util/constants.h
new file mode 100644
index 0000000..e663978
--- /dev/null
+++ b/libktorrent/util/constants.h
@@ -0,0 +1,96 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCONSTANTS_H
+#define BTCONSTANTS_H
+
+#include <qglobal.h>
+
+namespace bt
+{
+ typedef Q_UINT64 Uint64;
+ typedef Q_UINT32 Uint32;
+ typedef Q_UINT16 Uint16;
+ typedef Q_UINT8 Uint8;
+
+ typedef Q_INT64 Int64;
+ typedef Q_INT32 Int32;
+ typedef Q_INT16 Int16;
+ typedef Q_INT8 Int8;
+
+ typedef Uint64 TimeStamp;
+
+ typedef enum
+ {
+ /* These are the old values, for compatability reasons with old chunk_info files we leave them here :
+ PREVIEW_PRIORITY = 4,
+ FIRST_PRIORITY = 3,
+ NORMAL_PRIORITY = 2,
+ LAST_PRIORITY = 1,
+ EXCLUDED = 0,
+ ONLY_SEED_PRIORITY = -1
+ */
+ // make sure new values are different from old values
+ // also leave some room if we want to add new priorities in the future
+ PREVIEW_PRIORITY = 60,
+ FIRST_PRIORITY = 50,
+ NORMAL_PRIORITY = 40,
+ LAST_PRIORITY = 30,
+ ONLY_SEED_PRIORITY = 20,
+ EXCLUDED = 10
+ }Priority;
+
+ enum ConfirmationResult
+ {
+ KEEP_DATA,
+ THROW_AWAY_DATA,
+ CANCELED
+ };
+
+ const Uint32 MAX_MSGLEN = 9 + 131072;
+ const Uint16 MIN_PORT = 6881;
+ const Uint16 MAX_PORT = 6889;
+ const Uint32 MAX_PIECE_LEN = 16384;
+
+ const Uint8 CHOKE = 0;
+ const Uint8 UNCHOKE = 1;
+ const Uint8 INTERESTED = 2;
+ const Uint8 NOT_INTERESTED = 3;
+ const Uint8 HAVE = 4;
+ const Uint8 BITFIELD = 5;
+ const Uint8 REQUEST = 6;
+ const Uint8 PIECE = 7;
+ const Uint8 CANCEL = 8;
+ const Uint8 PORT = 9;
+ const Uint8 SUGGEST_PIECE = 13;
+ const Uint8 HAVE_ALL = 14;
+ const Uint8 HAVE_NONE = 15;
+ const Uint8 REJECT_REQUEST = 16;
+ const Uint8 ALLOWED_FAST = 17;
+ const Uint8 EXTENDED = 20; // extension protocol message
+
+
+ // flags for things which a peer supports
+ const Uint32 DHT_SUPPORT = 0x01;
+ const Uint32 EXT_PROT_SUPPORT = 0x10;
+ const Uint32 FAST_EXT_SUPPORT = 0x04;
+}
+
+
+#endif
diff --git a/libktorrent/util/error.cpp b/libktorrent/util/error.cpp
new file mode 100644
index 0000000..bb981db
--- /dev/null
+++ b/libktorrent/util/error.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "error.h"
+
+namespace bt
+{
+
+ Error::Error(const QString & msg) : msg(msg)
+ {}
+
+
+ Error::~Error()
+ {}
+
+
+}
diff --git a/libktorrent/util/error.h b/libktorrent/util/error.h
new file mode 100644
index 0000000..8b089e4
--- /dev/null
+++ b/libktorrent/util/error.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTERROR_H
+#define BTERROR_H
+
+#include <qstring.h>
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class Error
+ {
+ QString msg;
+ public:
+ Error(const QString & msg);
+ virtual ~Error();
+
+ QString toString() const {return msg;}
+
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/file.cpp b/libktorrent/util/file.cpp
new file mode 100644
index 0000000..b898e07
--- /dev/null
+++ b/libktorrent/util/file.cpp
@@ -0,0 +1,150 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qfile.h>
+#include "config.h"
+#include <klocale.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+#include <torrent/globals.h>
+#include "file.h"
+#include "error.h"
+#include "log.h"
+
+namespace bt
+{
+
+ File::File() : fptr(0)
+ {}
+
+
+ File::~File()
+ {
+ close();
+ }
+
+ bool File::open(const QString & file,const QString & mode)
+ {
+ this->file = file;
+ if (fptr)
+ close();
+#if HAVE_FOPEN64
+ fptr = fopen64(QFile::encodeName(file),mode.ascii());
+#else
+ fptr = fopen(QFile::encodeName(file),mode.ascii());
+#endif
+ return fptr != 0;
+ }
+
+ void File::close()
+ {
+ if (fptr)
+ {
+ fclose(fptr);
+ fptr = 0;
+ }
+ }
+
+ void File::flush()
+ {
+ if (fptr)
+ fflush(fptr);
+ }
+
+ Uint32 File::write(const void* buf,Uint32 size)
+ {
+ if (!fptr)
+ return 0;
+
+ Uint32 ret = fwrite(buf,1,size,fptr);
+ if (ret != size)
+ {
+ if (errno == ENOSPC)
+ Out() << "Disk full !" << endl;
+
+ throw Error(i18n("Cannot write to %1 : %2").arg(file).arg(strerror(errno)));
+ }
+ return ret;
+ }
+
+ Uint32 File::read(void* buf,Uint32 size)
+ {
+ if (!fptr)
+ return 0;
+
+ Uint32 ret = fread(buf,1,size,fptr);
+ if (ferror(fptr))
+ {
+ clearerr(fptr);
+ throw Error(i18n("Cannot read from %1").arg(file));
+ }
+ return ret;
+ }
+
+ Uint64 File::seek(SeekPos from,Int64 num)
+ {
+ // printf("sizeof(off_t) = %i\n",sizeof(__off64_t));
+ if (!fptr)
+ return 0;
+
+ int p = SEEK_CUR; // use a default to prevent compiler warning
+ switch (from)
+ {
+ case BEGIN : p = SEEK_SET; break;
+ case END : p = SEEK_END; break;
+ case CURRENT : p = SEEK_CUR; break;
+ default:
+ break;
+ }
+#if HAVE_FSEEKO64
+ fseeko64(fptr,num,p);
+ return ftello64(fptr);
+#else
+ fseeko(fptr,num,p);
+ return ftello(fptr);
+#endif
+ }
+
+ bool File::eof() const
+ {
+ if (!fptr)
+ return true;
+
+ return feof(fptr) != 0;
+ }
+
+ Uint64 File::tell() const
+ {
+ if (!fptr)
+ return 0;
+
+ return ftello(fptr);
+ }
+
+ QString File::errorString() const
+ {
+ return QString(strerror(errno));
+ }
+}
diff --git a/libktorrent/util/file.h b/libktorrent/util/file.h
new file mode 100644
index 0000000..323a3a7
--- /dev/null
+++ b/libktorrent/util/file.h
@@ -0,0 +1,114 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTFILE_H
+#define BTFILE_H
+
+#include <stdio.h>
+#include <qstring.h>
+#include "constants.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Wrapper class for stdio's FILE
+ *
+ * Wrapper class for stdio's FILE.
+ */
+ class File
+ {
+ FILE* fptr;
+ QString file;
+ public:
+ /**
+ * Constructor.
+ */
+ File();
+
+ /**
+ * Destructor, closes the file.
+ */
+ virtual ~File();
+
+ /**
+ * Open the file similar to fopen
+ * @param file Filename
+ * @param mode Mode
+ * @return true upon succes
+ */
+ bool open(const QString & file,const QString & mode);
+
+ /**
+ * Close the file.
+ */
+ void close();
+
+ /**
+ * Flush the file.
+ */
+ void flush();
+
+ /**
+ * Write a bunch of data. If anything goes wrong
+ * an Error will be thrown.
+ * @param buf The data
+ * @param size Size of the data
+ * @return The number of bytes written
+ */
+ Uint32 write(const void* buf,Uint32 size);
+
+ /**
+ * Read a bunch of data. If anything goes wrong
+ * an Error will be thrown.
+ * @param buf The buffer to store the data
+ * @param size Size of the buffer
+ * @return The number of bytes read
+ */
+ Uint32 read(void* buf,Uint32 size);
+
+ enum SeekPos
+ {
+ BEGIN,
+ END,
+ CURRENT
+ };
+
+ /**
+ * Seek in the file.
+ * @param from Position to seek from
+ * @param num Number of bytes to move
+ * @return New position
+ */
+ Uint64 seek(SeekPos from,Int64 num);
+
+ /// Check to see if we are at the end of the file.
+ bool eof() const;
+
+ /// Get the current position in the file.
+ Uint64 tell() const;
+
+ /// Get the error string.
+ QString errorString() const;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/fileops.cpp b/libktorrent/util/fileops.cpp
new file mode 100644
index 0000000..3fcf03d
--- /dev/null
+++ b/libktorrent/util/fileops.cpp
@@ -0,0 +1,466 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qstringlist.h>
+#include "fileops.h"
+#include "error.h"
+#include "log.h"
+#include <torrent/globals.h>
+#include "file.h"
+#include "array.h"
+
+#ifdef HAVE_XFS_XFS_H
+
+#if !defined(HAVE___S64) || !defined(HAVE___U64)
+#include <stdint.h>
+#endif
+
+#ifndef HAVE___U64
+typedef uint64_t __u64;
+#endif
+
+#ifndef HAVE___S64
+typedef int64_t __s64;
+#endif
+
+#include <xfs/xfs.h>
+#endif
+
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
+#endif
+
+#if HAVE_STATVFS
+#include <sys/statvfs.h>
+#else
+#include <sys/param.h>
+#include <sys/mount.h>
+#endif
+
+namespace bt
+{
+ void MakeDir(const QString & dir,bool nothrow)
+ {
+ if (mkdir(QFile::encodeName(dir),0777) < -1)
+ {
+ if (!nothrow)
+ throw Error(i18n("Cannot create directory %1: %2")
+ .arg(dir).arg(strerror(errno)));
+ else
+ {
+ Out() << QString("Error : Cannot create directory %1 : %2").arg(dir).arg(strerror(errno))<< endl;
+ }
+ }
+ }
+
+ void SymLink(const QString & link_to,const QString & link_url,bool nothrow)
+ {
+ if (symlink(QFile::encodeName(link_to),QFile::encodeName(link_url)) != 0)
+ {
+ if (!nothrow)
+ throw Error(i18n("Cannot symlink %1 to %2: %3")
+ .arg(link_url.utf8()).arg(link_to.utf8())
+ .arg(strerror(errno)));
+ else
+ Out() << QString("Error : Cannot symlink %1 to %2: %3")
+ .arg(link_url.utf8()).arg(link_to.utf8())
+ .arg(strerror(errno)) << endl;
+ }
+ }
+
+ void Move(const QString & src,const QString & dst,bool nothrow)
+ {
+ // Out() << "Moving " << src << " -> " << dst << endl;
+ if (!KIO::NetAccess::move(KURL::fromPathOrURL(src),KURL::fromPathOrURL(dst),0))
+ {
+ if (!nothrow)
+ throw Error(i18n("Cannot move %1 to %2: %3")
+ .arg(src).arg(dst)
+ .arg(KIO::NetAccess::lastErrorString()));
+ else
+ Out() << QString("Error : Cannot move %1 to %2: %3")
+ .arg(src).arg(dst)
+ .arg(KIO::NetAccess::lastErrorString()) << endl;
+
+ }
+ }
+
+ void CopyFile(const QString & src,const QString & dst,bool nothrow)
+ {
+ if (!KIO::NetAccess::file_copy(KURL::fromPathOrURL(src),KURL::fromPathOrURL(dst)))
+ {
+ if (!nothrow)
+ throw Error(i18n("Cannot copy %1 to %2: %3")
+ .arg(src).arg(dst)
+ .arg(KIO::NetAccess::lastErrorString()));
+ else
+ Out() << QString("Error : Cannot copy %1 to %2: %3")
+ .arg(src).arg(dst)
+ .arg(KIO::NetAccess::lastErrorString()) << endl;
+
+ }
+ }
+
+ void CopyDir(const QString & src,const QString & dst,bool nothrow)
+ {
+ if (!KIO::NetAccess::dircopy(KURL::fromPathOrURL(src),KURL::fromPathOrURL(dst),0))
+ {
+ if (!nothrow)
+ throw Error(i18n("Cannot copy %1 to %2: %3")
+ .arg(src).arg(dst)
+ .arg(KIO::NetAccess::lastErrorString()));
+ else
+ Out() << QString("Error : Cannot copy %1 to %2: %3")
+ .arg(src).arg(dst)
+ .arg(KIO::NetAccess::lastErrorString()) << endl;
+
+ }
+ }
+
+ bool Exists(const QString & url)
+ {
+ // Out() << "Testing if " << url << " exists " << endl;
+ if (access(QFile::encodeName(url),F_OK) < 0)
+ {
+ // Out() << "No " << endl;
+ return false;
+ }
+ else
+ {
+ // Out() << "Yes " << endl;
+ return true;
+ }
+ }
+
+ static bool DelDir(const QString & fn)
+ {
+ QDir d(fn);
+ QStringList subdirs = d.entryList(QDir::Dirs);
+
+ for (QStringList::iterator i = subdirs.begin(); i != subdirs.end();i++)
+ {
+ QString entry = *i;
+
+ if (entry == ".." || entry == ".")
+ continue;
+
+ if (!DelDir(d.absFilePath(entry)))
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Delete of " << fn << "/" << entry << " failed !" << endl;
+ return false;
+ }
+ }
+
+ QStringList files = d.entryList(QDir::Files | QDir::System | QDir::Hidden);
+ for (QStringList::iterator i = files.begin(); i != files.end();i++)
+ {
+ QString entry = *i;
+
+ if (remove(QFile::encodeName(d.absFilePath(entry))) < 0)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Delete of " << fn << "/" << entry << " failed !" << endl;
+ return false;
+ }
+ }
+
+ if (!d.rmdir(d.absPath()))
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Failed to remove " << d.absPath() << endl;
+ return false;
+ }
+
+ return true;
+ }
+
+ void Delete(const QString & url,bool nothrow)
+ {
+ QCString fn = QFile::encodeName(url);
+#if HAVE_STAT64
+ struct stat64 statbuf;
+ if (lstat64(fn, &statbuf) < 0)
+ return;
+#else
+ struct stat statbuf;
+ if (lstat(fn, &statbuf) < 0)
+ return;
+#endif
+
+ bool ok = true;
+ // first see if it is a directory
+ if (S_ISDIR(statbuf.st_mode))
+ {
+ ok = DelDir(url);
+ }
+ else
+ {
+ ok = remove(fn) >= 0;
+ }
+
+ if (!ok)
+ {
+ QString err = i18n("Cannot delete %1: %2")
+ .arg(url)
+ .arg(strerror(errno));
+ if (!nothrow)
+ throw Error(err);
+ else
+ Out() << "Error : " << err << endl;
+ }
+ }
+
+ void Touch(const QString & url,bool nothrow)
+ {
+ if (Exists(url))
+ return;
+
+ File fptr;
+ if (!fptr.open(url,"wb"))
+ {
+ if (!nothrow)
+ throw Error(i18n("Cannot create %1: %2")
+ .arg(url)
+ .arg(fptr.errorString()));
+ else
+ Out() << "Error : Cannot create " << url << " : "
+ << fptr.errorString() << endl;
+
+ }
+ }
+
+ Uint64 FileSize(const QString & url)
+ {
+ int ret = 0;
+#if HAVE_STAT64
+ struct stat64 sb;
+ ret = stat64(QFile::encodeName(url),&sb);
+#else
+ struct stat sb;
+ ret = stat(QFile::encodeName(url),&sb);
+#endif
+ if (ret < 0)
+ throw Error(i18n("Cannot calculate the filesize of %1: %2")
+ .arg(url).arg(strerror(errno)));
+
+ return (Uint64)sb.st_size;
+ }
+
+ Uint64 FileSize(int fd)
+ {
+ int ret = 0;
+#if HAVE_STAT64
+ struct stat64 sb;
+ ret = fstat64(fd,&sb);
+#else
+ struct stat sb;
+ ret = fstat(fd,&sb);
+#endif
+ if (ret < 0)
+ throw Error(i18n("Cannot calculate the filesize : %2").arg(strerror(errno)));
+
+ return (Uint64)sb.st_size;
+ }
+
+ bool FatPreallocate(int fd,Uint64 size)
+ {
+ try
+ {
+ SeekFile(fd, size - 1, SEEK_SET);
+ char zero = 0;
+ if (write(fd, &zero, 1) == -1)
+ return false;
+
+ TruncateFile(fd,size,true);
+ }
+ catch (bt::Error & e)
+ {
+ Out() << e.toString() << endl;
+ return false;
+ }
+ return true;
+ }
+
+ bool FatPreallocate(const QString & path,Uint64 size)
+ {
+ int fd = ::open(QFile::encodeName(path),O_RDWR | O_LARGEFILE);
+ if (fd < 0)
+ throw Error(i18n("Cannot open %1 : %2").arg(path).arg(strerror(errno)));
+
+ bool ret = FatPreallocate(fd,size);
+ close(fd);
+ return ret;
+ }
+
+#ifdef HAVE_XFS_XFS_H
+
+ bool XfsPreallocate(int fd, Uint64 size)
+ {
+ if( ! platform_test_xfs_fd(fd) )
+ {
+ return false;
+ }
+
+ xfs_flock64_t allocopt;
+ allocopt.l_whence = 0;
+ allocopt.l_start = 0;
+ allocopt.l_len = size;
+
+ return (! static_cast<bool>(xfsctl(0, fd, XFS_IOC_RESVSP64, &allocopt)) );
+
+ }
+
+ bool XfsPreallocate(const QString & path, Uint64 size)
+ {
+ int fd = ::open(QFile::encodeName(path), O_RDWR | O_LARGEFILE);
+ if (fd < 0)
+ throw Error(i18n("Cannot open %1 : %2").arg(path).arg(strerror(errno)));
+
+ bool ret = XfsPreallocate(fd,size);
+ close(fd);
+ return ret;
+ }
+
+#endif
+
+ void TruncateFile(int fd,Uint64 size,bool quick)
+ {
+ if (FileSize(fd) == size)
+ return;
+
+ if (quick)
+ {
+#if HAVE_FTRUNCATE64
+ if (ftruncate64(fd,size) == -1)
+#else
+ if (ftruncate(fd,size) == -1)
+#endif
+ throw Error(i18n("Cannot expand file : %1").arg(strerror(errno)));
+ }
+ else
+ {
+#if HAVE_POSIX_FALLOCATE64
+ if (posix_fallocate64(fd,0,size) != 0)
+ throw Error(i18n("Cannot expand file : %1").arg(strerror(errno)));
+#elif HAVE_POSIX_FALLOCATE
+ if (posix_fallocate(fd,0,size) != 0)
+ throw Error(i18n("Cannot expand file : %1").arg(strerror(errno)));
+#else
+ SeekFile(fd,0,SEEK_SET);
+ bt::Array<Uint8> buf(4096);
+ buf.fill(0);
+
+ Uint64 written = 0;
+ while (written < size)
+ {
+ int to_write = size - written;
+ if (to_write > 4096)
+ to_write = 4096;
+
+ int ret = write(fd,buf,to_write);
+ if (ret < 0)
+ throw Error(i18n("Cannot expand file : %1").arg(strerror(errno)));
+ else if (ret == 0 || ret != (int)to_write)
+ throw Error(i18n("Cannot expand file").arg(strerror(errno)));
+ else
+ written += to_write;
+ }
+#endif
+ }
+ }
+
+ void TruncateFile(const QString & path,Uint64 size)
+ {
+ int fd = ::open(QFile::encodeName(path),O_RDWR | O_LARGEFILE);
+ if (fd < 0)
+ throw Error(i18n("Cannot open %1 : %2").arg(path).arg(strerror(errno)));
+
+ try
+ {
+ TruncateFile(fd,size,true);
+ close(fd);
+ }
+ catch (...)
+ {
+ close(fd);
+ throw;
+ }
+ }
+
+ void SeekFile(int fd,Int64 off,int whence)
+ {
+#if HAVE_LSEEK64
+ if (lseek64(fd,off,whence) == -1)
+#else
+ if (lseek(fd,off,whence) == -1)
+#endif
+ throw Error(i18n("Cannot seek in file : %1").arg(strerror(errno)));
+ }
+
+ bool FreeDiskSpace(const QString & path,Uint64 & bytes_free)
+ {
+#if HAVE_STATVFS
+#if HAVE_STATVFS64
+ struct statvfs64 stfs;
+ if (statvfs64(path.local8Bit(), &stfs) == 0)
+#else
+ struct statvfs stfs;
+ if (statvfs(path.local8Bit(), &stfs) == 0)
+#endif
+ {
+ bytes_free = ((Uint64)stfs.f_bavail) * ((Uint64)stfs.f_frsize);
+ return true;
+ }
+ else
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Error : statvfs for " << path << " failed : "
+ << QString(strerror(errno)) << endl;
+
+ return false;
+ }
+#else
+ struct statfs stfs;
+ if (statfs(path.local8Bit(), &stfs) == 0)
+ {
+ bytes_free = ((Uint64)stfs.f_bavail) * ((Uint64)stfs.f_bsize);
+ return true;
+ }
+ else
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Error : statfs for " << path << " failed : "
+ << QString(strerror(errno)) << endl;
+
+ return false;
+ }
+#endif
+ }
+}
diff --git a/libktorrent/util/fileops.h b/libktorrent/util/fileops.h
new file mode 100644
index 0000000..253ee96
--- /dev/null
+++ b/libktorrent/util/fileops.h
@@ -0,0 +1,165 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTFILEOPS_H
+#define BTFILEOPS_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <util/constants.h>
+class QString;
+
+namespace bt
+{
+
+ /**
+ * Creates a directory. Convenience function around
+ * KIO::NetAccess::mkdir .
+ * @param dir The url of the dir
+ * @param nothrow wether or not we shouldn't throw an Error upon failure
+ * @throw Error upon error
+ */
+ void MakeDir(const QString & dir,bool nothrow = false);
+
+ /**
+ * Create a symbolic link @a link_url which links to @a link_to
+ * @param link_to The file to link to
+ * @param link_url The link url
+ * @param nothrow wether or not we shouldn't throw an Error upon failure
+ */
+ void SymLink(const QString & link_to,const QString & link_url,bool nothrow = false);
+
+ /**
+ * Move a file/dir from one location to another
+ * @param src The source file
+ * @param dst The destination file / directory
+ * @param nothrow wether or not we shouldn't throw an Error upon failure
+ */
+ void Move(const QString & src,const QString & dst,bool nothrow = false);
+
+ /**
+ * Copy a file.
+ * @param src The source file
+ * @param dst The destination dir/file
+ * @param nothrow wether or not we shouldn't throw an Error upon failure
+ */
+ void CopyFile(const QString & src,const QString & dst,bool nothrow = false);
+
+ /**
+ * Copy a file or directory
+ * @param src The source file
+ * @param dst The destination dir/file
+ * @param nothrow wether or not we shouldn't throw an Error upon failure
+ */
+ void CopyDir(const QString & src,const QString & dst,bool nothrow = false);
+
+ /**
+ * Check wether a file/dir exists
+ * @param url The file/dir
+ * @return true if it exits
+ */
+ bool Exists(const QString & url);
+
+ /**
+ * Delete a file or directory.
+ * @param url The url of the file/dir
+ * @param nothrow wether or not we shouldn't throw an Error upon failure
+ */
+ void Delete(const QString & url,bool nothrow = false);
+
+ /**
+ * Try to create a file. Doesn't do anything if the file
+ * already exists.
+ * @param url The url of the file
+ * @param nothrow wether or not we shouldn't throw an Error upon failure
+ */
+ void Touch(const QString & url,bool nothrow = false);
+
+ /**
+ * Calculates the size of a file
+ * @param url Name of the file
+ * @return The size of the file
+ * @throw Error if the file doesn't exist, or something else goes wrong
+ */
+ Uint64 FileSize(const QString & url);
+
+ /**
+ * Get the size of a file.
+ * @param fd The file descriptor of the file
+ * @return The size
+ * @throw Error if the file doesn't exist, or something else goes wrong
+ */
+ Uint64 FileSize(int fd);
+
+ /**
+ * Truncate a file (wrapper around ftruncate)
+ * @param fd The file descriptor of the file
+ * @param size The size to truncate to
+ * @throw Error if the file doesn't exist, or something else goes wrong
+ */
+ void TruncateFile(int fd,Uint64 size,bool quick);
+
+ /**
+ * Truncate a file (wrapper around ftruncate)
+ * @param fd Path of the file
+ * @param size The size to truncate to
+ * @param quick Use the quick way (doesn't prevent fragmentationt)
+ * @throw Error if the file doesn't exist, or something else goes wrong
+ */
+ void TruncateFile(const QString & path,Uint64 size);
+
+ /**
+ * Special truncate for FAT file systems.
+ */
+ bool FatPreallocate(int fd,Uint64 size);
+
+ /**
+ * Special truncate for FAT file systems.
+ */
+ bool FatPreallocate(const QString & path,Uint64 size);
+
+#ifdef HAVE_XFS_XFS_H
+ /**
+ * Special truncate for XFS file systems.
+ */
+ bool XfsPreallocate(int fd,Uint64 size);
+
+ /**
+ * Special truncate for XFS file systems.
+ */
+ bool XfsPreallocate(const QString & path,Uint64 size);
+
+#endif
+
+ /**
+ * Seek in a file, wrapper around lseek
+ * @param fd The file descriptor
+ * @param off Offset
+ * @param whence Position to seek from
+ * @throw Error if something else goes wrong
+ */
+ void SeekFile(int fd,Int64 off,int whence);
+
+ /// Calculate the number of bytes free on the filesystem path is located
+ bool FreeDiskSpace(const QString & path,Uint64 & bytes_free);
+}
+
+#endif
diff --git a/libktorrent/util/functions.cpp b/libktorrent/util/functions.cpp
new file mode 100644
index 0000000..744bf43
--- /dev/null
+++ b/libktorrent/util/functions.cpp
@@ -0,0 +1,239 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qdir.h>
+#include <qhostaddress.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kmimetype.h>
+#include <kglobal.h>
+#include "functions.h"
+#include "error.h"
+#include "log.h"
+
+namespace bt
+{
+
+ bool IsMultimediaFile(const QString & filename)
+ {
+ KMimeType::Ptr ptr = KMimeType::findByPath(filename);
+ QString name = ptr->name();
+ return name.startsWith("audio") || name.startsWith("video") || name == "application/ogg";
+ }
+
+ QHostAddress LookUpHost(const QString & host)
+ {
+ struct hostent * he = gethostbyname(host.ascii());
+ QHostAddress addr;
+ if (he)
+ {
+ addr.setAddress(inet_ntoa(*((struct in_addr *)he->h_addr)));
+ }
+ return addr;
+ }
+
+ QString DirSeparator()
+ {
+ QString tmp;
+ tmp.append(QDir::separator());
+ return tmp;
+ }
+
+ void WriteUint64(Uint8* buf,Uint32 off,Uint64 val)
+ {
+ buf[off + 0] = (Uint8) ((val & 0xFF00000000000000ULL) >> 56);
+ buf[off + 1] = (Uint8) ((val & 0x00FF000000000000ULL) >> 48);
+ buf[off + 2] = (Uint8) ((val & 0x0000FF0000000000ULL) >> 40);
+ buf[off + 3] = (Uint8) ((val & 0x000000FF00000000ULL) >> 32);
+ buf[off + 4] = (Uint8) ((val & 0x00000000FF000000ULL) >> 24);
+ buf[off + 5] = (Uint8) ((val & 0x0000000000FF0000ULL) >> 16);
+ buf[off + 6] = (Uint8) ((val & 0x000000000000FF00ULL) >> 8);
+ buf[off + 7] = (Uint8) ((val & 0x00000000000000FFULL) >> 0);
+ }
+
+ Uint64 ReadUint64(const Uint8* buf,Uint64 off)
+ {
+ Uint64 tmp =
+ ((Uint64)buf[off] << 56) |
+ ((Uint64)buf[off+1] << 48) |
+ ((Uint64)buf[off+2] << 40) |
+ ((Uint64)buf[off+3] << 32) |
+ ((Uint64)buf[off+4] << 24) |
+ ((Uint64)buf[off+5] << 16) |
+ ((Uint64)buf[off+6] << 8) |
+ ((Uint64)buf[off+7] << 0);
+
+ return tmp;
+ }
+
+ void WriteUint32(Uint8* buf,Uint32 off,Uint32 val)
+ {
+ buf[off + 0] = (Uint8) ((val & 0xFF000000) >> 24);
+ buf[off + 1] = (Uint8) ((val & 0x00FF0000) >> 16);
+ buf[off + 2] = (Uint8) ((val & 0x0000FF00) >> 8);
+ buf[off + 3] = (Uint8) (val & 0x000000FF);
+ }
+
+ Uint32 ReadUint32(const Uint8* buf,Uint32 off)
+ {
+ return (buf[off] << 24) | (buf[off+1] << 16) | (buf[off+2] << 8) | buf[off + 3];
+ }
+
+ void WriteUint16(Uint8* buf,Uint32 off,Uint16 val)
+ {
+ buf[off + 0] = (Uint8) ((val & 0xFF00) >> 8);
+ buf[off + 1] = (Uint8) (val & 0x000FF);
+ }
+
+ Uint16 ReadUint16(const Uint8* buf,Uint32 off)
+ {
+ return (buf[off] << 8) | buf[off + 1];
+ }
+
+
+ void WriteInt64(Uint8* buf,Uint32 off,Int64 val)
+ {
+ buf[off + 0] = (Uint8) ((val & 0xFF00000000000000ULL) >> 56);
+ buf[off + 1] = (Uint8) ((val & 0x00FF000000000000ULL) >> 48);
+ buf[off + 2] = (Uint8) ((val & 0x0000FF0000000000ULL) >> 40);
+ buf[off + 3] = (Uint8) ((val & 0x000000FF00000000ULL) >> 32);
+ buf[off + 4] = (Uint8) ((val & 0x00000000FF000000ULL) >> 24);
+ buf[off + 5] = (Uint8) ((val & 0x0000000000FF0000ULL) >> 16);
+ buf[off + 6] = (Uint8) ((val & 0x000000000000FF00ULL) >> 8);
+ buf[off + 7] = (Uint8) ((val & 0x00000000000000FFULL) >> 0);
+ }
+
+ Int64 ReadInt64(const Uint8* buf,Uint32 off)
+ {
+ Int64 tmp =
+ ((Int64)buf[off] << 56) |
+ ((Int64)buf[off+1] << 48) |
+ ((Int64)buf[off+2] << 40) |
+ ((Int64)buf[off+3] << 32) |
+ ((Int64)buf[off+4] << 24) |
+ ((Int64)buf[off+5] << 16) |
+ ((Int64)buf[off+6] << 8) |
+ ((Int64)buf[off+7] << 0);
+
+ return tmp;
+ }
+
+ void WriteInt32(Uint8* buf,Uint32 off,Int32 val)
+ {
+ buf[off + 0] = (Uint8) ((val & 0xFF000000) >> 24);
+ buf[off + 1] = (Uint8) ((val & 0x00FF0000) >> 16);
+ buf[off + 2] = (Uint8) ((val & 0x0000FF00) >> 8);
+ buf[off + 3] = (Uint8) (val & 0x000000FF);
+ }
+
+ Int32 ReadInt32(const Uint8* buf,Uint32 off)
+ {
+ return (Int32)(buf[off] << 24) | (buf[off+1] << 16) | (buf[off+2] << 8) | buf[off + 3];
+ }
+
+ void WriteInt16(Uint8* buf,Uint32 off,Int16 val)
+ {
+ buf[off + 0] = (Uint8) ((val & 0xFF00) >> 8);
+ buf[off + 1] = (Uint8) (val & 0x000FF);
+ }
+
+ Int16 ReadInt16(const Uint8* buf,Uint32 off)
+ {
+ return (Int16)(buf[off] << 8) | buf[off + 1];
+ }
+
+ void UpdateCurrentTime()
+ {
+ global_time_stamp = Now();
+ }
+
+ TimeStamp global_time_stamp = 0;
+
+ Uint64 Now()
+ {
+ struct timeval tv;
+ gettimeofday(&tv,0);
+ global_time_stamp = (Uint64)tv.tv_sec * 1000 + (Uint64)tv.tv_usec * 0.001;
+ return global_time_stamp;
+ }
+
+ Uint32 MaxOpenFiles()
+ {
+ struct rlimit lim;
+ getrlimit(RLIMIT_NOFILE,&lim);
+ return lim.rlim_cur;
+ }
+
+ bool MaximizeLimits()
+ {
+ // first get the current limits
+ struct rlimit lim;
+ getrlimit(RLIMIT_NOFILE,&lim);
+
+ if (lim.rlim_cur != lim.rlim_max)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Current limit for number of files : " << lim.rlim_cur
+ << " (" << lim.rlim_max << " max)" << endl;
+ lim.rlim_cur = lim.rlim_max;
+ if (setrlimit(RLIMIT_NOFILE,&lim) < 0)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Failed to maximize file limit : "
+ << QString(strerror(errno)) << endl;
+ return false;
+ }
+ }
+ else
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "File limit allready at maximum " << endl;
+ }
+
+ getrlimit(RLIMIT_DATA,&lim);
+ if (lim.rlim_cur != lim.rlim_max)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Current limit for data size : " << lim.rlim_cur
+ << " (" << lim.rlim_max << " max)" << endl;
+ lim.rlim_cur = lim.rlim_max;
+ if (setrlimit(RLIMIT_DATA,&lim) < 0)
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Failed to maximize data limit : "
+ << QString(strerror(errno)) << endl;
+ return false;
+ }
+ }
+ else
+ {
+ Out(SYS_GEN|LOG_DEBUG) << "Data limit allready at maximum " << endl;
+ }
+
+ return true;
+ }
+
+
+
+
+}
diff --git a/libktorrent/util/functions.h b/libktorrent/util/functions.h
new file mode 100644
index 0000000..4ace51b
--- /dev/null
+++ b/libktorrent/util/functions.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTFUNCTIONS_H
+#define BTFUNCTIONS_H
+
+#include "constants.h"
+
+class QString;
+class QHostAddress;
+class KURL;
+
+namespace bt
+{
+
+ void WriteUint64(Uint8* buf,Uint32 off,Uint64 val);
+ Uint64 ReadUint64(const Uint8* buf,Uint64 off);
+
+ void WriteUint32(Uint8* buf,Uint32 off,Uint32 val);
+ Uint32 ReadUint32(const Uint8* buf,Uint32 off);
+
+ void WriteUint16(Uint8* buf,Uint32 off,Uint16 val);
+ Uint16 ReadUint16(const Uint8* buf,Uint32 off);
+
+
+ void WriteInt64(Uint8* buf,Uint32 off,Int64 val);
+ Int64 ReadInt64(const Uint8* buf,Uint32 off);
+
+ void WriteInt32(Uint8* buf,Uint32 off,Int32 val);
+ Int32 ReadInt32(const Uint8* buf,Uint32 off);
+
+ void WriteInt16(Uint8* buf,Uint32 off,Int16 val);
+ Int16 ReadInt16(const Uint8* buf,Uint32 off);
+
+ void UpdateCurrentTime();
+
+ extern TimeStamp global_time_stamp;
+
+ inline TimeStamp GetCurrentTime() {return global_time_stamp;}
+
+ TimeStamp Now();
+
+ QHostAddress LookUpHost(const QString & host);
+ QString DirSeparator();
+ bool IsMultimediaFile(const QString & filename);
+
+ /**
+ * Maximize the file and memory limits using setrlimit.
+ */
+ bool MaximizeLimits();
+
+ /// Get the maximum number of open files
+ Uint32 MaxOpenFiles();
+}
+
+#endif
diff --git a/libktorrent/util/httprequest.cpp b/libktorrent/util/httprequest.cpp
new file mode 100644
index 0000000..d0652bc
--- /dev/null
+++ b/libktorrent/util/httprequest.cpp
@@ -0,0 +1,122 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qstringlist.h>
+#include <torrent/globals.h>
+#include "httprequest.h"
+#include "array.h"
+#include "log.h"
+
+
+namespace bt
+{
+
+ HTTPRequest::HTTPRequest(const QString & hdr,const QString & payload,const QString & host,Uint16 port,bool verbose) : hdr(hdr),payload(payload),verbose(verbose)
+ {
+ sock = new KNetwork::KStreamSocket(host,QString::number(port),this,0);
+ sock->enableRead(true);
+ sock->enableWrite(true);
+ sock->setTimeout(30000);
+ sock->setBlocking(false);
+ connect(sock,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
+ connect(sock,SIGNAL(gotError(int)),this,SLOT(onError(int )));
+ connect(sock,SIGNAL(timedOut()),this,SLOT(onTimeout()));
+ connect(sock,SIGNAL(connected(const KResolverEntry&)),
+ this, SLOT(onConnect( const KResolverEntry& )));
+ }
+
+
+ HTTPRequest::~HTTPRequest()
+ {
+ sock->close();
+ delete sock;
+ }
+
+ void HTTPRequest::start()
+ {
+ sock->connect();
+ }
+
+ void HTTPRequest::onConnect(const KResolverEntry&)
+ {
+ payload = payload.replace("$LOCAL_IP",sock->localAddress().nodeName());
+ hdr = hdr.replace("$CONTENT_LENGTH",QString::number(payload.length()));
+
+ QString req = hdr + payload;
+ if (verbose)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Sending " << endl;
+ Out(SYS_PNP|LOG_DEBUG) << hdr << payload << endl;
+ }
+ sock->writeBlock(req.ascii(),req.length());
+ }
+
+ void HTTPRequest::onReadyRead()
+ {
+ Uint32 ba = sock->bytesAvailable();
+ if (ba == 0)
+ {
+ error(this,false);
+ sock->close();
+ return;
+ }
+
+ Array<char> data(ba);
+ ba = sock->readBlock(data,ba);
+ QString strdata((const char*)data);
+ QStringList sl = QStringList::split("\r\n",strdata,false);
+
+ if (verbose)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Got reply : " << endl;
+ Out(SYS_PNP|LOG_DEBUG) << strdata << endl;
+ }
+
+ if (sl.first().contains("HTTP") && sl.first().contains("200"))
+ {
+ // emit reply OK
+ replyOK(this,sl.last());
+ }
+ else
+ {
+ // emit reply error
+ replyError(this,sl.last());
+ }
+ operationFinished(this);
+ }
+
+ void HTTPRequest::onError(int)
+ {
+ Out() << "HTTPRequest error : " << sock->errorString() << endl;
+ error(this,false);
+ sock->close();
+ operationFinished(this);
+ }
+
+ void HTTPRequest::onTimeout()
+ {
+ Out() << "HTTPRequest timeout" << endl;
+ error(this,true);
+ sock->close();
+ operationFinished(this);
+ }
+
+
+}
+#include "httprequest.moc"
diff --git a/libktorrent/util/httprequest.h b/libktorrent/util/httprequest.h
new file mode 100644
index 0000000..348a84e
--- /dev/null
+++ b/libktorrent/util/httprequest.h
@@ -0,0 +1,98 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTHTTPREQUEST_H
+#define BTHTTPREQUEST_H
+
+#include <qobject.h>
+#include <kurl.h>
+#include <kstreamsocket.h>
+#include <interfaces/exitoperation.h>
+#include "constants.h"
+
+using KNetwork::KResolverEntry;
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ *
+ * Just create one, fill in the fields,
+ * connect to the right signals and forget about it. After the reply has been received or
+ * an error occurred, the appropriate signal will be emitted.
+ */
+ class HTTPRequest : public kt::ExitOperation
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Constructor, set the url and the request header.
+ * @param hdr The http request header
+ * @param payload The payload
+ * @param host The host
+ * @param port THe port
+ * @param verbose Print traffic to the log
+ */
+ HTTPRequest(const QString & hdr,const QString & payload,const QString & host,
+ Uint16 port,bool verbose);
+ virtual ~HTTPRequest();
+
+ /**
+ * Open a connetion and send the request.
+ */
+ void start();
+
+ signals:
+ /**
+ * An OK reply was sent.
+ * @param r The sender of the request
+ * @param data The data of the reply
+ */
+ void replyOK(bt::HTTPRequest* r,const QString & data);
+
+ /**
+ * Anything else but an 200 OK was sent.
+ * @param r The sender of the request
+ * @param data The data of the reply
+ */
+ void replyError(bt::HTTPRequest* r,const QString & data);
+
+ /**
+ * No reply was sent and an error or timeout occurred.
+ * @param r The sender of the request
+ * @param timeout Wether or not a timeout occurred
+ */
+ void error(bt::HTTPRequest* r,bool timeout);
+
+ private slots:
+ void onReadyRead();
+ void onError(int);
+ void onTimeout();
+ void onConnect(const KResolverEntry&);
+
+ private:
+ KNetwork::KStreamSocket* sock;
+ QString hdr,payload;
+ bool verbose;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/log.cpp b/libktorrent/util/log.cpp
new file mode 100644
index 0000000..05682a8
--- /dev/null
+++ b/libktorrent/util/log.cpp
@@ -0,0 +1,249 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include <kprocess.h>
+#include <klocale.h>
+#include <qdatetime.h>
+#include <qtextstream.h>
+#include <qfile.h>
+#include <qptrlist.h>
+#include <iostream>
+#include <stdlib.h>
+#include <torrent/globals.h>
+#include <interfaces/logmonitorinterface.h>
+#include <qmutex.h>
+#include <util/fileops.h>
+#include <stdlib.h>
+#include "log.h"
+#include "error.h"
+#include "autorotatelogjob.h"
+
+using namespace kt;
+
+namespace bt
+{
+ const Uint32 MAX_LOG_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
+
+ class Log::Private
+ {
+ public:
+ Log* parent;
+ QTextStream* out;
+ QFile fptr;
+ bool to_cout;
+ QPtrList<LogMonitorInterface> monitors;
+ QString tmp;
+ QMutex mutex;
+ unsigned int m_filter;
+ AutoRotateLogJob* rotate_job;
+ public:
+ Private(Log* parent) : parent(parent),out(0),to_cout(false),rotate_job(0)
+ {
+ out = new QTextStream();
+ }
+
+ ~Private()
+ {
+ delete out;
+ }
+
+
+ void setFilter(unsigned int filter)
+ {
+ m_filter = filter;
+ }
+
+ void rotateLogs(const QString & file)
+ {
+ if (bt::Exists(file + "-10.gz"))
+ bt::Delete(file + "-10.gz",true);
+
+ // move all log files one up
+ for (Uint32 i = 10;i > 1;i--)
+ {
+ QString prev = QString("%1-%2.gz").arg(file).arg(i - 1);
+ QString curr = QString("%1-%2.gz").arg(file).arg(i);
+ if (bt::Exists(prev))
+ bt::Move(prev,curr,true);
+ }
+
+ // move current log to 1 and zip it
+ bt::Move(file,file + "-1",true);
+ system(QString("gzip " + KProcess::quote(file + "-1")).local8Bit());
+ }
+
+ void setOutputFile(const QString & file)
+ {
+ if (fptr.isOpen())
+ fptr.close();
+
+ if (bt::Exists(file))
+ rotateLogs(file);
+
+ fptr.setName(file);
+ if (!fptr.open(IO_WriteOnly))
+ throw Error(i18n("Cannot open log file %1 : %2").arg(file).arg(fptr.errorString()));
+
+ out->setDevice(&fptr);
+ }
+
+ void write(const QString & line)
+ {
+ tmp += line;
+ }
+
+ void finishLine()
+ {
+ // only add stuff when we are not rotating the logs
+ // this could result in the loss of some messages
+ if (!rotate_job)
+ {
+ *out << QDateTime::currentDateTime().toString() << ": " << tmp << ::endl;
+ fptr.flush();
+ if (to_cout)
+ std::cout << tmp.local8Bit() << std::endl;
+
+ if (monitors.count() > 0)
+ {
+ QPtrList<LogMonitorInterface>::iterator i = monitors.begin();
+ while (i != monitors.end())
+ {
+ kt::LogMonitorInterface* lmi = *i;
+ lmi->message(tmp,m_filter);
+ i++;
+ }
+ }
+ }
+ tmp = "";
+ }
+
+ void endline()
+ {
+ finishLine();
+ if (fptr.size() > MAX_LOG_FILE_SIZE && !rotate_job)
+ {
+ tmp = "Log larger then 10 MB, rotating";
+ finishLine();
+ QString file = fptr.name();
+ fptr.close(); // close the log file
+ out->setDevice(0);
+ // start the rotate job
+ rotate_job = new AutoRotateLogJob(file,parent);
+ }
+ }
+
+ void logRotateDone()
+ {
+ fptr.open(IO_WriteOnly);
+ out->setDevice(&fptr);
+ rotate_job = 0;
+ }
+ };
+
+ Log::Log()
+ {
+ priv = new Private(this);
+ }
+
+
+ Log::~Log()
+ {
+ delete priv;
+ }
+
+
+ void Log::setOutputFile(const QString & file)
+ {
+ priv->setOutputFile(file);
+ }
+
+ void Log::addMonitor(kt::LogMonitorInterface* m)
+ {
+ priv->monitors.append(m);
+ }
+
+ void Log::removeMonitor(kt::LogMonitorInterface* m)
+ {
+ priv->monitors.remove(m);
+ }
+
+ void Log::setOutputToConsole(bool on)
+ {
+ priv->to_cout = on;
+ }
+
+ Log & endl(Log & lg)
+ {
+ lg.priv->endline();
+ lg.priv->mutex.unlock(); // unlock after end of line
+ return lg;
+ }
+
+ Log & Log::operator << (const KURL & url)
+ {
+ priv->write(url.prettyURL());
+ return *this;
+ }
+
+ Log & Log::operator << (const QString & s)
+ {
+ priv->write(s);
+ return *this;
+ }
+
+ Log & Log::operator << (const char* s)
+ {
+ priv->write(s);
+ return *this;
+ }
+
+ Log & Log::operator << (Uint64 v)
+ {
+ return operator << (QString::number(v));
+ }
+
+ Log & Log::operator << (Int64 v)
+ {
+ return operator << (QString::number(v));
+ }
+
+ void Log::setFilter(unsigned int filter)
+ {
+ priv->setFilter(filter);
+ }
+
+ void Log::lock()
+ {
+ priv->mutex.lock();
+ }
+
+ void Log::logRotateDone()
+ {
+ priv->logRotateDone();
+ }
+
+ Log & Out(unsigned int arg)
+ {
+ Log & lg = Globals::instance().getLog(arg);
+ lg.lock();
+ return lg;
+ }
+}
diff --git a/libktorrent/util/log.h b/libktorrent/util/log.h
new file mode 100644
index 0000000..2fe0ba6
--- /dev/null
+++ b/libktorrent/util/log.h
@@ -0,0 +1,209 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 JORISLOG_H
+#define JORISLOG_H
+
+
+#include "constants.h"
+#include <qstring.h>
+
+// LOG MESSAGES CONSTANTS
+#define LOG_NONE 0x00
+#define LOG_IMPORTANT 0x01
+#define LOG_NOTICE 0x03
+#define LOG_DEBUG 0x07
+#define LOG_ALL 0x0F
+
+#define SYS_GEN 0x0010 // Genereral info messages
+#define SYS_CON 0x0020 // Connections
+#define SYS_TRK 0x0040 // Tracker
+#define SYS_DHT 0x0080 // DHT
+#define SYS_DIO 0x0100 // Disk IO related stuff, saving and loading of chunks ...
+
+//plugins
+#define SYS_IPF 0x1000 // IPFilter
+#define SYS_SRC 0x2000 // Search plugin
+#define SYS_PNP 0x4000 // UPnP plugin
+#define SYS_INW 0x8000 // InfoWidget
+#define SYS_SNF 0x10000 // ScanFolder plugin
+#define SYS_PFI 0x20000 // Part file import
+#define SYS_SCD 0x40000 // Scheduler plugin
+#define SYS_RSS 0x80000 // RSS plugin
+#define SYS_WEB 0x100000 // WebInterface plugin
+#define SYS_ZCO 0x200000 // ZeroConf plugin
+
+class KURL;
+
+
+namespace kt
+{
+ class LogMonitorInterface;
+}
+
+namespace bt
+{
+
+
+ /**
+ * @author Joris Guisson
+ * @brief Class which writes messages to a logfile
+ *
+ * This class writes messages to a logfile. To use it, create an instance,
+ * set the output file and write stuff with the << operator.
+ *
+ * By default all messages will also be printed on the standard output. This
+ * can be turned down using the @a setOutputToConsole function.
+ *
+ * There is also the possibility to monitor what is written to the log using
+ * the LogMonitorInterface class.
+ */
+ class Log
+ {
+ class Private;
+
+ Private* priv;
+ public:
+ /**
+ * Constructor.
+ */
+ Log();
+
+ /**
+ * Destructor, closes the file.
+ */
+ virtual ~Log();
+
+ /**
+ * Enable or disable the printing of log messages to the standard
+ * output.
+ * @param on Enable or disable
+ */
+ void setOutputToConsole(bool on);
+
+ /**
+ * Add a log monitor.
+ * @param m The log monitor
+ */
+ void addMonitor(kt::LogMonitorInterface* m);
+
+ /**
+ * Remove a log monitor.
+ * @param m The log monitor
+ */
+ void removeMonitor(kt::LogMonitorInterface* m);
+
+ /**
+ * Set the output logfile.
+ * @param file The name of the file
+ * @throw Exception if the file can't be opened
+ */
+ void setOutputFile(const QString & file);
+
+ /**
+ * Write a number to the log file.
+ * Anything which can be passed to QString::number will do.
+ * @param val The value
+ * @return This Log
+ */
+ template <class T>
+ Log & operator << (T val)
+ {
+ return operator << (QString::number(val));
+ }
+
+ /**
+ * Apply a function to the Log.
+ * @param func The function
+ * @return This Log
+ */
+ Log & operator << (Log & (*func)(Log & ))
+ {
+ return func(*this);
+ }
+
+
+ /**
+ * Output a QString to the log.
+ * @param s The QString
+ * @return This Log
+ */
+ Log & operator << (const char* s);
+
+ /**
+ * Output a QString to the log.
+ * @param s The QString
+ * @return This Log
+ */
+ Log & operator << (const QString & s);
+
+ /**
+ * Output a 64 bit integer to the log.
+ * @param v The integer
+ * @return This Log
+ */
+ Log & operator << (Uint64 v);
+
+ /**
+ * Output a 64 bit integer to the log.
+ * @param v The integer
+ * @return This Log
+ */
+ Log & operator << (Int64 v);
+
+ /**
+ * Prints and endline character to the Log and flushes it.
+ * @param lg The Log
+ * @return @a lg
+ */
+ friend Log & endl(Log & lg);
+
+ /**
+ * Write an URL to the file.
+ * @param text The KURL
+ * @return This Log
+ */
+ Log & operator << (const KURL & url);
+
+ /**
+ * Sets a filter for log messages. Applies only to listeners via LogMonitorInterface!
+ * @param filter SYS & LOG flags combined with bitwise OR.
+ */
+ void setFilter(unsigned int filter);
+
+ /// Lock the mutex of the log, should be called in Out()
+ void lock();
+
+ /// Called by the auto log rotate job when it has finished
+ void logRotateDone();
+ };
+
+ Log & endl(Log & lg);
+
+
+ Log & Out(unsigned int arg = 0x00);
+ inline Log & GenOut(unsigned int arg) {return Out(SYS_GEN|arg);}
+ inline Log & DHTOut(unsigned int arg) {return Out(SYS_DHT|arg);}
+ inline Log & ConOut(unsigned int arg) {return Out(SYS_CON|arg);}
+ inline Log & TrkOut(unsigned int arg) {return Out(SYS_TRK|arg);}
+
+}
+
+#endif
diff --git a/libktorrent/util/mmapfile.cpp b/libktorrent/util/mmapfile.cpp
new file mode 100644
index 0000000..579c67a
--- /dev/null
+++ b/libktorrent/util/mmapfile.cpp
@@ -0,0 +1,294 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <qfile.h>
+#include <kfileitem.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <util/error.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "mmapfile.h"
+
+namespace bt
+{
+
+ MMapFile::MMapFile() : fd(-1),data(0),size(0),file_size(0),ptr(0),mode(READ)
+ {}
+
+
+ MMapFile::~MMapFile()
+ {
+ if (fd > 0)
+ close();
+ }
+
+ bool MMapFile::open(const QString & file,Mode mode)
+ {
+#if HAVE_STAT64
+ struct stat64 sb;
+ stat64(QFile::encodeName(file),&sb);
+#else
+ struct stat sb;
+ stat(QFile::encodeName(file),&sb);
+#endif
+
+ return open(file,mode,(Uint64)sb.st_size);
+ }
+
+ bool MMapFile::open(const QString & file,Mode mode,Uint64 size)
+ {
+ // close already open file
+ if (fd > 0)
+ close();
+
+ // setup flags
+ int flag = 0,mmap_flag = 0;
+ switch (mode)
+ {
+ case READ:
+ flag = O_RDONLY;
+ mmap_flag = PROT_READ;
+ break;
+ case WRITE:
+ flag = O_WRONLY | O_CREAT;
+ mmap_flag = PROT_WRITE;
+ break;
+ case RW:
+ flag = O_RDWR | O_CREAT;
+ mmap_flag = PROT_READ|PROT_WRITE;
+ break;
+ }
+
+ // Not all systems have O_LARGEFILE as an explicit flag
+ // (for instance, FreeBSD. Solaris does, but only if
+ // _LARGEFILE_SOURCE is defined in the compile).
+ // So OR it in if it is defined.
+#ifdef O_LARGEFILE
+ flag |= O_LARGEFILE;
+#endif
+
+ // open the file
+ fd = ::open(QFile::encodeName(file) , flag);//(int)flag);
+ if (fd == -1)
+ return false;
+
+ // read the file size
+ this->size = size;
+ this->mode = mode;
+
+#if HAVE_STAT64
+ struct stat64 sb;
+ stat64(QFile::encodeName(file),&sb);
+#else
+ struct stat sb;
+ stat(QFile::encodeName(file),&sb);
+#endif
+ file_size = (Uint64)sb.st_size;
+ filename = file;
+
+ // mmap the file
+#if HAVE_MMAP64
+ data = (Uint8*)mmap64(0, size, mmap_flag, MAP_SHARED, fd, 0);
+#else
+ data = (Uint8*)mmap(0, size, mmap_flag, MAP_SHARED, fd, 0);
+#endif
+ if (data == MAP_FAILED)
+ {
+ ::close(fd);
+ data = 0;
+ fd = -1;
+ ptr = 0;
+ return false;
+ }
+ ptr = 0;
+ return true;
+ }
+
+ void MMapFile::close()
+ {
+ if (fd > 0)
+ {
+#if HAVE_MUNMAP64
+ munmap64(data,size);
+#else
+ munmap(data,size);
+#endif
+ ::close(fd);
+ ptr = size = 0;
+ data = 0;
+ fd = -1;
+ filename = QString::null;
+ }
+ }
+
+ void MMapFile::flush()
+ {
+ if (fd > 0)
+ msync(data,size,MS_SYNC);
+ }
+
+ Uint32 MMapFile::write(const void* buf,Uint32 buf_size)
+ {
+ if (fd == -1 || mode == READ)
+ return 0;
+
+ // check if data fits in memory mapping
+ if (ptr + buf_size > size)
+ throw Error(i18n("Cannot write beyond end of the mmap buffer!"));
+
+ Out() << "MMapFile::write : " << (ptr + buf_size) << " " << file_size << endl;
+ // enlarge the file if necessary
+ if (ptr + buf_size > file_size)
+ {
+ growFile(ptr + buf_size);
+ }
+
+ // memcpy data
+ memcpy(&data[ptr],buf,buf_size);
+ // update ptr
+ ptr += buf_size;
+ // update file size if necessary
+ if (ptr >= size)
+ size = ptr;
+
+ return buf_size;
+ }
+
+ void MMapFile::growFile(Uint64 new_size)
+ {
+ Out() << "Growing file to " << new_size << " bytes " << endl;
+ Uint64 to_write = new_size - file_size;
+ ssize_t written;
+ // jump to the end of the file
+ lseek(fd,0,SEEK_END);
+
+ Uint8 buf[1024];
+ memset(buf,0,1024);
+ // write data until to_write is 0
+ while (to_write > 0)
+ {
+ ssize_t w = ::write(fd,buf, to_write > 1024 ? 1024 : to_write);
+ if (w > 0)
+ to_write -= w;
+ else if (w < 0)
+ break;
+ }
+ file_size = new_size;
+ }
+
+ Uint32 MMapFile::read(void* buf,Uint32 buf_size)
+ {
+ if (fd == -1 || mode == WRITE)
+ return 0;
+
+ // check if we aren't going to read past the end of the file
+ Uint32 to_read = ptr + buf_size >= size ? size - ptr : buf_size;
+ // read data
+ memcpy(buf,data+ptr,to_read);
+ ptr += to_read;
+ return to_read;
+ }
+
+ Uint64 MMapFile::seek(SeekPos from,Int64 num)
+ {
+ switch (from)
+ {
+ case BEGIN:
+ if (num > 0)
+ ptr = num;
+ if (ptr >= size)
+ ptr = size - 1;
+ break;
+ case END:
+ {
+ Int64 np = (size - 1) + num;
+ if (np < 0)
+ {
+ ptr = 0;
+ break;
+ }
+ if (np >= (Int64) size)
+ {
+ ptr = size - 1;
+ break;
+ }
+ ptr = np;
+ }
+ break;
+ case CURRENT:
+ {
+ Int64 np = ptr + num;
+ if (np < 0)
+ {
+ ptr = 0;
+ break;
+ }
+ if (np >= (Int64) size)
+ {
+ ptr = size - 1;
+ break;
+ }
+ ptr = np;
+ }
+ break;
+ }
+ return ptr;
+ }
+
+ bool MMapFile::eof() const
+ {
+ return ptr >= size;
+ }
+
+ Uint64 MMapFile::tell() const
+ {
+ return ptr;
+ }
+
+ QString MMapFile::errorString() const
+ {
+ return strerror(errno);
+ }
+
+ Uint64 MMapFile::getSize() const
+ {
+ return size;
+ }
+
+ Uint8* MMapFile::getData(Uint64 off)
+ {
+ if (off >= size)
+ return 0;
+ return &data[off];
+ }
+}
+
diff --git a/libktorrent/util/mmapfile.h b/libktorrent/util/mmapfile.h
new file mode 100644
index 0000000..ca0d782
--- /dev/null
+++ b/libktorrent/util/mmapfile.h
@@ -0,0 +1,146 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTMMAPFILE_H
+#define BTMMAPFILE_H
+
+
+#include <qstring.h>
+#include <util/constants.h>
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ * @brief Memory mapped file
+ *
+ * This class allows to access memory mapped files. It's pretty similar to
+ * File.
+ * TODO: make sure large files work (not really needed for the blocklist)
+ */
+ class MMapFile
+ {
+ public:
+ MMapFile();
+ virtual ~MMapFile();
+
+ enum Mode
+ {
+ READ,WRITE, RW
+ };
+ /**
+ * Open the file. If mode is write and the file doesn't exist, it will
+ * be created.
+ * @param file Filename
+ * @param mode Mode (READ, WRITE or RW)
+ * @return true upon succes
+ */
+ bool open(const QString & file,Mode mode);
+
+ /**
+ * Open the file. If mode is write and the file doesn't exist, it will
+ * be created.
+ * @param file Filename
+ * @param mode Mode (READ, WRITE or RW)
+ * @param size Size of the memory mapping (the file will be enlarged to this value)
+ * @return true upon succes
+ */
+ bool open(const QString & file,Mode mode,Uint64 size);
+
+ /**
+ * Close the file. Undoes the memory mapping.
+ */
+ void close();
+
+ /**
+ * Flush the file.
+ */
+ void flush();
+
+ /**
+ * Write a bunch of data.
+ * @param buf The data
+ * @param size Size of the data
+ * @return The number of bytes written
+ */
+ Uint32 write(const void* buf,Uint32 size);
+
+ /**
+ * Read a bunch of data
+ * @param buf The buffer to store the data
+ * @param size Size of the buffer
+ * @return The number of bytes read
+ */
+ Uint32 read(void* buf,Uint32 size);
+
+ enum SeekPos
+ {
+ BEGIN,
+ END,
+ CURRENT
+ };
+
+ /**
+ * Seek in the file.
+ * @param from Position to seek from
+ * @param num Number of bytes to move
+ * @return New position
+ */
+ Uint64 seek(SeekPos from,Int64 num);
+
+ /// Check to see if we are at the end of the file.
+ bool eof() const;
+
+ /// Get the current position in the file.
+ Uint64 tell() const;
+
+ /// Get the error string.
+ QString errorString() const;
+
+ /// Get the file size
+ Uint64 getSize() const;
+
+
+ /**
+ * Get a pointer to the mmapped region of data.
+ * @param off Offset into buffer, if invalid 0 will be returned
+ * @return Pointer to a location in the mmapped region
+ */
+ Uint8* getData(Uint64 off);
+
+ /// Gets the data pointer
+ void* getDataPointer() { return data; }
+ private:
+ void growFile(Uint64 new_size);
+
+ private:
+ int fd;
+ Uint8* data;
+ Uint64 size; // size of mmapping
+ Uint64 file_size; // size of file
+ Uint64 ptr;
+ QString filename;
+ Mode mode;
+ };
+
+}
+
+
+#endif
diff --git a/libktorrent/util/profiler.cpp b/libktorrent/util/profiler.cpp
new file mode 100644
index 0000000..05c53bd
--- /dev/null
+++ b/libktorrent/util/profiler.cpp
@@ -0,0 +1,138 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifdef KT_PROFILE
+#include <qfile.h>
+#include <qtextstream.h>
+#include <sys/time.h>
+#include "profiler.h"
+
+namespace bt
+{
+ Profile::Profile(Profile* parent,const QString & name) : parent(parent),name(name)
+ {
+ min = max = avg = 0.0;
+ count = 0;
+ start_time = 0.0;
+ children.setAutoDelete(true);
+ }
+
+ Profile::~Profile()
+ {
+ }
+
+ void Profile::start()
+ {
+ struct timeval tv;
+ gettimeofday(&tv,0);
+ start_time = tv.tv_sec * 1000.0 + tv.tv_usec * 0.001;
+ }
+
+ void Profile::end()
+ {
+ struct timeval tv;
+ gettimeofday(&tv,0);
+ double end_time = tv.tv_sec * 1000.0 + tv.tv_usec * 0.001;
+ double d = end_time - start_time;
+ // update stuff
+
+ if (d < min || count == 0)
+ min = d;
+ if (d > max || count == 0)
+ max = d;
+
+ avg = (avg * count + d) / (count + 1);
+ count++;
+ }
+
+ Profile* Profile::child(const QString & name)
+ {
+ QPtrList<Profile>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ Profile* p = *i;
+ if (p->name == name)
+ return p;
+ i++;
+ }
+
+ Profile* p = new Profile(this,name);
+ children.append(p);
+ return p;
+ }
+
+ void Profile::save(QTextStream & out,const QString & base)
+ {
+ QString nb = base + "/" + name;
+
+ out.precision(5);
+ out << qSetW(60) << nb << qSetW(10) << min << qSetW(10) << max << qSetW(10) << avg << qSetW(10) << count << endl;
+
+ QPtrList<Profile>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ Profile* p = *i;
+ p->save(out,nb);
+ i++;
+ }
+ }
+
+ /////////////////////
+
+ Profiler Profiler::inst;
+
+ Profiler::Profiler() : curr(0),root(0)
+ {
+ root = new Profile(0,"root");
+ curr = root;
+ }
+
+
+ Profiler::~Profiler()
+ {
+ delete root;
+ }
+
+ void Profiler::start(const QString & s)
+ {
+ curr = curr->child(s);
+ curr->start();
+ }
+
+ void Profiler::end()
+ {
+ curr->end();
+ curr = curr->getParent();
+ }
+
+ void Profiler::saveToFile(const QString & fn)
+ {
+ QFile fptr(fn);
+ if (!fptr.open(IO_WriteOnly))
+ return;
+
+ QTextStream out(&fptr);
+
+ out << qSetW(60) << "code" << qSetW(10) << "min" << qSetW(10) << "max" << qSetW(10) << "avg" << qSetW(10) << "count" << endl;
+ out << endl;
+
+ root->save(out,QString::null);
+ }
+}
+#endif
diff --git a/libktorrent/util/profiler.h b/libktorrent/util/profiler.h
new file mode 100644
index 0000000..6ab06e7
--- /dev/null
+++ b/libktorrent/util/profiler.h
@@ -0,0 +1,108 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPROFILER_H
+#define BTPROFILER_H
+
+#ifdef KT_PROFILE
+#include <qptrlist.h>
+#include <util/constants.h>
+
+class QTextStream;
+
+
+namespace bt
+{
+ /**
+ * Profile of one function or section of code.
+ */
+ class Profile
+ {
+ Profile* parent;
+ QPtrList<Profile> children;
+
+ QString name;
+ double min,max,avg;
+ Uint32 count;
+ double start_time;
+ public:
+ Profile(Profile* parent,const QString & name);
+ virtual ~Profile();
+
+ /**
+ * We just entered the function and will profile it.
+ */
+ void start();
+
+ /**
+ * We just left the function, internal variables will now be updated
+ */
+ void end();
+
+ /**
+ * Get a child, if it doesn't exist it will be created.
+ * @param name The name of the child
+ * @return The child
+ */
+ Profile* child(const QString & name);
+
+ /**
+ * Get the parent of the current profile.
+ */
+ Profile* getParent() const {return parent;}
+
+ /**
+ * Save profile information to a file.
+ * @param out Text stream to write to
+ * @param base Base path of the profiles
+ */
+ void save(QTextStream & out,const QString & base);
+ };
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Class used to profile ktorrent
+ */
+ class Profiler
+ {
+ Profile* curr;
+ Profile* root;
+
+ static Profiler inst;
+
+ Profiler();
+ public:
+ virtual ~Profiler();
+
+ void start(const QString & s);
+ void end();
+ void saveToFile(const QString & fn);
+
+ static Profiler & instance() {return inst;}
+ };
+}
+#define KT_PROF_START(S) bt::Profiler::instance().start(S)
+#define KT_PROF_END() bt::Profiler::instance().end()
+#else
+#define KT_PROF_START(S)
+#define KT_PROF_END()
+#endif
+
+#endif
diff --git a/libktorrent/util/ptrmap.cpp b/libktorrent/util/ptrmap.cpp
new file mode 100644
index 0000000..28a4340
--- /dev/null
+++ b/libktorrent/util/ptrmap.cpp
@@ -0,0 +1,24 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "ptrmap.h"
+
+
+
+
diff --git a/libktorrent/util/ptrmap.h b/libktorrent/util/ptrmap.h
new file mode 100644
index 0000000..36e1c20
--- /dev/null
+++ b/libktorrent/util/ptrmap.h
@@ -0,0 +1,181 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTPTRMAP_H
+#define BTPTRMAP_H
+
+#include <map>
+
+namespace bt
+{
+ /**
+ * @author Joris Guisson
+ * @brief Map of pointers
+ *
+ * A Map where the data is a pointer. The PtrMap has an autodeletion feature.
+ * When autodelete is on, every time we remove something from the map, the data
+ * will be deleted.
+ */
+ template <class Key,class Data>
+ class PtrMap
+ {
+ bool autodel;
+ std::map<Key,Data*> pmap;
+ public:
+ /**
+ * Constructor.
+ * @param auto_del Wether or not to enable auto deletion
+ */
+ PtrMap(bool autodel = false) : autodel(autodel)
+ {}
+
+ /**
+ * Destructor. Will delete all objects, if auto deletion is on.
+ */
+ virtual ~PtrMap()
+ {
+ clear();
+ }
+
+
+ /**
+ * Return the number of key data pairs in the map.
+ */
+ unsigned int count() const {return pmap.size();}
+
+ /**
+ * Enable or disable auto deletion.
+ * @param yes Enable if true, disable if false
+ */
+ void setAutoDelete(bool yes)
+ {
+ autodel = yes;
+ }
+
+ typedef typename std::map<Key,Data*>::iterator iterator;
+ typedef typename std::map<Key,Data*>::const_iterator const_iterator;
+
+ iterator begin() {return pmap.begin();}
+ iterator end() {return pmap.end();}
+
+ const_iterator begin() const {return pmap.begin();}
+ const_iterator end() const {return pmap.end();}
+
+ /**
+ * Remove all objects, will delete them if autodelete is on.
+ */
+ void clear()
+ {
+ if (autodel)
+ {
+ for (iterator i = pmap.begin();i != pmap.end();i++)
+ {
+ delete i->second;
+ i->second = 0;
+ }
+ }
+ pmap.clear();
+ }
+
+ /**
+ * Insert a key data pair.
+ * @param k The key
+ * @param d The data
+ * @param overwrite Wether or not to overwrite
+ * @return true if the insertion took place
+ */
+ bool insert(const Key & k,Data* d,bool overwrite = true)
+ {
+ iterator itr = pmap.find(k);
+ if (itr != pmap.end())
+ {
+ if (overwrite)
+ {
+ if (autodel)
+ delete itr->second;
+ itr->second = d;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ pmap[k] = d;
+ return true;
+ }
+ }
+
+ /**
+ * Find a key in the map and returns it's data.
+ * @param k The key
+ * @return The data of the key, 0 if the key isn't in the map
+ */
+ Data* find(const Key & k)
+ {
+ iterator i = pmap.find(k);
+ return (i == pmap.end()) ? 0 : i->second;
+ }
+
+ /**
+ * Find a key in the map and returns it's data.
+ * @param k The key
+ * @return The data of the key, 0 if the key isn't in the map
+ */
+ const Data* find(const Key & k) const
+ {
+ const_iterator i = pmap.find(k);
+ return (i == pmap.end()) ? 0 : i->second;
+ }
+
+ /**
+ * Check to see if a key is in the map.
+ * @param k The key
+ * @return true if it is part of the map
+ */
+ bool contains(const Key & k) const
+ {
+ const_iterator i = pmap.find(k);
+ return i != pmap.end();
+ }
+
+ /**
+ * Erase a key from the map. Will delete
+ * the data if autodelete is on.
+ * @param key The key
+ * @return true if an erase took place
+ */
+ bool erase(const Key & key)
+ {
+ iterator i = pmap.find(key);
+ if (i == pmap.end())
+ return false;
+
+ if (autodel)
+ delete i->second;
+ pmap.erase(i);
+ return true;
+ }
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/sha1hash.cpp b/libktorrent/util/sha1hash.cpp
new file mode 100644
index 0000000..c7b151c
--- /dev/null
+++ b/libktorrent/util/sha1hash.cpp
@@ -0,0 +1,131 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qurl.h>
+#include <string.h>
+#include <algorithm>
+#include "log.h"
+#include "sha1hash.h"
+#include "sha1hashgen.h"
+#include "urlencoder.h"
+
+#include <stdio.h>
+
+namespace bt
+{
+ SHA1Hash::SHA1Hash()
+ {
+ std::fill(hash,hash+20,'\0');
+ }
+
+ SHA1Hash::SHA1Hash(const SHA1Hash & other)
+ {
+ for (int i = 0;i < 20;i++)
+ hash[i] = other.hash[i];
+ }
+
+ SHA1Hash::SHA1Hash(const Uint8* h)
+ {
+ memcpy(hash,h,20);
+ }
+
+
+ SHA1Hash::~SHA1Hash()
+ {}
+
+ SHA1Hash & SHA1Hash::operator = (const SHA1Hash & other)
+ {
+ for (int i = 0;i < 20;i++)
+ hash[i] = other.hash[i];
+ return *this;
+ }
+
+ bool SHA1Hash::operator == (const SHA1Hash & other) const
+ {
+ for (int i = 0;i < 20;i++)
+ if (hash[i] != other.hash[i])
+ return false;
+
+ return true;
+ }
+
+ SHA1Hash SHA1Hash::generate(const Uint8* data,Uint32 len)
+ {
+ SHA1HashGen hg;
+
+ return hg.generate(data,len);
+ }
+
+ QString SHA1Hash::toString() const
+ {
+ char tmp[41];
+ QString fmt;
+ for (int i = 0;i < 20;i++)
+ fmt += "%02x";
+ tmp[40] = '\0';
+ snprintf(tmp,41,fmt.ascii(),
+ hash[0],hash[1],hash[2],hash[3],hash[4],
+ hash[5],hash[6],hash[7],hash[8],hash[9],
+ hash[10],hash[11],hash[12],hash[13],hash[14],
+ hash[15],hash[16],hash[17],hash[18],hash[19]);
+ return QString(tmp);
+ }
+
+ QByteArray SHA1Hash::toByteArray() const
+ {
+ QByteArray arr(20);
+ arr.duplicate((const char*)hash,20);
+ return arr;
+ }
+
+ QString SHA1Hash::toURLString() const
+ {
+ return URLEncoder::encode((const char*)hash,20);
+ }
+
+ Log & operator << (Log & out,const SHA1Hash & h)
+ {
+ out << h.toString();
+ return out;
+ }
+
+ SHA1Hash operator ^ (const SHA1Hash & a,const SHA1Hash & b)
+ {
+ SHA1Hash k;
+ for (int i = 0;i < 20;i++)
+ {
+ k.hash[i] = a.hash[i] ^ b.hash[i];
+ }
+ return k;
+ }
+
+ bool operator < (const SHA1Hash & a,const SHA1Hash & b)
+ {
+ for (int i = 0;i < 20;i++)
+ {
+ if (a.hash[i] < b.hash[i])
+ return true;
+ else if (a.hash[i] > b.hash[i])
+ return false;
+ }
+
+ return false;
+ }
+}
+
diff --git a/libktorrent/util/sha1hash.h b/libktorrent/util/sha1hash.h
new file mode 100644
index 0000000..a831d2d
--- /dev/null
+++ b/libktorrent/util/sha1hash.h
@@ -0,0 +1,148 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSHA1HASH_H
+#define BTSHA1HASH_H
+
+#include <qcstring.h>
+#include "constants.h"
+
+class QString;
+
+namespace bt
+{
+ class Log;
+
+ /**
+ * @author Joris Guisson
+ * @brief Stores a SHA1 hash
+ *
+ * This class keeps track of a SHA1 hash. A SHA1 hash is a 20 byte
+ * array of bytes.
+ */
+ class SHA1Hash
+ {
+ protected:
+ Uint8 hash[20];
+ public:
+ /**
+ * Constructor, sets every byte in the hash to 0.
+ */
+ SHA1Hash();
+
+ /**
+ * Copy constructor.
+ * @param other Hash to copy
+ */
+ SHA1Hash(const SHA1Hash & other);
+
+ /**
+ * Directly set the hash data.
+ * @param h The hash data must be 20 bytes large
+ */
+ SHA1Hash(const Uint8* h);
+
+ /**
+ * Destructor.
+ */
+ virtual ~SHA1Hash();
+
+ /// Get the idx'th byte of the hash.
+ Uint8 operator [] (const Uint32 idx) const {return idx < 20 ? hash[idx] : 0;}
+
+ /**
+ * Assignment operator.
+ * @param other Hash to copy
+ */
+ SHA1Hash & operator = (const SHA1Hash & other);
+
+ /**
+ * Test wether another hash is equal to this one.
+ * @param other The other hash
+ * @return true if equal, false otherwise
+ */
+ bool operator == (const SHA1Hash & other) const;
+
+ /**
+ * Test wether another hash is not equal to this one.
+ * @param other The other hash
+ * @return true if not equal, false otherwise
+ */
+ bool operator != (const SHA1Hash & other) const {return !operator ==(other);}
+
+ /**
+ * Generate an SHA1 hash from a bunch of data.
+ * @param data The data
+ * @param len Size in bytes of data
+ * @return The generated SHA1 hash
+ */
+ static SHA1Hash generate(const Uint8* data,Uint32 len);
+
+ /**
+ * Convert the hash to a printable string.
+ * @return The string
+ */
+ QString toString() const;
+
+ /**
+ * Convert the hash to a string, usable in http get requests.
+ * @return The string
+ */
+ QString toURLString() const;
+
+ /**
+ * Directly get pointer to the data.
+ * @return The data
+ */
+ const Uint8* getData() const {return hash;}
+
+ /**
+ * Function to print a SHA1Hash to the Log.
+ * @param out The Log
+ * @param h The hash
+ * @return out
+ */
+ friend Log & operator << (Log & out,const SHA1Hash & h);
+
+
+ /**
+ * XOR two SHA1Hashes
+ * @param a The first hash
+ * @param b The second
+ * @return a xor b
+ */
+ friend SHA1Hash operator ^ (const SHA1Hash & a,const SHA1Hash & b);
+
+ /**
+ * Function to compare 2 hashes
+ * @param a The first hash
+ * @param h The second hash
+ * @return wether a is smaller then b
+ */
+ friend bool operator < (const SHA1Hash & a,const SHA1Hash & b);
+
+ /**
+ * Convert the hash to a byte array.
+ */
+ QByteArray toByteArray() const;
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/sha1hashgen.cpp b/libktorrent/util/sha1hashgen.cpp
new file mode 100644
index 0000000..5c0d9f5
--- /dev/null
+++ b/libktorrent/util/sha1hashgen.cpp
@@ -0,0 +1,340 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <string.h>
+#include <arpa/inet.h>
+#include "sha1hashgen.h"
+#include "functions.h"
+
+
+
+namespace bt
+{
+ static inline Uint32 LeftRotate(Uint32 x,Uint32 n)
+ {
+ return ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)));
+ }
+
+
+
+ SHA1HashGen::SHA1HashGen() : tmp_len(0),total_len(0)
+ {
+
+ }
+
+
+ SHA1HashGen::~SHA1HashGen()
+ {}
+
+ SHA1Hash SHA1HashGen::generate(const Uint8* data,Uint32 len)
+ {
+ h0 = 0x67452301;
+ h1 = 0xEFCDAB89;
+ h2 = 0x98BADCFE;
+ h3 = 0x10325476;
+ h4 = 0xC3D2E1F0;
+
+ Uint32 num_64_byte_chunks = len / 64;
+ Uint32 left_over = len % 64;
+ // proces regular data
+ for (Uint32 i = 0;i < num_64_byte_chunks;i++)
+ {
+ processChunk(data + (64*i));
+ }
+
+ // calculate the low and high byte of the data length
+ Uint32 total[2] = {0,0};
+ total[0] += len;
+ total[0] &= 0xFFFFFFFF;
+
+ if (total[0] < len)
+ total[1]++;
+
+ Uint32 high = ( total[0] >> 29 ) | ( total[1] << 3 );
+ Uint32 low = ( total[0] << 3 );
+
+ if (left_over == 0)
+ {
+ tmp[0] = 0x80;
+ for (Uint32 i = 1;i < 56;i++)
+ tmp[i] = 0;
+
+ // put in the length as 64-bit integer (BIG-ENDIAN)
+ WriteUint32(tmp,56,high);
+ WriteUint32(tmp,60,low);
+ // process the padding
+ processChunk(tmp);
+ }
+ else if (left_over < 56)
+ {
+ Uint32 off = num_64_byte_chunks * 64;
+ // copy left over bytes in tmp
+ memcpy(tmp,data + off, left_over);
+ tmp[left_over] = 0x80;
+ for (Uint32 i = left_over + 1;i < 56;i++)
+ tmp[i] = 0;
+
+ // put in the length as 64-bit integer (BIG-ENDIAN)
+ WriteUint32(tmp,56,high);
+ WriteUint32(tmp,60,low);
+ // process the padding
+ processChunk(tmp);
+ }
+ else
+ {
+ // now we need to process 2 chunks
+ Uint32 off = num_64_byte_chunks * 64;
+ // copy left over bytes in tmp
+ memcpy(tmp,data + off, left_over);
+ tmp[left_over] = 0x80;
+ for (Uint32 i = left_over + 1;i < 64;i++)
+ tmp[i] = 0;
+
+ // process first chunk
+ processChunk(tmp);
+
+ for (Uint32 i = 0;i < 56;i++)
+ tmp[i] = 0;
+
+ // put in the length as 64-bit integer (BIG-ENDIAN)
+ WriteUint32(tmp,56,high);
+ WriteUint32(tmp,60,low);
+ // process the second chunk
+ processChunk(tmp);
+ }
+
+ // construct final message
+ Uint8 hash[20];
+ WriteUint32(hash,0,h0);
+ WriteUint32(hash,4,h1);
+ WriteUint32(hash,8,h2);
+ WriteUint32(hash,12,h3);
+ WriteUint32(hash,16,h4);
+
+ return SHA1Hash(hash);
+ }
+
+
+
+ void SHA1HashGen::processChunk(const Uint8* chunk)
+ {
+ Uint32 w[80];
+ for (int i = 0;i < 80;i++)
+ {
+ if (i < 16)
+ {
+ w[i] = ntohl(*(const Uint32*)(chunk + (4*i)));
+ /* w[i] = (chunk[4*i] << 24) |
+ (chunk[4*i + 1] << 16) |
+ (chunk[4*i + 2] << 8) |
+ chunk[4*i + 3];
+ */
+ }
+ else
+ {
+ w[i] = LeftRotate(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16],1);
+ }
+ }
+
+ Uint32 a = h0;
+ Uint32 b = h1;
+ Uint32 c = h2;
+ Uint32 d = h3;
+ Uint32 e = h4;
+
+ for (int i = 0;i < 80;i++)
+ {
+ Uint32 f,k;
+ if (i < 20)
+ {
+ f = (b & c) | ((~b) & d);
+ k = 0x5A827999;
+ }
+ else if (i < 40)
+ {
+ f = b ^ c ^ d;
+ k = 0x6ED9EBA1;
+ }
+ else if (i < 60)
+ {
+ f = (b & c) | (b & d) | (c & d);
+ k = 0x8F1BBCDC;
+ }
+ else
+ {
+ f = b ^ c ^ d;
+ k = 0xCA62C1D6;
+ }
+
+ Uint32 temp = LeftRotate(a,5) + f + e + k + w[i];
+ e = d;
+ d = c;
+ c = LeftRotate(b,30);
+ b = a;
+ a = temp;
+ }
+ h0 = (h0 + a) & 0xffffffff;
+ h1 = (h1 + b) & 0xffffffff;
+ h2 = (h2 + c) & 0xffffffff;
+ h3 = (h3 + d) & 0xffffffff;
+ h4 = (h4 + e) & 0xffffffff;
+ }
+
+
+ void SHA1HashGen::start()
+ {
+ h0 = 0x67452301;
+ h1 = 0xEFCDAB89;
+ h2 = 0x98BADCFE;
+ h3 = 0x10325476;
+ h4 = 0xC3D2E1F0;
+ tmp_len = total_len = 0;
+ memset(tmp,0,64);
+ }
+
+ void SHA1HashGen::update(const Uint8* data,Uint32 len)
+ {
+ if (tmp_len == 0)
+ {
+ Uint32 num_64_byte_chunks = len / 64;
+ Uint32 left_over = len % 64;
+ // proces data in chunks of 64 byte
+ for (Uint32 i = 0;i < num_64_byte_chunks;i++)
+ {
+ processChunk(data + (64*i));
+ }
+
+ if (left_over > 0)
+ {
+ // if there is anything left over, copy it in tmp
+ memcpy(tmp,data + (64 * num_64_byte_chunks),left_over);
+ tmp_len = left_over;
+ }
+ total_len += len;
+ }
+ else
+ {
+
+ if (tmp_len + len < 64)
+ {
+ // special case, not enough of data to fill tmp completely
+ memcpy(tmp + tmp_len,data,len);
+ tmp_len += len;
+ total_len += len;
+ }
+ else
+ {
+ // copy start of data in tmp and process it
+ Uint32 off = 64 - tmp_len;
+ memcpy(tmp + tmp_len,data, 64 - tmp_len);
+ processChunk(tmp);
+ tmp_len = 0;
+
+ Uint32 num_64_byte_chunks = (len - off) / 64;
+ Uint32 left_over = (len - off) % 64;
+
+ for (Uint32 i = 0;i < num_64_byte_chunks;i++)
+ {
+ processChunk(data + (off + (64*i)));
+ }
+
+ if (left_over > 0)
+ {
+ // if there is anything left over, copy it in tmp
+ memcpy(tmp,data + (off + 64 * num_64_byte_chunks),left_over);
+ tmp_len = left_over;
+ }
+ total_len += len;
+ }
+ }
+ }
+
+
+ void SHA1HashGen::end()
+ {
+ // calculate the low and high byte of the data length
+ Uint32 total[2] = {0,0};
+ total[0] += total_len;
+ total[0] &= 0xFFFFFFFF;
+
+ if (total[0] < total_len)
+ total[1]++;
+
+ Uint32 high = ( total[0] >> 29 ) | ( total[1] << 3 );
+ Uint32 low = ( total[0] << 3 );
+
+ if (tmp_len == 0)
+ {
+ tmp[0] = 0x80;
+ for (Uint32 i = 1;i < 56;i++)
+ tmp[i] = 0;
+
+ // put in the length as 64-bit integer (BIG-ENDIAN)
+ WriteUint32(tmp,56,high);
+ WriteUint32(tmp,60,low);
+ // process the padding
+ processChunk(tmp);
+ }
+ else if (tmp_len < 56)
+ {
+ tmp[tmp_len] = 0x80;
+ for (Uint32 i = tmp_len + 1;i < 56;i++)
+ tmp[i] = 0;
+
+ // put in the length as 64-bit integer (BIG-ENDIAN)
+ WriteUint32(tmp,56,high);
+ WriteUint32(tmp,60,low);
+ // process the padding
+ processChunk(tmp);
+ }
+ else
+ {
+ // now we need to process 2 chunks
+ tmp[tmp_len] = 0x80;
+ for (Uint32 i = tmp_len + 1;i < 56;i++)
+ tmp[i] = 0;
+
+ // process first chunk
+ processChunk(tmp);
+
+ for (Uint32 i = 0;i < 56;i++)
+ tmp[i] = 0;
+
+ // put in the length as 64-bit integer (BIG-ENDIAN)
+ WriteUint32(tmp,56,high);
+ WriteUint32(tmp,60,low);
+ // process the second chunk
+ processChunk(tmp);
+ }
+ }
+
+
+ SHA1Hash SHA1HashGen::get() const
+ {
+ // construct final message
+ Uint8 hash[20];
+ WriteUint32(hash,0,h0);
+ WriteUint32(hash,4,h1);
+ WriteUint32(hash,8,h2);
+ WriteUint32(hash,12,h3);
+ WriteUint32(hash,16,h4);
+
+ return SHA1Hash(hash);
+ }
+}
diff --git a/libktorrent/util/sha1hashgen.h b/libktorrent/util/sha1hashgen.h
new file mode 100644
index 0000000..08cc3ad
--- /dev/null
+++ b/libktorrent/util/sha1hashgen.h
@@ -0,0 +1,90 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSHA1HASHGEN_H
+#define BTSHA1HASHGEN_H
+
+#include "constants.h"
+#include "sha1hash.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson
+ *
+ * Generates a SHA1 hash, code based on wikipedia's pseudocode
+ * There are 2 ways to use this class :
+ * - generate : all data is present from the start
+ * - start, update and end : data can be delivered in chunks
+ *
+ * Mixing the 2, is not a good idea
+ */
+ class SHA1HashGen
+ {
+ Uint32 h0;
+ Uint32 h1;
+ Uint32 h2;
+ Uint32 h3;
+ Uint32 h4;
+ Uint8 tmp[64];
+ Uint32 tmp_len;
+ Uint32 total_len;
+ public:
+ SHA1HashGen();
+ ~SHA1HashGen();
+
+ /**
+ * Generate a hash from a bunch of data.
+ * @param data The data
+ * @param len The length
+ * @return The SHA1 hash
+ */
+ SHA1Hash generate(const Uint8* data,Uint32 len);
+
+ /**
+ * Start SHA1 hash generation in chunks.
+ */
+ void start();
+
+ /**
+ * Update the hash.
+ * @param data The data
+ * @param len Length of the data
+ */
+ void update(const Uint8* data,Uint32 len);
+
+
+ /**
+ * All data has been delivered, calculate the final hash.
+ * @return
+ */
+ void end();
+
+ /**
+ * Get the hash generated.
+ */
+ SHA1Hash get() const;
+ private:
+ void processChunk(const Uint8* c);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/timer.cpp b/libktorrent/util/timer.cpp
new file mode 100644
index 0000000..c06b728
--- /dev/null
+++ b/libktorrent/util/timer.cpp
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "timer.h"
+
+namespace bt
+{
+
+ Timer::Timer() : elapsed(0)
+ {
+ last = QTime::currentTime();
+ }
+
+ Timer::Timer(const Timer & t) : last(t.last),elapsed(t.elapsed)
+ {}
+
+ Timer::~Timer()
+ {}
+
+
+ void Timer::update()
+ {
+ QTime now = QTime::currentTime();
+
+ int d = last.msecsTo(now);
+ if (d < 0)
+ d = 0;
+ elapsed = d;
+ last = now;
+ }
+
+ Uint32 Timer::getElapsedSinceUpdate() const
+ {
+ QTime now = QTime::currentTime();
+ int d = last.msecsTo(now);
+ if (d < 0)
+ d = 0;
+ return d;
+ }
+
+ Timer & Timer::operator = (const Timer & t)
+ {
+ last = t.last;
+ elapsed = t.elapsed;
+ return *this;
+ }
+}
diff --git a/libktorrent/util/timer.h b/libktorrent/util/timer.h
new file mode 100644
index 0000000..3277185
--- /dev/null
+++ b/libktorrent/util/timer.h
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTTIMER_H
+#define BTTIMER_H
+
+#include <qdatetime.h>
+#include "constants.h"
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class Timer
+ {
+ QTime last;
+ Uint32 elapsed;
+ public:
+ Timer();
+ Timer(const Timer & t);
+ virtual ~Timer();
+
+ void update();
+ Uint32 getElapsed() const {return elapsed;}
+ Uint32 getElapsedSinceUpdate() const;
+ Timer & operator = (const Timer & t);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/urlencoder.cpp b/libktorrent/util/urlencoder.cpp
new file mode 100644
index 0000000..c1776de
--- /dev/null
+++ b/libktorrent/util/urlencoder.cpp
@@ -0,0 +1,92 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "urlencoder.h"
+
+
+namespace bt
+{
+ QString hex[] = {
+ "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
+ "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
+ "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
+ "%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f",
+ "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
+ "%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f",
+ "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
+ "%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f",
+ "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
+ "%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f",
+ "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
+ "%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f",
+ "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
+ "%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f",
+ "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
+ "%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f",
+ "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
+ "%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f",
+ "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
+ "%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f",
+ "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
+ "%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af",
+ "%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7",
+ "%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf",
+ "%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7",
+ "%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf",
+ "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
+ "%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df",
+ "%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7",
+ "%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
+ "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
+ "%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"
+ };
+
+
+ QString URLEncoder::encode(const char* buf,Uint32 size)
+ {
+ QString res = "";
+
+ for (Uint32 i = 0; i < size; i++)
+ {
+ Uint8 ch = buf[i];
+ if (('A' <= ch && ch <= 'Z') || ('a' <= ch && ch <= 'z') || ('0' <= ch && ch <= '9'))
+ { // 'A'..'Z'
+ res.append((char)ch);
+ }
+ else if (ch == ' ')
+ { // space
+ res.append("%20");
+ }
+ else if (ch == '-' || ch == '_' // unreserved
+ || ch == '.' || ch == '!'
+ || ch == '~' || ch == '*'
+ || ch == '\'' || ch == '('
+ || ch == ')')
+ {
+ res.append((char)ch);
+ }
+ else
+ { // other ASCII
+ res.append(hex[ch]);
+ }
+ }
+ return res;
+ }
+
+}
diff --git a/libktorrent/util/urlencoder.h b/libktorrent/util/urlencoder.h
new file mode 100644
index 0000000..edac33a
--- /dev/null
+++ b/libktorrent/util/urlencoder.h
@@ -0,0 +1,40 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTURLENCODER_H
+#define BTURLENCODER_H
+
+#include <qstring.h>
+#include "constants.h"
+
+namespace bt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class URLEncoder
+ {
+ public:
+ static QString encode(const char* buf,Uint32 size);
+ };
+
+}
+
+#endif
diff --git a/libktorrent/util/waitjob.cpp b/libktorrent/util/waitjob.cpp
new file mode 100644
index 0000000..d11fa14
--- /dev/null
+++ b/libktorrent/util/waitjob.cpp
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <torrent/globals.h>
+#include <kio/netaccess.h>
+#include "waitjob.h"
+#include "log.h"
+
+namespace bt
+{
+
+ WaitJob::WaitJob(Uint32 millis) : KIO::Job(false)
+ {
+ connect(&timer,SIGNAL(timeout()),this,SLOT(timerDone()));
+ timer.start(millis,true);
+ }
+
+
+ WaitJob::~WaitJob()
+ {}
+
+ void WaitJob::kill(bool)
+ {
+ m_error = 0;
+ emitResult();
+ }
+
+ void WaitJob::timerDone()
+ {
+ // set the error to null and emit the result
+ m_error = 0;
+ emitResult();
+ }
+
+ void WaitJob::addExitOperation(kt::ExitOperation* op)
+ {
+ exit_ops.append(op);
+ connect(op,SIGNAL(operationFinished( kt::ExitOperation* )),
+ this,SLOT(operationFinished( kt::ExitOperation* )));
+ }
+
+ void WaitJob::operationFinished(kt::ExitOperation* op)
+ {
+ if (exit_ops.count() > 0)
+ {
+ exit_ops.remove(op);
+ if (op->deleteAllowed())
+ op->deleteLater();
+
+ if (exit_ops.count() == 0)
+ timerDone();
+ }
+ }
+
+ void WaitJob::execute(WaitJob* job)
+ {
+ KIO::NetAccess::synchronousRun(job,0);
+ }
+
+ void SynchronousWait(Uint32 millis)
+ {
+ Out() << "SynchronousWait" << endl;
+ WaitJob* j = new WaitJob(millis);
+ KIO::NetAccess::synchronousRun(j,0);
+ }
+
+}
+
+#include "waitjob.moc"
+
diff --git a/libktorrent/util/waitjob.h b/libktorrent/util/waitjob.h
new file mode 100644
index 0000000..a85ba63
--- /dev/null
+++ b/libktorrent/util/waitjob.h
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTWAITJOB_H
+#define BTWAITJOB_H
+
+#include <qtimer.h>
+#include <kio/job.h>
+#include <qvaluelist.h>
+#include <interfaces/exitoperation.h>
+#include "constants.h"
+
+namespace bt
+{
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Job to wait for a certain amount of time or until one or more ExitOperation's have
+ * finished.
+ */
+ class WaitJob : public KIO::Job
+ {
+ Q_OBJECT
+ public:
+ WaitJob(Uint32 millis);
+ virtual ~WaitJob();
+
+ virtual void kill(bool quietly=true);
+
+ /**
+ * Add an ExitOperation;
+ * @param op The operation
+ */
+ void addExitOperation(kt::ExitOperation* op);
+
+
+ /**
+ * Execute a WaitJob
+ * @param job The Job
+ */
+ static void execute(WaitJob* job);
+
+ /// Are there any ExitOperation's we need to wait for
+ bool needToWait() const {return exit_ops.count() > 0;}
+
+ private slots:
+ void timerDone();
+ void operationFinished(kt::ExitOperation* op);
+
+ private:
+ QTimer timer;
+ QValueList<kt::ExitOperation*> exit_ops;
+ };
+
+ void SynchronousWait(Uint32 millis);
+
+
+
+}
+
+#endif
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
new file mode 100644
index 0000000..ad2e28c
--- /dev/null
+++ b/plugins/Makefile.am
@@ -0,0 +1,4 @@
+INCLUDES =
+METASOURCES = AUTO
+SUBDIRS = search infowidget ipfilter logviewer upnp partfileimport scheduler \
+ scanfolder rssfeed webinterface zeroconf stats
diff --git a/plugins/infowidget/GeoIP.c b/plugins/infowidget/GeoIP.c
new file mode 100644
index 0000000..f71f830
--- /dev/null
+++ b/plugins/infowidget/GeoIP.c
@@ -0,0 +1,825 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
+/* GeoIP.c
+ *
+ * Copyright (C) 2003 MaxMind LLC All Rights Reserved.
+ *
+ * This library 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 library 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 library; if not, write to the Free Software
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "GeoIP.h"
+
+#include <netdb.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifndef _WIN32
+#include <netdb.h>
+#include <netinet/in.h> /* For ntohl */
+#include <arpa/inet.h>
+#else
+#include <windows.h>
+#endif
+#include <assert.h>
+#include <sys/types.h> /* for fstat */
+#include <sys/stat.h> /* for fstat */
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h> /* For uint32_t */
+#endif
+
+#ifndef INADDR_NONE
+#define INADDR_NONE -1
+#endif
+
+#define COUNTRY_BEGIN 16776960
+#define STATE_BEGIN_REV0 16700000
+#define STATE_BEGIN_REV1 16000000
+#define STRUCTURE_INFO_MAX_SIZE 20
+#define DATABASE_INFO_MAX_SIZE 100
+#define MAX_ORG_RECORD_LENGTH 300
+#define US_OFFSET 1
+#define CANADA_OFFSET 677
+#define WORLD_OFFSET 1353
+#define FIPS_RANGE 360
+
+#define CHECK_ERR(err, msg) { \
+ if (err != Z_OK) { \
+ fprintf(stderr, "%s error: %d\n", msg, err); \
+ exit(1); \
+ } \
+}
+
+const char GeoIP_country_code[247][3] = { "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","AN","AO","AQ","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BM","BN","BO","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","FX","GA","GB","GD","GE","GF","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR","HT","HU","ID","IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","ST","SV","SY","SZ","TC","TD","TF","TG","TH","TJ","TK","TM","TN","TO","TP","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","CS","ZA","ZM","ZR","ZW","A1","A2","O1"};
+
+const char GeoIP_country_code3[247][4] = { "--","AP","EU","AND","ARE","AFG","ATG","AIA","ALB","ARM","ANT","AGO","AQ","ARG","ASM","AUT","AUS","ABW","AZE","BIH","BRB","BGD","BEL","BFA","BGR","BHR","BDI","BEN","BMU","BRN","BOL","BRA","BHS","BTN","BV","BWA","BLR","BLZ","CAN","CC","COD","CAF","COG","CHE","CIV","COK","CHL","CMR","CHN","COL","CRI","CUB","CPV","CX","CYP","CZE","DEU","DJI","DNK","DMA","DOM","DZA","ECU","EST","EGY","ESH","ERI","ESP","ETH","FIN","FJI","FLK","FSM","FRO","FRA","FX","GAB","GBR","GRD","GEO","GUF","GHA","GIB","GRL","GMB","GIN","GLP","GNQ","GRC","GS","GTM","GUM","GNB","GUY","HKG","HM","HND","HRV","HTI","HUN","IDN","IRL","ISR","IND","IO","IRQ","IRN","ISL","ITA","JAM","JOR","JPN","KEN","KGZ","KHM","KIR","COM","KNA","PRK","KOR","KWT","CYM","KAZ","LAO","LBN","LCA","LIE","LKA","LBR","LSO","LTU","LUX","LVA","LBY","MAR","MCO","MDA","MDG","MHL","MKD","MLI","MMR","MNG","MAC","MNP","MTQ","MRT","MSR","MLT","MUS","MDV","MWI","MEX","MYS","MOZ","NAM","NCL","NER","NFK","NGA","NIC","NLD","NOR","NPL","NRU","NIU","NZL","OMN","PAN","PER","PYF","PNG","PHL","PAK","POL","SPM","PCN","PRI","PSE","PRT","PLW","PRY","QAT","REU","ROU","RUS","RWA","SAU","SLB","SYC","SDN","SWE","SGP","SHN","SVN","SJM","SVK","SLE","SMR","SEN","SOM","SUR","STP","SLV","SYR","SWZ","TCA","TCD","TF","TGO","THA","TJK","TKL","TLS","TKM","TUN","TON","TUR","TTO","TUV","TWN","TZA","UKR","UGA","UM","USA","URY","UZB","VAT","VCT","VEN","VGB","VIR","VNM","VUT","WLF","WSM","YEM","YT","SCG","ZAF","ZMB","ZR","ZWE","A1","A2","O1"};
+
+const char * GeoIP_country_name[247] = {"N/A","Asia/Pacific Region","Europe","Andorra","United Arab Emirates","Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia","Netherlands Antilles","Angola","Antarctica","Argentina","American Samoa","Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina","Barbados","Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain","Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia","Brazil","Bahamas","Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada","Cocos (Keeling) Islands","Congo, The Democratic Republic of the","Central African Republic","Congo","Switzerland","Cote D'Ivoire","Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica","Cuba","Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany","Djibouti","Denmark","Dominica","Dominican Republic","Algeria","Ecuador","Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland","Fiji","Falkland Islands (Malvinas)","Micronesia, Federated States of","Faroe Islands","France","France, Metropolitan","Gabon","United Kingdom","Grenada","Georgia","French Guiana","Ghana","Gibraltar","Greenland","Gambia","Guinea","Guadeloupe","Equatorial Guinea","Greece","South Georgia and the South Sandwich Islands","Guatemala","Guam","Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands","Honduras","Croatia","Haiti","Hungary","Indonesia","Ireland","Israel","India","British Indian Ocean Territory","Iraq","Iran, Islamic Republic of","Iceland","Italy","Jamaica","Jordan","Japan","Kenya","Kyrgyzstan","Cambodia","Kiribati","Comoros","Saint Kitts and Nevis",
+"Korea, Democratic People's Republic of","Korea, Republic of","Kuwait","Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon","Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania","Luxembourg","Latvia","Libyan Arab Jamahiriya","Morocco","Monaco","Moldova, Republic of","Madagascar","Marshall Islands","Macedonia","Mali","Myanmar","Mongolia","Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat","Malta","Mauritius","Maldives","Malawi","Mexico","Malaysia","Mozambique","Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua","Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama","Peru","French Polynesia","Papua New Guinea","Philippines","Pakistan","Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","Palestinian Territory","Portugal","Palau","Paraguay","Qatar","Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia","Solomon Islands","Seychelles","Sudan","Sweden","Singapore","Saint Helena","Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino","Senegal","Somalia","Suriname","Sao Tome and Principe","El Salvador","Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad","French Southern Territories","Togo","Thailand","Tajikistan","Tokelau","Turkmenistan","Tunisia","Tonga","East Timor","Turkey","Trinidad and Tobago","Tuvalu","Taiwan","Tanzania, United Republic of","Ukraine","Uganda","United States Minor Outlying Islands","United States","Uruguay","Uzbekistan","Holy See (Vatican City State)","Saint Vincent and the Grenadines","Venezuela","Virgin Islands, British","Virgin Islands, U.S.","Vietnam","Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia and Montenegro","South Africa","Zambia","Zaire","Zimbabwe",
+"Anonymous Proxy","Satellite Provider","Other"};
+
+const char GeoIP_country_continent[247][3] = {"--","AS","EU","EU","AS","AS","SA","SA","EU","AS","SA","AF","AN","SA","OC","EU","OC","SA","AS","EU","SA","AS","EU","AF","EU","AS","AF","AF","SA","AS","SA","SA","SA","AS","AF","AF","EU","SA","NA","AS","AF","AF","AF","EU","AF","OC","SA","AF","AS","SA","SA","SA","AF","AS","AS","EU","EU","AF","EU","SA","SA","AF","SA","EU","AF","AF","AF","EU","AF","EU","OC","SA","OC","EU","EU","EU","AF","EU","SA","AS","SA","AF","EU","SA","AF","AF","SA","AF","EU","SA","SA","OC","AF","SA","AS","AF","SA","EU","SA","EU","AS","EU","AS","AS","AS","AS","AS","EU","EU","SA","AS","AS","AF","AS","AS","OC","AF","SA","AS","AS","AS","SA","AS","AS","AS","SA","EU","AS","AF","AF","EU","EU","EU","AF","AF","EU","EU","AF","OC","EU","AF","AS","AS","AS","OC","SA","AF","SA","EU","AF","AS","AF","NA","AS","AF","AF","OC","AF","OC","AF","SA","EU","EU","AS","OC","OC","OC","AS","SA","SA","OC","OC","AS","AS","EU","SA","OC","SA","AS","EU","OC","SA","AS","AF","EU","AS","AF","AS","OC","AF","AF","EU","AS","AF","EU","EU","EU","AF","EU","AF","AF","SA","AF","SA","AS","AF","SA","AF","AF","AF","AS","AS","OC","AS","AF","OC","AS","AS","SA","OC","AS","AF","EU","AF","OC","NA","SA","AS","EU","SA","SA","SA","SA","AS","OC","OC","OC","AS","AF","EU","AF","AF","AF","AF"};
+
+const char * GeoIPDBDescription[NUM_DB_TYPES] = {NULL, "GeoIP Country Edition", "GeoIP City Edition, Rev 1", "GeoIP Region Edition, Rev 1", "GeoIP ISP Edition", "GeoIP Organization Edition", "GeoIP City Edition, Rev 0", "GeoIP Region Edition, Rev 0","GeoIP Proxy Edition","GeoIP ASNum Edition","GeoIP Netspeed Edition"};
+
+char *_GeoIP_full_path_to(const char *file_name) {
+ char *path = malloc(sizeof(char) * 1024);
+
+#ifndef _WIN32
+ memset(path, 0, sizeof(char) * 1024);
+ snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", "/home/ivan/geoip.dat", file_name);
+#else
+ char buf[MAX_PATH], *p, *q = NULL;
+ int len;
+ memset(buf, 0, sizeof(buf));
+ len = GetModuleFileName(GetModuleHandle(NULL), buf, sizeof(buf) - 1);
+ for (p = buf + len; p > buf; p--)
+ if (*p == '\\')
+ {
+ if (!q)
+ q = p;
+ else
+ *p = '/';
+ }
+ *q = 0;
+ memset(path, 0, sizeof(char) * 1024);
+ snprintf(path, sizeof(char) * 1024 - 1, "%s/%s", buf, file_name);
+#endif
+
+ return path;
+}
+
+char ** GeoIPDBFileName = NULL;
+
+void _GeoIP_setup_dbfilename() {
+ if (NULL == GeoIPDBFileName) {
+ GeoIPDBFileName = malloc(sizeof(char *) * NUM_DB_TYPES);
+ memset(GeoIPDBFileName, 0, sizeof(char *) * NUM_DB_TYPES);
+
+ GeoIPDBFileName[GEOIP_COUNTRY_EDITION] = _GeoIP_full_path_to("GeoIP.dat");
+ GeoIPDBFileName[GEOIP_REGION_EDITION_REV0] = _GeoIP_full_path_to("GeoIPRegion.dat");
+ GeoIPDBFileName[GEOIP_REGION_EDITION_REV1] = _GeoIP_full_path_to("GeoIPRegion.dat");
+ GeoIPDBFileName[GEOIP_CITY_EDITION_REV0] = _GeoIP_full_path_to("GeoIPCity.dat");
+ GeoIPDBFileName[GEOIP_CITY_EDITION_REV1] = _GeoIP_full_path_to("GeoIPCity.dat");
+ GeoIPDBFileName[GEOIP_ISP_EDITION] = _GeoIP_full_path_to("GeoIPISP.dat");
+ GeoIPDBFileName[GEOIP_ORG_EDITION] = _GeoIP_full_path_to("GeoIPOrg.dat");
+ GeoIPDBFileName[GEOIP_PROXY_EDITION] = _GeoIP_full_path_to("GeoIPProxy.dat");
+ GeoIPDBFileName[GEOIP_ASNUM_EDITION] = _GeoIP_full_path_to("GeoIPASNum.dat");
+ GeoIPDBFileName[GEOIP_NETSPEED_EDITION] = _GeoIP_full_path_to("GeoIPNetSpeed.dat");
+ }
+}
+
+static
+int _file_exists(const char *file_name) {
+ struct stat file_stat;
+ return( (stat(file_name, &file_stat) == 0) ? 1:0);
+}
+
+int GeoIP_db_avail(int type) {
+ const char * filePath;
+ if (type < 0 || type >= NUM_DB_TYPES) {
+ return 0;
+ }
+ filePath = GeoIPDBFileName[type];
+ if (NULL == filePath) {
+ return 0;
+ }
+ return _file_exists(filePath);
+}
+
+static
+void _setup_segments(GeoIP * gi) {
+ int i, j;
+ unsigned char delim[3];
+ unsigned char buf[SEGMENT_RECORD_LENGTH];
+
+ /* default to GeoIP Country Edition */
+ gi->databaseType = GEOIP_COUNTRY_EDITION;
+ gi->record_length = STANDARD_RECORD_LENGTH;
+ fseek(gi->GeoIPDatabase, -3l, SEEK_END);
+ for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++) {
+ fread(delim, 1, 3, gi->GeoIPDatabase);
+ if (delim[0] == 255 && delim[1] == 255 && delim[2] == 255) {
+ fread(&gi->databaseType, 1, 1, gi->GeoIPDatabase);
+ if (gi->databaseType >= 106) {
+ /* backwards compatibility with databases from April 2003 and earlier */
+ gi->databaseType -= 105;
+ }
+
+ if (gi->databaseType == GEOIP_REGION_EDITION_REV0) {
+ /* Region Edition, pre June 2003 */
+ gi->databaseSegments = malloc(sizeof(int));
+ gi->databaseSegments[0] = STATE_BEGIN_REV0;
+ } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) {
+ /* Region Edition, post June 2003 */
+ gi->databaseSegments = malloc(sizeof(int));
+ gi->databaseSegments[0] = STATE_BEGIN_REV1;
+ } else if (gi->databaseType == GEOIP_CITY_EDITION_REV0 ||
+ gi->databaseType == GEOIP_CITY_EDITION_REV1 ||
+ gi->databaseType == GEOIP_ORG_EDITION ||
+ gi->databaseType == GEOIP_ISP_EDITION ||
+ gi->databaseType == GEOIP_ASNUM_EDITION) {
+ /* City/Org Editions have two segments, read offset of second segment */
+ gi->databaseSegments = malloc(sizeof(int));
+ gi->databaseSegments[0] = 0;
+ fread(buf, SEGMENT_RECORD_LENGTH, 1, gi->GeoIPDatabase);
+ for (j = 0; j < SEGMENT_RECORD_LENGTH; j++) {
+ gi->databaseSegments[0] += (buf[j] << (j * 8));
+ }
+ if (gi->databaseType == GEOIP_ORG_EDITION ||
+ gi->databaseType == GEOIP_ISP_EDITION)
+ gi->record_length = ORG_RECORD_LENGTH;
+ }
+ break;
+ } else {
+ fseek(gi->GeoIPDatabase, -4l, SEEK_CUR);
+ }
+ }
+ if (gi->databaseType == GEOIP_COUNTRY_EDITION ||
+ gi->databaseType == GEOIP_PROXY_EDITION ||
+ gi->databaseType == GEOIP_NETSPEED_EDITION) {
+ gi->databaseSegments = malloc(sizeof(int));
+ gi->databaseSegments[0] = COUNTRY_BEGIN;
+ }
+}
+
+static
+int _check_mtime(GeoIP *gi) {
+ struct stat buf;
+
+ if (gi->flags & GEOIP_CHECK_CACHE) {
+ if (fstat(fileno(gi->GeoIPDatabase), &buf) != -1) {
+ if (buf.st_mtime > gi->mtime) {
+ /* GeoIP Database file updated */
+ if (gi->flags & GEOIP_MEMORY_CACHE) {
+ /* reload database into memory cache */
+ if (realloc(gi->cache, buf.st_size) != NULL) {
+ if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) {
+ fprintf(stderr,"Error reading file %s\n",gi->file_path);
+ return -1;
+ }
+ gi->mtime = buf.st_mtime;
+ }
+ } else {
+ /* refresh filehandle */
+ fclose(gi->GeoIPDatabase);
+ if (gi->databaseSegments != NULL)
+ free(gi->databaseSegments);
+ gi->GeoIPDatabase = fopen(gi->file_path,"rb");
+ if (gi->GeoIPDatabase == NULL) {
+ fprintf(stderr,"Error Opening file %s\n",gi->file_path);
+ return -1;
+ }
+ _setup_segments(gi);
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+unsigned int _GeoIP_seek_record (GeoIP *gi, unsigned long ipnum) {
+ int depth;
+ unsigned int x;
+ unsigned char stack_buffer[2 * MAX_RECORD_LENGTH];
+ const unsigned char *buf = (gi->cache == NULL) ? stack_buffer : NULL;
+ unsigned int offset = 0;
+
+ const unsigned char * p;
+ int j;
+
+ _check_mtime(gi);
+ for (depth = 31; depth >= 0; depth--) {
+ if (gi->cache == NULL && gi->index_cache == NULL) {
+ /* read from disk */
+ fseek(gi->GeoIPDatabase, (long)gi->record_length * 2 * offset, SEEK_SET);
+ fread(stack_buffer,gi->record_length,2,gi->GeoIPDatabase);
+ } else if (gi->index_cache == NULL) {
+ /* simply point to record in memory */
+ buf = gi->cache + (long)gi->record_length * 2 *offset;
+ } else {
+ buf = gi->index_cache + (long)gi->record_length * 2 * offset;
+ }
+
+ if (ipnum & (1 << depth)) {
+ /* Take the right-hand branch */
+ if ( gi->record_length == 3 ) {
+ /* Most common case is completely unrolled and uses constants. */
+ x = (buf[3*1 + 0] << (0*8))
+ + (buf[3*1 + 1] << (1*8))
+ + (buf[3*1 + 2] << (2*8));
+
+ } else {
+ /* General case */
+ j = gi->record_length;
+ p = &buf[2*j];
+ x = 0;
+ do {
+ x <<= 8;
+ x += *(--p);
+ } while ( --j );
+ }
+
+ } else {
+ /* Take the left-hand branch */
+ if ( gi->record_length == 3 ) {
+ /* Most common case is completely unrolled and uses constants. */
+ x = (buf[3*0 + 0] << (0*8))
+ + (buf[3*0 + 1] << (1*8))
+ + (buf[3*0 + 2] << (2*8));
+ } else {
+ /* General case */
+ j = gi->record_length;
+ p = &buf[1*j];
+ x = 0;
+ do {
+ x <<= 8;
+ x += *(--p);
+ } while ( --j );
+ }
+ }
+
+ if (x >= gi->databaseSegments[0]) {
+ return x;
+ }
+ offset = x;
+ }
+
+ /* shouldn't reach here */
+ fprintf(stderr,"Error Traversing Database for ipnum = %lu - Perhaps database is corrupt?\n",ipnum);
+ return 0;
+}
+
+unsigned long _GeoIP_addr_to_num (const char *addr) {
+ int i;
+ char tok[4];
+ int octet;
+ int j = 0, k = 0;
+ unsigned long ipnum = 0;
+ char c = 0;
+
+ for (i=0; i<4; i++) {
+ for (;;) {
+ c = addr[k++];
+ if (c == '.' || c == '\0') {
+ tok[j] = '\0';
+ octet = atoi(tok);
+ if (octet > 255)
+ return 0;
+ ipnum += (octet << ((3-i)*8));
+ j = 0;
+ break;
+ } else if (c >= '0' && c<= '9') {
+ if (j > 2) {
+ return 0;
+ }
+ tok[j++] = c;
+ } else {
+ return 0;
+ }
+ }
+ if(c == '\0' && i<3) {
+ return 0;
+ }
+ }
+ return ipnum;
+}
+
+GeoIP* GeoIP_open_type (int type, int flags) {
+ GeoIP * gi;
+ const char * filePath;
+ if (type < 0 || type >= NUM_DB_TYPES) {
+ printf("Invalid database type %d\n", type);
+ return NULL;
+ }
+ _GeoIP_setup_dbfilename();
+ filePath = GeoIPDBFileName[type];
+ if (filePath == NULL) {
+ printf("Invalid database type %d\n", type);
+ return NULL;
+ }
+ gi = GeoIP_open (filePath, flags);
+ return gi;
+}
+
+GeoIP* GeoIP_new (int flags) {
+ GeoIP * gi;
+ _GeoIP_setup_dbfilename();
+ gi = GeoIP_open (GeoIPDBFileName[GEOIP_COUNTRY_EDITION], flags);
+ return gi;
+}
+
+GeoIP* GeoIP_open (const char * filename, int flags) {
+ struct stat buf;
+#ifdef _WIN32
+ WSADATA wsa;
+ if (WSAStartup(MAKEWORD(1, 1), &wsa) != 0)
+ return NULL;
+#endif
+
+ GeoIP *gi = (GeoIP *)malloc(sizeof(GeoIP));
+ if (gi == NULL)
+ return NULL;
+ gi->file_path = malloc(sizeof(char) * (strlen(filename)+1));
+ if (gi->file_path == NULL)
+ return NULL;
+ strcpy(gi->file_path, filename);
+ gi->GeoIPDatabase = fopen(filename,"rb");
+ if (gi->GeoIPDatabase == NULL) {
+ fprintf(stderr,"Error Opening file %s\n",filename);
+ free(gi->file_path);
+ free(gi);
+ return NULL;
+ } else {
+ if (flags & GEOIP_MEMORY_CACHE) {
+ if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) {
+ fprintf(stderr,"Error stating file %s\n",filename);
+ free(gi);
+ return NULL;
+ }
+ gi->mtime = buf.st_mtime;
+ gi->cache = (unsigned char *) malloc(sizeof(unsigned char) * buf.st_size);
+ if (gi->cache != NULL) {
+ if (fread(gi->cache, sizeof(unsigned char), buf.st_size, gi->GeoIPDatabase) != (size_t) buf.st_size) {
+ fprintf(stderr,"Error reading file %s\n",filename);
+ free(gi->cache);
+ free(gi);
+ return NULL;
+ }
+ }
+ } else {
+ if (flags & GEOIP_CHECK_CACHE) {
+ if (fstat(fileno(gi->GeoIPDatabase), &buf) == -1) {
+ fprintf(stderr,"Error stating file %s\n",filename);
+ free(gi);
+ return NULL;
+ }
+ gi->mtime = buf.st_mtime;
+ }
+ gi->cache = NULL;
+ }
+ gi->flags = flags;
+ _setup_segments(gi);
+ if (flags & GEOIP_INDEX_CACHE) {
+ gi->index_cache = (unsigned char *) malloc(sizeof(unsigned char) * ((gi->databaseSegments[0] * (long)gi->record_length * 2)));
+ if (gi->index_cache != NULL) {
+ fseek(gi->GeoIPDatabase, 0, SEEK_SET);
+ if (fread(gi->index_cache, sizeof(unsigned char), gi->databaseSegments[0] * (long)gi->record_length * 2, gi->GeoIPDatabase) != (size_t) (gi->databaseSegments[0]*(long)gi->record_length * 2)) {
+ fprintf(stderr,"Error reading file %s\n",filename);
+ free(gi->index_cache);
+ free(gi);
+ return NULL;
+ }
+ }
+ } else {
+ gi->index_cache = NULL;
+ }
+ return gi;
+ }
+}
+
+void GeoIP_delete (GeoIP *gi) {
+ if (gi->GeoIPDatabase != NULL)
+ fclose(gi->GeoIPDatabase);
+ if (gi->cache != NULL)
+ free(gi->cache);
+ if (gi->index_cache != NULL)
+ free(gi->index_cache);
+ if (gi->file_path != NULL)
+ free(gi->file_path);
+ if (gi->databaseSegments != NULL)
+ free(gi->databaseSegments);
+ free(gi);
+}
+
+const char *GeoIP_country_code_by_name (GeoIP* gi, const char *name) {
+ int country_id;
+ country_id = GeoIP_id_by_name(gi, name);
+ return (country_id > 0) ? GeoIP_country_code[country_id] : NULL;
+}
+
+const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *name) {
+ int country_id;
+ country_id = GeoIP_id_by_name(gi, name);
+ return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL;
+}
+
+const char *GeoIP_country_name_by_name (GeoIP* gi, const char *name) {
+ int country_id;
+ country_id = GeoIP_id_by_name(gi, name);
+ return (country_id > 0) ? GeoIP_country_name[country_id] : NULL;
+}
+
+unsigned long _GeoIP_lookupaddress (const char *host) {
+ unsigned long addr = inet_addr(host);
+ struct hostent phe2;
+ struct hostent * phe = &phe2;
+ char *buf = NULL;
+ int buflength = 16384;
+ int herr = 0;
+ int result = 0;
+#ifdef HAVE_GETHOSTBYNAME_R
+ buf = malloc(buflength);
+#endif
+ if (addr == INADDR_NONE) {
+#ifdef HAVE_GETHOSTBYNAME_R
+ while (1) {
+ /* we use gethostbyname_r here because it is thread-safe and gethostbyname is not */
+#ifdef GETHOSTBYNAME_R_RETURNS_INT
+ result = gethostbyname_r(host,&phe2,buf,buflength,&phe,&herr);
+#else
+ phe = gethostbyname_r(host,&phe2,buf,buflength,&herr);
+#endif
+ if (herr != ERANGE)
+ break;
+ if (result == 0)
+ break;
+ /* double the buffer if the buffer is too small */
+ buflength = buflength * 2;
+ buf = realloc(buf,buflength);
+ }
+#endif
+#ifndef HAVE_GETHOSTBYNAME_R
+ /* Some systems do not support gethostbyname_r, such as Mac OS X */
+ phe = gethostbyname(host);
+#endif
+ if (!phe || result != 0) {
+ free(buf);
+ return 0;
+ }
+ addr = *((unsigned long *) phe->h_addr_list[0]);
+ }
+#ifdef HAVE_GETHOSTBYNAME_R
+ free(buf);
+#endif
+ return ntohl(addr);
+}
+
+int GeoIP_id_by_name (GeoIP* gi, const char *name) {
+ unsigned long ipnum;
+ int ret;
+ if (name == NULL) {
+ return 0;
+ }
+ if (gi->databaseType != GEOIP_COUNTRY_EDITION && gi->databaseType != GEOIP_PROXY_EDITION && gi->databaseType != GEOIP_NETSPEED_EDITION) {
+ printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_COUNTRY_EDITION]);
+ return 0;
+ }
+ if (!(ipnum = _GeoIP_lookupaddress(name)))
+ return 0;
+ ret = _GeoIP_seek_record(gi, ipnum) - COUNTRY_BEGIN;
+ return ret;
+
+}
+
+const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr) {
+ int country_id;
+ country_id = GeoIP_id_by_addr(gi, addr);
+ return (country_id > 0) ? GeoIP_country_code[country_id] : NULL;
+}
+
+const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr) {
+ int country_id;
+ country_id = GeoIP_id_by_addr(gi, addr);
+ return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL;
+ return GeoIP_country_code3[country_id];
+}
+
+const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr) {
+ int country_id;
+ country_id = GeoIP_id_by_addr(gi, addr);
+ return (country_id > 0) ? GeoIP_country_name[country_id] : NULL;
+ return GeoIP_country_name[country_id];
+}
+
+const char *GeoIP_country_name_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ int country_id;
+ country_id = GeoIP_id_by_ipnum(gi, ipnum);
+ return (country_id > 0) ? GeoIP_country_name[country_id] : NULL;
+}
+
+const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ int country_id;
+ country_id = GeoIP_id_by_ipnum(gi, ipnum);
+ return (country_id > 0) ? GeoIP_country_code[country_id] : NULL;
+}
+
+const char *GeoIP_country_code3_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ int country_id;
+ country_id = GeoIP_id_by_ipnum(gi, ipnum);
+ return (country_id > 0) ? GeoIP_country_code3[country_id] : NULL;
+}
+
+int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr) {
+ return GeoIP_id_by_addr(gi, addr);
+}
+
+int GeoIP_country_id_by_name (GeoIP* gi, const char *host) {
+ return GeoIP_id_by_name(gi, host);
+}
+
+int GeoIP_id_by_addr (GeoIP* gi, const char *addr) {
+ unsigned long ipnum;
+ int ret;
+ if (addr == NULL) {
+ return 0;
+ }
+ if (gi->databaseType != GEOIP_COUNTRY_EDITION &&
+ gi->databaseType != GEOIP_PROXY_EDITION &&
+ gi->databaseType != GEOIP_NETSPEED_EDITION) {
+ printf("Invalid database type %s, expected %s\n",
+ GeoIPDBDescription[(int)gi->databaseType],
+ GeoIPDBDescription[GEOIP_COUNTRY_EDITION]);
+ return 0;
+ }
+ ipnum = _GeoIP_addr_to_num(addr);
+ ret = _GeoIP_seek_record(gi, ipnum) - COUNTRY_BEGIN;
+ return ret;
+}
+
+int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ int ret;
+ if (ipnum == 0) {
+ return 0;
+ }
+ if (gi->databaseType != GEOIP_COUNTRY_EDITION &&
+ gi->databaseType != GEOIP_PROXY_EDITION &&
+ gi->databaseType != GEOIP_NETSPEED_EDITION) {
+ printf("Invalid database type %s, expected %s\n",
+ GeoIPDBDescription[(int)gi->databaseType],
+ GeoIPDBDescription[GEOIP_COUNTRY_EDITION]);
+ return 0;
+ }
+ ret = _GeoIP_seek_record(gi, ipnum) - COUNTRY_BEGIN;
+ return ret;
+}
+
+char *GeoIP_database_info (GeoIP* gi) {
+ int i;
+ unsigned char buf[3];
+ char *retval;
+ int hasStructureInfo = 0;
+
+ if(gi == NULL)
+ return NULL;
+
+ _check_mtime(gi);
+ fseek(gi->GeoIPDatabase, -3l, SEEK_END);
+
+ /* first get past the database structure information */
+ for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++) {
+ fread(buf, 1, 3, gi->GeoIPDatabase);
+ if (buf[0] == 255 && buf[1] == 255 && buf[2] == 255) {
+ hasStructureInfo = 1;
+ break;
+ }
+ fseek(gi->GeoIPDatabase, -4l, SEEK_CUR);
+ }
+ if (hasStructureInfo == 1) {
+ fseek(gi->GeoIPDatabase, -3l, SEEK_CUR);
+ } else {
+ /* no structure info, must be pre Sep 2002 database, go back to end */
+ fseek(gi->GeoIPDatabase, -3l, SEEK_END);
+ }
+
+ for (i = 0; i < DATABASE_INFO_MAX_SIZE; i++) {
+ fread(buf, 1, 3, gi->GeoIPDatabase);
+ if (buf[0] == 0 && buf[1] == 0 && buf[2] == 0) {
+ retval = malloc(sizeof(char) * (i+1));
+ if (retval == NULL) {
+ return NULL;
+ }
+ fread(retval, 1, i, gi->GeoIPDatabase);
+ retval[i] = '\0';
+ return retval;
+ }
+ fseek(gi->GeoIPDatabase, -4l, SEEK_CUR);
+ }
+ return NULL;
+}
+
+/* GeoIP Region Edition functions */
+
+void GeoIP_assign_region_by_inetaddr(GeoIP* gi, unsigned long inetaddr, GeoIPRegion *region) {
+ unsigned int seek_region;
+
+ /* This also writes in the terminating NULs (if you decide to
+ * keep them) and clear any fields that are not set. */
+ memset(region, 0, sizeof(GeoIPRegion));
+
+ seek_region = _GeoIP_seek_record(gi, ntohl(inetaddr));
+
+ if (gi->databaseType == GEOIP_REGION_EDITION_REV0) {
+ /* Region Edition, pre June 2003 */
+ seek_region -= STATE_BEGIN_REV0;
+ if (seek_region >= 1000) {
+ region->country_code[0] = 'U';
+ region->country_code[1] = 'S';
+ region->region[0] = (char) ((seek_region - 1000)/26 + 65);
+ region->region[1] = (char) ((seek_region - 1000)%26 + 65);
+ } else {
+ memcpy(region->country_code, GeoIP_country_code[seek_region], 2);
+ }
+ } else if (gi->databaseType == GEOIP_REGION_EDITION_REV1) {
+ /* Region Edition, post June 2003 */
+ seek_region -= STATE_BEGIN_REV1;
+ if (seek_region < US_OFFSET) {
+ /* Unknown */
+ /* we don't need to do anything here b/c we memset region to 0 */
+ } else if (seek_region < CANADA_OFFSET) {
+ /* USA State */
+ region->country_code[0] = 'U';
+ region->country_code[1] = 'S';
+ region->region[0] = (char) ((seek_region - US_OFFSET)/26 + 65);
+ region->region[1] = (char) ((seek_region - US_OFFSET)%26 + 65);
+ } else if (seek_region < WORLD_OFFSET) {
+ /* Canada Province */
+ region->country_code[0] = 'C';
+ region->country_code[1] = 'A';
+ region->region[0] = (char) ((seek_region - CANADA_OFFSET)/26 + 65);
+ region->region[1] = (char) ((seek_region - CANADA_OFFSET)%26 + 65);
+ } else {
+ /* Not US or Canada */
+ memcpy(region->country_code, GeoIP_country_code[(seek_region - WORLD_OFFSET) / FIPS_RANGE], 2);
+ }
+ }
+}
+
+static
+GeoIPRegion * _get_region(GeoIP* gi, unsigned long ipnum) {
+ GeoIPRegion * region;
+
+ region = malloc(sizeof(GeoIPRegion));
+ if (region) {
+ GeoIP_assign_region_by_inetaddr(gi, htonl(ipnum), region);
+ }
+ return region;
+}
+
+GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr) {
+ unsigned long ipnum;
+ if (addr == NULL) {
+ return 0;
+ }
+ if (gi->databaseType != GEOIP_REGION_EDITION_REV0 &&
+ gi->databaseType != GEOIP_REGION_EDITION_REV1) {
+ printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]);
+ return 0;
+ }
+ ipnum = _GeoIP_addr_to_num(addr);
+ return _get_region(gi, ipnum);
+}
+
+GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *name) {
+ unsigned long ipnum;
+ if (name == NULL) {
+ return 0;
+ }
+ if (gi->databaseType != GEOIP_REGION_EDITION_REV0 &&
+ gi->databaseType != GEOIP_REGION_EDITION_REV1) {
+ printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]);
+ return 0;
+ }
+ if (!(ipnum = _GeoIP_lookupaddress(name)))
+ return 0;
+ return _get_region(gi, ipnum);
+}
+
+GeoIPRegion * GeoIP_region_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ if (gi->databaseType != GEOIP_REGION_EDITION_REV0 &&
+ gi->databaseType != GEOIP_REGION_EDITION_REV1) {
+ printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_REGION_EDITION_REV1]);
+ return 0;
+ }
+ return _get_region(gi, ipnum);
+}
+
+void GeoIPRegion_delete (GeoIPRegion *gir) {
+ free(gir);
+}
+
+/* GeoIP Organization, ISP and AS Number Edition private method */
+static
+char *_get_name (GeoIP* gi, unsigned long ipnum) {
+ int seek_org;
+ char buf[MAX_ORG_RECORD_LENGTH];
+ char * org_buf, * buf_pointer;
+ int record_pointer;
+
+ if (gi->databaseType != GEOIP_ORG_EDITION &&
+ gi->databaseType != GEOIP_ISP_EDITION &&
+ gi->databaseType != GEOIP_ASNUM_EDITION) {
+ printf("Invalid database type %s, expected %s\n", GeoIPDBDescription[(int)gi->databaseType], GeoIPDBDescription[GEOIP_ORG_EDITION]);
+ return 0;
+ }
+
+ seek_org = _GeoIP_seek_record(gi, ipnum);
+ if (seek_org == gi->databaseSegments[0])
+ return NULL;
+
+ record_pointer = seek_org + (2 * gi->record_length - 1) * gi->databaseSegments[0];
+
+ if (gi->cache == NULL) {
+ fseek(gi->GeoIPDatabase, record_pointer, SEEK_SET);
+ fread(buf, sizeof(char), MAX_ORG_RECORD_LENGTH, gi->GeoIPDatabase);
+ org_buf = malloc(sizeof(char) * (strlen(buf)+1));
+ strcpy(org_buf, buf);
+ } else {
+ buf_pointer = gi->cache + (long)record_pointer;
+ org_buf = malloc(sizeof(char) * (strlen(buf_pointer)+1));
+ strcpy(org_buf, buf_pointer);
+ }
+ return org_buf;
+}
+
+char *GeoIP_name_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ return _get_name(gi,ipnum);
+}
+
+char *GeoIP_name_by_addr (GeoIP* gi, const char *addr) {
+ unsigned long ipnum;
+ if (addr == NULL) {
+ return 0;
+ }
+ ipnum = _GeoIP_addr_to_num(addr);
+ return _get_name(gi, ipnum);
+}
+
+char *GeoIP_name_by_name (GeoIP* gi, const char *name) {
+ unsigned long ipnum;
+ if (name == NULL) {
+ return 0;
+ }
+ if (!(ipnum = _GeoIP_lookupaddress(name)))
+ return 0;
+ return _get_name(gi, ipnum);
+}
+
+char *GeoIP_org_by_ipnum (GeoIP* gi, unsigned long ipnum) {
+ return GeoIP_name_by_ipnum(gi, ipnum);
+}
+
+char *GeoIP_org_by_addr (GeoIP* gi, const char *addr) {
+ return GeoIP_name_by_addr(gi, addr);
+}
+
+char *GeoIP_org_by_name (GeoIP* gi, const char *name) {
+ return GeoIP_name_by_name(gi, name);
+}
+
+unsigned char GeoIP_database_edition (GeoIP* gi) {
+ return gi->databaseType;
+}
diff --git a/plugins/infowidget/GeoIP.h b/plugins/infowidget/GeoIP.h
new file mode 100644
index 0000000..1403e4d
--- /dev/null
+++ b/plugins/infowidget/GeoIP.h
@@ -0,0 +1,161 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 2 -*- */
+/* GeoIP.h
+ *
+ * Copyright (C) 2003 MaxMind LLC
+ *
+ * This library 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.1 of the License, or (at your option) any later version.
+ *
+ * This library 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 library; if not, write to the Free Software
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GEOIP_H
+#define GEOIP_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include<stdio.h>
+#include<stdlib.h>
+#include<string.h>
+#include <sys/types.h> /* for fstat */
+#include <sys/stat.h> /* for fstat */
+
+#define SEGMENT_RECORD_LENGTH 3
+#define STANDARD_RECORD_LENGTH 3
+#define ORG_RECORD_LENGTH 4
+#define MAX_RECORD_LENGTH 4
+#define NUM_DB_TYPES 16
+
+typedef struct GeoIPTag {
+ FILE *GeoIPDatabase;
+ char *file_path;
+ unsigned char *cache;
+ unsigned char *index_cache;
+ unsigned int *databaseSegments;
+ char databaseType;
+ time_t mtime;
+ int flags;
+ char record_length;
+ int record_iter; /* used in GeoIP_next_record */
+} GeoIP;
+
+typedef struct GeoIPRegionTag {
+ char country_code[3];
+ char region[3];
+} GeoIPRegion;
+
+typedef enum {
+ GEOIP_STANDARD = 0,
+ GEOIP_MEMORY_CACHE = 1,
+ GEOIP_CHECK_CACHE = 2,
+ GEOIP_INDEX_CACHE = 4
+} GeoIPOptions;
+
+typedef enum {
+ GEOIP_COUNTRY_EDITION = 1,
+ GEOIP_REGION_EDITION_REV0 = 7,
+ GEOIP_CITY_EDITION_REV0 = 6,
+ GEOIP_ORG_EDITION = 5,
+ GEOIP_ISP_EDITION = 4,
+ GEOIP_CITY_EDITION_REV1 = 2,
+ GEOIP_REGION_EDITION_REV1 = 3,
+ GEOIP_PROXY_EDITION = 8,
+ GEOIP_ASNUM_EDITION = 9,
+ GEOIP_NETSPEED_EDITION = 10
+} GeoIPDBTypes;
+
+typedef enum {
+ GEOIP_ANON_PROXY = 1,
+ GEOIP_HTTP_X_FORWARDED_FOR_PROXY = 2,
+ GEOIP_HTTP_CLIENT_IP_PROXY = 3
+} GeoIPProxyTypes;
+
+typedef enum {
+ GEOIP_UNKNOWN_SPEED = 0,
+ GEOIP_DIALUP_SPEED = 1,
+ GEOIP_CABLEDSL_SPEED = 2,
+ GEOIP_CORPORATE_SPEED = 3
+} GeoIPNetspeedValues;
+
+extern char **GeoIPDBFileName;
+extern const char * GeoIPDBDescription[NUM_DB_TYPES];
+extern const char *GeoIPCountryDBFileName;
+extern const char *GeoIPRegionDBFileName;
+extern const char *GeoIPCityDBFileName;
+extern const char *GeoIPOrgDBFileName;
+extern const char *GeoIPISPDBFileName;
+
+extern const char GeoIP_country_code[247][3];
+extern const char GeoIP_country_code3[247][4];
+extern const char * GeoIP_country_name[247];
+extern const char GeoIP_country_continent[247][3];
+
+#ifdef DLL
+#define GEOIP_API __declspec(dllexport)
+#else
+#define GEOIP_API
+#endif /* DLL */
+
+GEOIP_API GeoIP* GeoIP_open_type (int type, int flags);
+GEOIP_API GeoIP* GeoIP_new(int flags);
+GEOIP_API GeoIP* GeoIP_open(const char * filename, int flags);
+GEOIP_API int GeoIP_db_avail(int type);
+GEOIP_API void GeoIP_delete(GeoIP* gi);
+GEOIP_API const char *GeoIP_country_code_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API const char *GeoIP_country_code_by_name (GeoIP* gi, const char *host);
+GEOIP_API const char *GeoIP_country_code3_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API const char *GeoIP_country_code3_by_name (GeoIP* gi, const char *host);
+GEOIP_API const char *GeoIP_country_name_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API const char *GeoIP_country_name_by_name (GeoIP* gi, const char *host);
+GEOIP_API const char *GeoIP_country_name_by_ipnum (GeoIP* gi, unsigned long ipnum);
+GEOIP_API const char *GeoIP_country_code_by_ipnum (GeoIP* gi, unsigned long ipnum);
+GEOIP_API const char *GeoIP_country_code3_by_ipnum (GeoIP* gi, unsigned long ipnum);
+
+/* Deprecated - for backwards compatibility only */
+GEOIP_API int GeoIP_country_id_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API int GeoIP_country_id_by_name (GeoIP* gi, const char *host);
+GEOIP_API char *GeoIP_org_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API char *GeoIP_org_by_name (GeoIP* gi, const char *host);
+/* End deprecated */
+
+GEOIP_API int GeoIP_id_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API int GeoIP_id_by_name (GeoIP* gi, const char *host);
+GEOIP_API int GeoIP_id_by_ipnum (GeoIP* gi, unsigned long ipnum);
+
+GEOIP_API GeoIPRegion * GeoIP_region_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API GeoIPRegion * GeoIP_region_by_name (GeoIP* gi, const char *host);
+GEOIP_API GeoIPRegion * GeoIP_region_by_ipnum (GeoIP *gi, unsigned long ipnum);
+
+/* Warning - don't call this after GeoIP_assign_region_by_inetaddr calls */
+GEOIP_API void GeoIPRegion_delete (GeoIPRegion *gir);
+
+GEOIP_API void GeoIP_assign_region_by_inetaddr(GeoIP* gi, unsigned long inetaddr, GeoIPRegion *gir);
+
+/* Used to query GeoIP Organization, ISP and AS Number databases */
+GEOIP_API char *GeoIP_name_by_ipnum (GeoIP* gi, unsigned long ipnum);
+GEOIP_API char *GeoIP_name_by_addr (GeoIP* gi, const char *addr);
+GEOIP_API char *GeoIP_name_by_name (GeoIP* gi, const char *host);
+
+GEOIP_API char *GeoIP_database_info (GeoIP* gi);
+GEOIP_API unsigned char GeoIP_database_edition (GeoIP* gi);
+
+#ifdef BSD
+#define memcpy(dest, src, n) bcopy(src, dest, n)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GEOIP_H */
diff --git a/plugins/infowidget/Makefile.am b/plugins/infowidget/Makefile.am
new file mode 100644
index 0000000..66a5820
--- /dev/null
+++ b/plugins/infowidget/Makefile.am
@@ -0,0 +1,40 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktinfowidgetplugin.la
+noinst_HEADERS = infowidgetplugin.h infowidgetprefpage.h trackerview.h GeoIP.h \
+ statustab.h fileview.h
+ktinfowidgetplugin_la_SOURCES = infowidgetplugin.cpp availabilitychunkbar.cpp \
+ chunkbar.cpp chunkdownloadview.cpp downloadedchunkbar.cpp flagdb.cpp peerview.cpp \
+ ktorrentmonitor.cpp iwfiletreediritem.cpp iwfiletreeitem.cpp infowidgetprefpage.cpp \
+ infowidgetpluginsettings.kcfgc iwpref.ui trackerviewbase.ui trackerview.cpp floatspinbox.cpp \
+ localefloatvalidator.cpp chunkdownloadviewbase.ui statustabbase.ui statustab.cpp fileview.cpp
+
+# Libs needed by the plugin
+ktinfowidgetplugin_la_LIBADD = ../../libktorrent/libktorrent.la \
+ $(LIB_KHTML) $(LIB_KPARTS) $(LIB_QT) \
+ $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktinfowidgetplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+if USE_SYSTEM_GEOIP
+ktinfowidgetplugin_la_LDFLAGS += -lGeoIP
+else
+ktinfowidgetplugin_la_SOURCES += GeoIP.c
+endif
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktsearchplugin
+# plugins_DATA = ktsearchpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktinfowidgetplugin.desktop
+
+kde_kcfg_DATA = ktinfowidgetplugin.kcfg
+
+ktdatadir = $(kde_datadir)/ktorrent/geoip
+
+SUBDIRS = geoip
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/infowidget/availabilitychunkbar.cpp b/plugins/infowidget/availabilitychunkbar.cpp
new file mode 100644
index 0000000..9d96268
--- /dev/null
+++ b/plugins/infowidget/availabilitychunkbar.cpp
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qtooltip.h>
+#include <klocale.h>
+
+#include <util/bitset.h>
+#include <interfaces/torrentinterface.h>
+#include "availabilitychunkbar.h"
+
+namespace kt
+{
+
+AvailabilityChunkBar::AvailabilityChunkBar(QWidget* parent, const char* name): ChunkBar(parent, name)
+{
+ QToolTip::add(this, i18n("<img src=\"available_color\">&nbsp; - Available Chunks<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"));
+}
+
+
+AvailabilityChunkBar::~AvailabilityChunkBar()
+{
+}
+
+
+const bt::BitSet & AvailabilityChunkBar::getBitSet() const
+{
+ if (curr_tc)
+ return curr_tc->availableChunksBitSet();
+ else
+ return bt::BitSet::null;
+}
+}
+
+#include "availabilitychunkbar.moc"
diff --git a/plugins/infowidget/availabilitychunkbar.h b/plugins/infowidget/availabilitychunkbar.h
new file mode 100644
index 0000000..a5ae625
--- /dev/null
+++ b/plugins/infowidget/availabilitychunkbar.h
@@ -0,0 +1,43 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 AVAILABILITYCHUNKBAR_H
+#define AVAILABILITYCHUNKBAR_H
+
+#include "chunkbar.h"
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class AvailabilityChunkBar : public ChunkBar
+ {
+ Q_OBJECT
+ public:
+ AvailabilityChunkBar(QWidget* parent, const char* name);
+ virtual ~AvailabilityChunkBar();
+
+ virtual const bt::BitSet & getBitSet() const;
+
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/chunkbar.cpp b/plugins/infowidget/chunkbar.cpp
new file mode 100644
index 0000000..a30571a
--- /dev/null
+++ b/plugins/infowidget/chunkbar.cpp
@@ -0,0 +1,312 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Vincent Wagelaar <vincent@ricardis.tudelft.nl> *
+ * *
+ * 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 <qpainter.h>
+#include <qpen.h>
+#include <qbrush.h>
+#include <qvaluelist.h>
+#include <qpixmap.h>
+#include <math.h>
+#include <qtooltip.h>
+#include <klocale.h>
+#include <qmime.h>
+#include <qimage.h>
+#include <util/log.h>
+#include <interfaces/torrentinterface.h>
+#include <util/bitset.h>
+#include <torrent/globals.h>
+#include "chunkbar.h"
+
+using namespace bt;
+using namespace kt;
+
+namespace kt
+{
+
+ struct Range
+ {
+ int first,last;
+ int fac;
+ };
+
+
+ static void FillAndFrameBlack(QImage* image, uint color, int size)
+ {
+ image->fill(color);
+ for (int i = 0; i < size; i++)
+ {
+ image->setPixel(0, i, 0);
+ image->setPixel(size - 1, i, 0);
+ image->setPixel(i, 0, 0);
+ image->setPixel(i, size - 1, 0);
+ }
+ }
+
+
+
+ static void InitializeToolTipImages(ChunkBar* bar)
+ {
+ static bool images_initialized = false;
+ if (images_initialized)
+ return;
+ images_initialized = true;
+
+ QMimeSourceFactory* factory = QMimeSourceFactory::defaultFactory();
+
+ QImage excluded(16, 16, 32);
+ FillAndFrameBlack(&excluded, bar->colorGroup().color(QColorGroup::Mid).pixel(), 16);
+ factory->setImage("excluded_color", excluded);
+
+ QImage available(16, 16, 32);
+ FillAndFrameBlack(&available, bar->colorGroup().highlight().pixel(), 16);
+ factory->setImage("available_color", available);
+
+ QImage unavailable(16, 16, 32);
+ FillAndFrameBlack(&unavailable, bar->colorGroup().base().pixel(), 16);
+ factory->setImage("unavailable_color", unavailable);
+ }
+
+ ChunkBar::ChunkBar(QWidget *parent, const char *name)
+ : QFrame(parent, name),curr_tc(0)
+ {
+ setFrameShape(StyledPanel);
+ setFrameShadow(Sunken);
+ setLineWidth(3);
+ setMidLineWidth(3);
+
+ show_excluded = false;
+
+ InitializeToolTipImages(this);
+
+ QToolTip::add(this, i18n("<img src=\"available_color\">&nbsp; - Downloaded Chunks<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"));
+
+ }
+
+
+ ChunkBar::~ChunkBar()
+ {}
+
+ void ChunkBar::updateBar()
+ {
+ const BitSet & bs = getBitSet();
+ QSize s = contentsRect().size();
+ bool changed = !(curr == bs);
+ if (show_excluded && curr_tc)
+ {
+ BitSet ebs = curr_tc->excludedChunksBitSet();
+ ebs.orBitSet(curr_tc->onlySeedChunksBitSet()),
+ changed = changed || !(curr_ebs == ebs);
+ curr_ebs = ebs;
+ }
+
+ if (changed || pixmap.isNull() || pixmap.width() != s.width())
+ {
+ // PROFILE("ChunkBar::updateBar");
+ // Out() << "Pixmap : " << s.width() << " " << s.height() << endl;
+ pixmap.resize(s);
+ pixmap.fill(colorGroup().color(QColorGroup::Base));
+ QPainter painter(&pixmap);
+ drawBarContents(&painter);
+ update();
+ }
+ }
+
+ void ChunkBar::drawContents(QPainter *p)
+ {
+ // first draw background
+ if (isEnabled())
+ p->setBrush(colorGroup().base());
+ else
+ p->setBrush(colorGroup().background());
+
+ p->setPen(Qt::NoPen);
+ p->drawRect(contentsRect());
+ if (isEnabled())
+ p->drawPixmap(contentsRect(),pixmap);
+ }
+
+ void ChunkBar::setTC(kt::TorrentInterface* tc)
+ {
+ curr_tc = tc;
+ QSize s = contentsRect().size();
+ //Out() << "Pixmap : " << s.width() << " " << s.height() << endl;
+ pixmap.resize(s);
+ pixmap.fill(colorGroup().color(QColorGroup::Base));
+ QPainter painter(&pixmap);
+ drawBarContents(&painter);
+ update();
+ }
+
+ void ChunkBar::drawBarContents(QPainter *p)
+ {
+ p->saveWorldMatrix();
+ if (curr_tc)
+ {
+ const TorrentStats & s = curr_tc->getStats();
+ Uint32 w = contentsRect().width();
+ const BitSet & bs = getBitSet();
+ curr = bs;
+ if (bs.allOn())
+ drawAllOn(p,colorGroup().highlight());
+ else if (s.total_chunks > w)
+ drawMoreChunksThenPixels(p,bs,colorGroup().highlight());
+ else
+ drawEqual(p,bs,colorGroup().highlight());
+
+ if (show_excluded && s.num_chunks_excluded > 0)
+ {
+ QColor c = colorGroup().color(QColorGroup::Mid);
+ if (curr_ebs.allOn())
+ drawAllOn(p,c);
+ else if (s.total_chunks > w)
+ drawMoreChunksThenPixels(p,curr_ebs,c);
+ else
+ drawEqual(p,curr_ebs,c);
+ }
+ }
+ p->restoreWorldMatrix();
+ }
+
+ void ChunkBar::drawEqual(QPainter *p,const BitSet & bs,const QColor & color)
+ {
+ //p->setPen(QPen(colorGroup().highlight(),1,Qt::SolidLine));
+ QColor c = color;
+
+ Uint32 w = contentsRect().width();
+ double scale = 1.0;
+ Uint32 total_chunks = curr_tc->getStats().total_chunks;
+ if (curr_tc->getStats().total_chunks != w)
+ scale = (double)w / total_chunks;
+
+ p->setPen(QPen(c,1,Qt::SolidLine));
+ p->setBrush(c);
+
+ QValueList<Range> rs;
+
+ for (Uint32 i = 0;i < bs.getNumBits();i++)
+ {
+ if (!bs.get(i))
+ continue;
+
+ if (rs.empty())
+ {
+ Range r = {i,i,0};
+ rs.append(r);
+ }
+ else
+ {
+ Range & l = rs.last();
+ if (l.last == int(i - 1))
+ {
+ l.last = i;
+ }
+ else
+ {
+ Range r = {i,i,0};
+ rs.append(r);
+ }
+ }
+ }
+
+ QRect r = contentsRect();
+
+ for (QValueList<Range>::iterator i = rs.begin();i != rs.end();++i)
+ {
+ Range & ra = *i;
+ int rw = ra.last - ra.first + 1;
+ p->drawRect((int)(scale * ra.first),0,(int)(rw * scale),r.height());
+ }
+ }
+
+ void ChunkBar::drawMoreChunksThenPixels(QPainter *p,const BitSet & bs,const QColor & color)
+ {
+ Uint32 w = contentsRect().width();
+ double chunks_per_pixel = (double)bs.getNumBits() / w;
+ QValueList<Range> rs;
+
+ for (Uint32 i = 0;i < w;i++)
+ {
+ Uint32 num_dl = 0;
+ Uint32 jStart = (Uint32) (i*chunks_per_pixel);
+ Uint32 jEnd = (Uint32) ((i+1)*chunks_per_pixel+0.5);
+ for (Uint32 j = jStart;j < jEnd;j++)
+ if (bs.get(j))
+ num_dl++;
+
+ if (num_dl == 0)
+ continue;
+
+ int fac = int(100*((double)num_dl / (jEnd - jStart)) + 0.5);
+ if (rs.empty())
+ {
+ Range r = {i,i,fac};
+ rs.append(r);
+ }
+ else
+ {
+ Range & l = rs.last();
+ if (l.last == int(i - 1) && l.fac == fac)
+ {
+ l.last = i;
+ }
+ else
+ {
+ Range r = {i,i,fac};
+ rs.append(r);
+ }
+ }
+ }
+
+ QRect r = contentsRect();
+
+ for (QValueList<Range>::iterator i = rs.begin();i != rs.end();++i)
+ {
+ Range & ra = *i;
+ int rw = ra.last - ra.first + 1;
+ int fac = ra.fac;
+ QColor c = color;
+ if (fac < 100)
+ {
+ // do some rounding off
+ if (fac <= 25)
+ fac = 25;
+ else if (fac <= 50)
+ fac = 45;
+ else
+ fac = 65;
+ c = color.light(200-fac);
+ }
+ p->setPen(QPen(c,1,Qt::SolidLine));
+ p->setBrush(c);
+ p->drawRect(ra.first,0,rw,r.height());
+ }
+
+ }
+
+ void ChunkBar::drawAllOn(QPainter *p,const QColor & color)
+ {
+ p->setPen(QPen(color,1,Qt::SolidLine));
+ p->setBrush(color);
+ QSize s = contentsRect().size();
+ p->drawRect(0,0,s.width(),s.height());
+ }
+}
+
+#include "chunkbar.moc"
diff --git a/plugins/infowidget/chunkbar.h b/plugins/infowidget/chunkbar.h
new file mode 100644
index 0000000..6cf0d6a
--- /dev/null
+++ b/plugins/infowidget/chunkbar.h
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Vincent Wagelaar <vincent@ricardis.tudelft.nl> *
+ * *
+ * 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 CHUNKBAR_H
+#define CHUNKBAR_H
+
+#include <qlabel.h>
+#include <util/bitset.h>
+#include <qpixmap.h>
+
+class QPainter;
+
+namespace kt
+{
+ class TorrentInterface;
+}
+
+namespace bt
+{
+ class BitSet;
+}
+
+namespace kt
+{
+
+ /**
+ * @author Joris Guisson, Vincent Wagelaar
+ *
+ * Bar which displays BitSets, subclasses need to fill the BitSet.
+ * BitSets can represent which chunks are downloaded, which chunks are available
+ * and which chunks are excluded.
+ */
+ class ChunkBar : public QFrame
+ {
+ Q_OBJECT
+ public:
+ ChunkBar(QWidget *parent = 0, const char *name = 0);
+ virtual ~ChunkBar();
+
+ void setTC(kt::TorrentInterface* tc);
+
+ virtual const bt::BitSet & getBitSet() const = 0;
+ virtual void drawContents(QPainter *p);
+ virtual void updateBar();
+
+ private:
+ void drawEqual(QPainter *p,const bt::BitSet & bs,const QColor & color);
+ void drawMoreChunksThenPixels(QPainter *p,const bt::BitSet & bs,const QColor & color);
+ void drawAllOn(QPainter *p,const QColor & color);
+ void drawBarContents(QPainter *p);
+
+ protected:
+ kt::TorrentInterface* curr_tc;
+ bool show_excluded;
+ bt::BitSet curr,curr_ebs;
+ QPixmap pixmap;
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/chunkdownloadview.cpp b/plugins/infowidget/chunkdownloadview.cpp
new file mode 100644
index 0000000..276a311
--- /dev/null
+++ b/plugins/infowidget/chunkdownloadview.cpp
@@ -0,0 +1,166 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <qlabel.h>
+#include <interfaces/chunkdownloadinterface.h>
+#include <interfaces/functions.h>
+#include <interfaces/torrentinterface.h>
+#include "chunkdownloadview.h"
+
+
+using namespace bt;
+using namespace kt;
+
+namespace kt
+{
+
+ ChunkDownloadViewItem::ChunkDownloadViewItem(KListView* cdv,kt::ChunkDownloadInterface* cd)
+ : KListViewItem(cdv),cd(cd)
+ {
+ update();
+ }
+
+ void ChunkDownloadViewItem::update()
+ {
+ ChunkDownloadInterface::Stats s;
+ cd->getStats(s);
+
+ setText(0,QString::number(s.chunk_index));
+ setText(1,QString("%1 / %2").arg(s.pieces_downloaded).arg(s.total_pieces));
+ setText(2,s.current_peer_id);
+ setText(3,KBytesPerSecToString(s.download_speed / 1024.0));
+ setText(4,QString::number(s.num_downloaders));
+ }
+
+ int ChunkDownloadViewItem::compare(QListViewItem * i,int col,bool) const
+ {
+ ChunkDownloadViewItem* it = (ChunkDownloadViewItem*)i;
+ kt::ChunkDownloadInterface* ocd = it->cd;
+ ChunkDownloadInterface::Stats s;
+ cd->getStats(s);
+ ChunkDownloadInterface::Stats os;
+ ocd->getStats(os);
+ switch (col)
+ {
+ case 0: return CompareVal(s.chunk_index,os.chunk_index);
+ case 1: return CompareVal(s.pieces_downloaded,os.pieces_downloaded);
+ case 2: return QString::compare(s.current_peer_id,os.current_peer_id);
+ case 3: return CompareVal(s.download_speed,os.download_speed);
+ case 4: return CompareVal(s.num_downloaders,os.num_downloaders);
+ }
+ return 0;
+ }
+
+
+ ChunkDownloadView::ChunkDownloadView(QWidget *parent, const char *name)
+ : ChunkDownloadViewBase(parent, name)
+ {
+ m_list_view->setShowSortIndicator(true);
+ m_list_view->setAllColumnsShowFocus(true);
+
+ m_list_view->setColumnAlignment(0,Qt::AlignLeft);
+ m_list_view->setColumnAlignment(1,Qt::AlignCenter);
+ m_list_view->setColumnAlignment(3,Qt::AlignRight);
+ m_list_view->setColumnAlignment(4,Qt::AlignRight);
+ curr_tc = 0;
+ }
+
+
+ ChunkDownloadView::~ChunkDownloadView()
+ {}
+
+
+ void ChunkDownloadView::addDownload(kt::ChunkDownloadInterface* cd)
+ {
+ ChunkDownloadViewItem* it = new ChunkDownloadViewItem(m_list_view,cd);
+ items.insert(cd,it);
+ }
+
+ void ChunkDownloadView::removeDownload(kt::ChunkDownloadInterface* cd)
+ {
+ if (!items.contains(cd))
+ return;
+
+ ChunkDownloadViewItem* it = items[cd];
+ delete it;
+ items.remove(cd);
+ }
+
+ void ChunkDownloadView::removeAll()
+ {
+ m_list_view->clear();
+ items.clear();
+ }
+
+ void ChunkDownloadView::changeTC(kt::TorrentInterface* tc)
+ {
+ curr_tc = tc;
+ setEnabled(curr_tc != 0);
+ update();
+ }
+
+ void ChunkDownloadView::update()
+ {
+ if (!curr_tc)
+ return;
+
+ QMap<ChunkDownloadInterface*,ChunkDownloadViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ ChunkDownloadViewItem* it = i.data();
+ it->update();
+ i++;
+ }
+ m_list_view->sort();
+
+ const TorrentStats & s = curr_tc->getStats();
+ m_chunks_downloading->setText(QString::number(s.num_chunks_downloading));
+ m_chunks_downloaded->setText(QString::number(s.num_chunks_downloaded));
+ m_total_chunks->setText(QString::number(s.total_chunks));
+ m_excluded_chunks->setText(QString::number(s.num_chunks_excluded));
+ m_chunks_left->setText(QString::number(s.num_chunks_left));
+
+ if( s.chunk_size / 1024 < 1024 )
+ m_size_chunks->setText(QString::number(s.chunk_size / 1024) + "." + QString::number((s.chunk_size % 1024) / 100) + " KB");
+ else
+ m_size_chunks->setText(QString::number(s.chunk_size / 1024 / 1024) + "." + QString::number(((s.chunk_size / 1024) % 1024) / 100) + " MB");
+ }
+
+ void ChunkDownloadView::saveLayout(KConfig* cfg,const QString & group_name)
+ {
+ m_list_view->saveLayout(cfg,group_name);
+ }
+
+ void ChunkDownloadView::restoreLayout(KConfig* cfg,const QString & group_name)
+ {
+ m_list_view->restoreLayout(cfg,group_name);
+ }
+
+ void ChunkDownloadView::clear()
+ {
+ m_chunks_downloading->clear();
+ m_chunks_downloaded->clear();
+ m_total_chunks->clear();
+ m_excluded_chunks->clear();
+ m_size_chunks->clear();
+ }
+}
+
+#include "chunkdownloadview.moc"
diff --git a/plugins/infowidget/chunkdownloadview.h b/plugins/infowidget/chunkdownloadview.h
new file mode 100644
index 0000000..a00a746
--- /dev/null
+++ b/plugins/infowidget/chunkdownloadview.h
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTCHUNKDOWNLOADVIEW_H
+#define BTCHUNKDOWNLOADVIEW_H
+
+#include <klistview.h>
+#include <qmap.h>
+#include "chunkdownloadviewbase.h"
+
+namespace kt
+{
+ class ChunkDownloadInterface;
+ class ChunkDownloadView;
+
+ class ChunkDownloadViewItem : public KListViewItem
+ {
+ kt::ChunkDownloadInterface* cd;
+ public:
+ ChunkDownloadViewItem(KListView* cdv,kt::ChunkDownloadInterface* cd);
+
+ void update();
+ int compare(QListViewItem * i,int col,bool) const;
+ };
+
+
+ /**
+ @author Joris Guisson
+ */
+ class ChunkDownloadView : public ChunkDownloadViewBase
+ {
+ Q_OBJECT
+
+ QMap<kt::ChunkDownloadInterface*,ChunkDownloadViewItem*> items;
+ kt::TorrentInterface* curr_tc;
+ public:
+ ChunkDownloadView(QWidget *parent = 0, const char *name = 0);
+ virtual ~ChunkDownloadView();
+
+ void saveLayout(KConfig* cfg,const QString & group_name);
+ void restoreLayout(KConfig* cfg,const QString & group_name);
+ void clear();
+ void update();
+ void changeTC(kt::TorrentInterface* tc);
+
+ public slots:
+ void addDownload(kt::ChunkDownloadInterface* cd);
+ void removeDownload(kt::ChunkDownloadInterface* cd);
+ void removeAll();
+ };
+}
+
+
+#endif
diff --git a/plugins/infowidget/chunkdownloadviewbase.ui b/plugins/infowidget/chunkdownloadviewbase.ui
new file mode 100644
index 0000000..24a6e18
--- /dev/null
+++ b/plugins/infowidget/chunkdownloadviewbase.ui
@@ -0,0 +1,345 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ChunkDownloadViewBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>ChunkDownloadViewBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>830</width>
+ <height>534</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Chunks</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Total:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_total_chunks</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Currently downloading:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_chunks_downloading</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Downloaded:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_chunks_downloaded</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout38</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Excluded:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_excluded_chunks</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout38_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4_2</cstring>
+ </property>
+ <property name="text">
+ <string>Left:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_chunks_left</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_8</cstring>
+ </property>
+ <property name="text">
+ <string>Size:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_size_chunks</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Chunk</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Progress</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Peer</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Down Speed</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Assigned Peers</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_list_view</cstring>
+ </property>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/infowidget/downloadedchunkbar.cpp b/plugins/infowidget/downloadedchunkbar.cpp
new file mode 100644
index 0000000..ab87ff7
--- /dev/null
+++ b/plugins/infowidget/downloadedchunkbar.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/bitset.h>
+#include <interfaces/torrentinterface.h>
+#include "downloadedchunkbar.h"
+
+namespace kt
+{
+
+ DownloadedChunkBar::DownloadedChunkBar(QWidget* parent, const char* name)
+ : ChunkBar(parent,name)
+ {
+ show_excluded = true;
+ }
+
+
+ DownloadedChunkBar::~DownloadedChunkBar()
+ {}
+
+
+ const bt::BitSet & DownloadedChunkBar::getBitSet() const
+ {
+ if (curr_tc)
+ return curr_tc->downloadedChunksBitSet();
+ else
+ return bt::BitSet::null;
+ }
+}
+
+#include "downloadedchunkbar.moc"
diff --git a/plugins/infowidget/downloadedchunkbar.h b/plugins/infowidget/downloadedchunkbar.h
new file mode 100644
index 0000000..996634f
--- /dev/null
+++ b/plugins/infowidget/downloadedchunkbar.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 DOWNLOADEDCHUNKBAR_H
+#define DOWNLOADEDCHUNKBAR_H
+
+#include "chunkbar.h"
+
+namespace kt
+{
+ /**
+ @author Joris Guisson
+ */
+ class DownloadedChunkBar : public ChunkBar
+ {
+ Q_OBJECT
+ public:
+ DownloadedChunkBar(QWidget* parent, const char* name);
+ virtual ~DownloadedChunkBar();
+
+ virtual const bt::BitSet & getBitSet() const;
+
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/fileview.cpp b/plugins/infowidget/fileview.cpp
new file mode 100644
index 0000000..7fb56a6
--- /dev/null
+++ b/plugins/infowidget/fileview.cpp
@@ -0,0 +1,447 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kiconloader.h>
+#include <kglobal.h>
+#include <kpopupmenu.h>
+#include <krun.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <util/bitset.h>
+#include <util/functions.h>
+#include <interfaces/functions.h>
+#include <interfaces/torrentinterface.h>
+#include <interfaces/torrentfileinterface.h>
+#include <qfileinfo.h>
+#include "functions.h"
+#include "iwfiletreeitem.h"
+#include "iwfiletreediritem.h"
+#include "fileview.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ FileView::FileView(QWidget *parent, const char *name)
+ : KListView(parent, name),curr_tc(0),multi_root(0),pending_fill(0),next_fill_item(0)
+ {
+ setFrameShape(QFrame::NoFrame);
+ addColumn( i18n( "File" ) );
+ addColumn( i18n( "Size" ) );
+ addColumn( i18n( "Download" ) );
+ addColumn( i18n( "Preview" ) );
+ addColumn( i18n( "% Complete" ) );
+ setShowSortIndicator(true);
+
+ context_menu = new KPopupMenu(this);
+ preview_id = context_menu->insertItem(SmallIcon("fileopen"),i18n("Open"));
+ context_menu->insertSeparator();
+ first_id = context_menu->insertItem(i18n("Download First"));
+ normal_id = context_menu->insertItem(i18n("Download Normally"));
+ last_id = context_menu->insertItem(i18n("Download Last"));
+ context_menu->insertSeparator();
+ dnd_keep_id = context_menu->insertItem(i18n("Do Not Download"));
+ dnd_throw_away_id = context_menu->insertItem(i18n("Delete File(s)"));
+
+
+ context_menu->setItemEnabled(preview_id, false);
+ context_menu->setItemEnabled(first_id, false);
+ context_menu->setItemEnabled(normal_id, false);
+ context_menu->setItemEnabled(last_id, false);
+ context_menu->setItemEnabled(dnd_keep_id, false);
+ context_menu->setItemEnabled(dnd_throw_away_id, false);
+
+ connect(this,SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint& )),
+ this,SLOT(showContextMenu(KListView*, QListViewItem*, const QPoint& )));
+ connect(context_menu, SIGNAL ( activated ( int ) ), this, SLOT ( contextItem ( int ) ) );
+ connect(this,SIGNAL(doubleClicked( QListViewItem*, const QPoint&, int )),
+ this,SLOT(onDoubleClicked(QListViewItem*, const QPoint&, int)));
+
+ connect(&fill_timer, SIGNAL(timeout()), this, SLOT( fillTreePartial() ) );
+
+ setEnabled(false);
+
+ setSelectionMode(QListView::Extended);
+ }
+
+
+ FileView::~FileView()
+ {}
+
+#define ITEMS_PER_TICK 100
+
+ void FileView::fillTreePartial()
+ {
+ int cnt = 0;
+ while (next_fill_item < curr_tc->getNumFiles() && cnt < ITEMS_PER_TICK)
+ {
+ TorrentFileInterface & file = curr_tc->getTorrentFile(next_fill_item);
+ multi_root->insert(file.getPath(),file);
+ cnt++;
+ next_fill_item++;
+ }
+
+ if (next_fill_item >= curr_tc->getNumFiles())
+ {
+ multi_root->setOpen(true);
+ setRootIsDecorated(true);
+ setEnabled(true);
+ multi_root->updatePriorityInformation(curr_tc);
+ multi_root->updatePercentageInformation();
+ multi_root->updatePreviewInformation(curr_tc);
+ fill_timer.stop();
+ connect(curr_tc,SIGNAL(missingFilesMarkedDND( kt::TorrentInterface* )),
+ this,SLOT(refreshFileTree( kt::TorrentInterface* )));
+ }
+ else
+ fill_timer.start(0,true);
+ }
+
+ void FileView::fillFileTree()
+ {
+ multi_root = 0;
+ clear();
+
+ if (!curr_tc)
+ return;
+
+ if (curr_tc->getStats().multi_file_torrent)
+ {
+ setEnabled(false);
+ multi_root = new IWFileTreeDirItem(this,curr_tc->getStats().torrent_name);
+ next_fill_item = 0;
+ fillTreePartial();
+ }
+ else
+ {
+ const TorrentStats & s = curr_tc->getStats();
+ this->setRootIsDecorated(false);
+ KListViewItem* item = new KListViewItem(
+ this,
+ s.torrent_name,
+ BytesToString(s.total_bytes));
+
+ item->setPixmap(0,KMimeType::findByPath(s.torrent_name)->pixmap(KIcon::Small));
+ setEnabled(true);
+ connect(curr_tc,SIGNAL(missingFilesMarkedDND( kt::TorrentInterface* )),
+ this,SLOT(refreshFileTree( kt::TorrentInterface* )));
+ }
+ }
+
+ void FileView::changeTC(kt::TorrentInterface* tc)
+ {
+ if (tc == curr_tc)
+ return;
+
+ curr_tc = tc;
+ pending_fill = true;
+ fill_timer.stop();
+ fillFileTree();
+ }
+
+ void FileView::update()
+ {
+ if (!curr_tc)
+ return;
+
+ if (isVisible() && !pending_fill)
+ {
+ readyPreview();
+ readyPercentage();
+ }
+ }
+
+ void FileView::readyPercentage()
+ {
+ if (curr_tc && !curr_tc->getStats().multi_file_torrent)
+ {
+ QListViewItemIterator it(this);
+ if (!it.current())
+ return;
+
+ const BitSet & bs = curr_tc->downloadedChunksBitSet();
+ Uint32 total = bs.getNumBits();
+ Uint32 on = bs.numOnBits();
+ double percent = 100.0 * ((double)on/(double)total);
+ if (percent < 0.0)
+ percent = 0.0;
+ else if (percent > 100.0)
+ percent = 100.0;
+ KLocale* loc = KGlobal::locale();
+ it.current()->setText(4,i18n("%1 %").arg(loc->formatNumber(percent,2)));
+ }
+ }
+
+ void FileView::readyPreview()
+ {
+ if (curr_tc && !curr_tc->getStats().multi_file_torrent)
+ {
+ QListViewItemIterator it(this);
+ if (!it.current())
+ return;
+
+ if (IsMultimediaFile(curr_tc->getStats().output_path))
+ {
+ if ( curr_tc->readyForPreview() )
+ it.current()->setText(3, i18n("Available"));
+ else
+ it.current()->setText(3, i18n("Pending"));
+ }
+ else
+ it.current()->setText(3, i18n("No"));
+
+ }
+ }
+
+ void FileView::showContextMenu(KListView* ,QListViewItem*,const QPoint & p)
+ {
+ const TorrentStats & s = curr_tc->getStats();
+ // don't show a menu if item is 0 or if it is a directory
+
+
+
+ QPtrList<QListViewItem> sel = selectedItems();
+ switch(sel.count())
+ {
+ case 0:
+ return;
+ break;
+ case 1:
+ break;
+ default:
+ context_menu->setItemEnabled(first_id, true);
+ context_menu->setItemEnabled(normal_id, true);
+ context_menu->setItemEnabled(last_id, true);
+ context_menu->setItemEnabled(preview_id, false);
+ context_menu->setItemEnabled(dnd_keep_id,true);
+ context_menu->setItemEnabled(dnd_throw_away_id,true);
+ context_menu->popup(p);
+ return;
+ break;
+ }
+ QListViewItem* item = sel.getFirst();
+
+ context_menu->setItemEnabled(first_id, false);
+ context_menu->setItemEnabled(normal_id, false);
+ context_menu->setItemEnabled(last_id, false);
+ if (s.multi_file_torrent && item->childCount() == 0)
+ {
+ kt::TorrentFileInterface & file = ((FileTreeItem*)item)->getTorrentFile();
+ if (!file.isNull())
+ {
+ context_menu->setItemEnabled(preview_id, true);
+ this->preview_path = "cache" + bt::DirSeparator() + file.getPath();
+
+ switch(file.getPriority())
+ {
+ case FIRST_PRIORITY:
+ context_menu->setItemEnabled(normal_id, true);
+ context_menu->setItemEnabled(last_id, true);
+ context_menu->setItemEnabled(dnd_keep_id,true);
+ context_menu->setItemEnabled(dnd_keep_id,true);
+ context_menu->setItemEnabled(dnd_throw_away_id,true);
+ break;
+ case LAST_PRIORITY:
+ context_menu->setItemEnabled(first_id, true);
+ context_menu->setItemEnabled(normal_id, true);
+ context_menu->setItemEnabled(dnd_keep_id,true);
+ context_menu->setItemEnabled(dnd_keep_id,true);
+ context_menu->setItemEnabled(dnd_throw_away_id,true);
+ break;
+ case EXCLUDED:
+ context_menu->setItemEnabled(first_id,true);
+ context_menu->setItemEnabled(normal_id,true);
+ context_menu->setItemEnabled(last_id, true);
+ context_menu->setItemEnabled(dnd_keep_id,true);
+ context_menu->setItemEnabled(dnd_throw_away_id,false);
+ break;
+ case ONLY_SEED_PRIORITY:
+ context_menu->setItemEnabled(first_id,true);
+ context_menu->setItemEnabled(normal_id,true);
+ context_menu->setItemEnabled(last_id, true);
+ context_menu->setItemEnabled(dnd_keep_id,false);
+ context_menu->setItemEnabled(dnd_throw_away_id,true);
+ break;
+ case PREVIEW_PRIORITY:
+ default:
+ context_menu->setItemEnabled(first_id, true);
+ context_menu->setItemEnabled(normal_id,false);
+ context_menu->setItemEnabled(last_id, true);
+ context_menu->setItemEnabled(dnd_keep_id,true);
+ context_menu->setItemEnabled(dnd_throw_away_id,true);
+ break;
+ }
+ }
+ else
+ {
+ context_menu->setItemEnabled(preview_id, false);
+ }
+ }
+ else
+ {
+ bool val = item->childCount() != 0;
+ context_menu->setItemEnabled(first_id, val);
+ context_menu->setItemEnabled(normal_id, val);
+ context_menu->setItemEnabled(last_id, val);
+ context_menu->setItemEnabled(dnd_keep_id,val);
+ context_menu->setItemEnabled(dnd_throw_away_id,val);
+
+ context_menu->setItemEnabled(preview_id, true);
+ if (s.multi_file_torrent)
+ {
+ FileTreeDirItem* dir = ((FileTreeDirItem*)item);
+ preview_path = "cache" + dir->getPath();
+ }
+ else
+ {
+ preview_path = "cache";
+ }
+ }
+
+ context_menu->popup(p);
+ }
+
+ void FileView::contextItem(int id)
+ {
+ QPtrList<QListViewItem> sel = selectedItems();
+
+ Priority newpriority = NORMAL_PRIORITY;
+ if(id == this->preview_id)
+ {
+ new KRun(KURL::fromPathOrURL(this->curr_tc->getTorDir()+preview_path), 0, true, true);
+ return;
+ }
+ else if (id == dnd_throw_away_id)
+ {
+ Uint32 n = sel.count();
+ if (n == 1) // single item can be a directory
+ {
+ // the number of the beast > 1
+ n = (*sel.begin())->childCount() == 0 ? 1 : 666;
+ }
+
+ QString msg = i18n(
+ "You will lose all data in this file, are you sure you want to do this ?",
+ "You will lose all data in these files, are you sure you want to do this ?",n);
+
+ if (KMessageBox::warningYesNo(0,msg) == KMessageBox::No)
+ return;
+ newpriority = EXCLUDED;
+ }
+ else if(id == this->first_id)
+ {
+ newpriority = FIRST_PRIORITY;
+ }
+ else if(id == this->last_id)
+ {
+ newpriority = LAST_PRIORITY;
+ }
+ else if(id == this->normal_id)
+ {
+ newpriority = NORMAL_PRIORITY;
+ }
+ else if (id == dnd_keep_id)
+ {
+ newpriority = ONLY_SEED_PRIORITY;
+ }
+
+
+
+ QPtrList<QListViewItem>::Iterator i = sel.begin();
+ while(i != sel.end())
+ {
+ QListViewItem* item = *i;
+ changePriority(item, newpriority);
+ multi_root->updatePriorityInformation(curr_tc);
+ i++;
+ }
+ }
+
+ void FileView::changePriority(QListViewItem* item, Priority newpriority)
+ {
+ if(item->childCount() == 0)
+ {
+ FileTreeItem* fti = (FileTreeItem*)item;
+ if (newpriority == EXCLUDED)
+ {
+ fti->setChecked(false,false);
+ }
+ else if (newpriority == ONLY_SEED_PRIORITY)
+ {
+ fti->setChecked(false,true);
+ }
+ else
+ {
+ if (!fti->isOn())
+ fti->setChecked(true,true);
+ fti->getTorrentFile().setPriority(newpriority);
+ }
+ return;
+ }
+ QListViewItem* myChild = item->firstChild();
+ while( myChild )
+ {
+ changePriority(myChild, newpriority);
+ myChild = myChild->nextSibling();
+ }
+ }
+
+ void FileView::refreshFileTree(kt::TorrentInterface* tc)
+ {
+ if (!tc || curr_tc != tc)
+ return;
+
+ if (multi_root)
+ multi_root->updateDNDInformation();
+ }
+
+ void FileView::onDoubleClicked(QListViewItem* item,const QPoint & ,int )
+ {
+ if (!curr_tc)
+ return;
+
+ const TorrentStats & s = curr_tc->getStats();
+
+ if (s.multi_file_torrent)
+ {
+ if (item->childCount() == 0)
+ {
+ // file
+ FileTreeItem* file = (FileTreeItem*)item;
+ QString path = "cache" + bt::DirSeparator() + file->getTorrentFile().getPath();
+ new KRun(KURL::fromPathOrURL(curr_tc->getTorDir() + path), 0, true, true);
+ }
+ else
+ {
+ // directory
+ FileTreeDirItem* dir = ((FileTreeDirItem*)item);
+ new KRun(KURL::fromPathOrURL(curr_tc->getTorDir() + "cache" + dir->getPath()), 0, true, true);
+ }
+ }
+ else
+ {
+ QFileInfo fi(curr_tc->getTorDir()+"cache");
+ new KRun(KURL::fromPathOrURL(fi.readLink()), 0, true, true);
+ }
+ }
+}
+
+#include "fileview.moc"
diff --git a/plugins/infowidget/fileview.h b/plugins/infowidget/fileview.h
new file mode 100644
index 0000000..6a827dc
--- /dev/null
+++ b/plugins/infowidget/fileview.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTFILEVIEW_H
+#define KTFILEVIEW_H
+
+#include <klistview.h>
+#include <util/constants.h>
+#include <qtimer.h>
+
+namespace kt
+{
+ class TorrentInterface;
+ class IWFileTreeDirItem;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class FileView : public KListView
+ {
+ Q_OBJECT
+ public:
+ FileView(QWidget *parent = 0, const char *name = 0);
+ virtual ~FileView();
+
+ void update();
+ void changeTC(kt::TorrentInterface* tc);
+ private slots:
+ void contextItem(int id);
+ void showContextMenu(KListView* ,QListViewItem* item,const QPoint & p);
+ void refreshFileTree(kt::TorrentInterface* tc);
+ void onDoubleClicked(QListViewItem* item,const QPoint & ,int );
+ void fillTreePartial();
+
+ private:
+ void fillFileTree();
+ void readyPreview();
+ void readyPercentage();
+ void changePriority(QListViewItem* item, bt::Priority newpriority);
+
+ private:
+ kt::TorrentInterface* curr_tc;
+ IWFileTreeDirItem* multi_root;
+ bool pending_fill;
+ KPopupMenu* context_menu;
+ QString preview_path;
+ QTimer fill_timer;
+ int preview_id;
+ int first_id;
+ int normal_id;
+ int last_id;
+ int dnd_keep_id;
+ int dnd_throw_away_id;
+
+ int next_fill_item;
+ };
+
+}
+
+#endif
diff --git a/plugins/infowidget/flagdb.cpp b/plugins/infowidget/flagdb.cpp
new file mode 100644
index 0000000..140a3b7
--- /dev/null
+++ b/plugins/infowidget/flagdb.cpp
@@ -0,0 +1,119 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Modestas Vainius <modestas@vainius.eu> *
+ * *
+ * 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 <qfile.h>
+#include <qimage.h>
+#include <kstandarddirs.h>
+#include "flagdb.h"
+
+kt::FlagDBSource::FlagDBSource(const char* type, const QString& pathPattern)
+ : type(type), pathPattern(pathPattern)
+{
+}
+
+kt::FlagDBSource::FlagDBSource(const QString& pathPattern)
+ : type(NULL), pathPattern(pathPattern)
+{
+}
+
+kt::FlagDBSource::FlagDBSource()
+ : type(NULL), pathPattern()
+{
+}
+
+QString kt::FlagDBSource::FlagDBSource::getPath(const QString& country) const
+{
+ if (type) {
+ return locate(type, pathPattern.arg(country));
+ } else {
+ return pathPattern.arg(country);
+ }
+}
+
+const QPixmap& kt::FlagDB::nullPixmap = QPixmap();
+
+kt::FlagDB::FlagDB(int preferredWidth, int preferredHeight)
+ : preferredWidth(preferredWidth),
+ preferredHeight(preferredHeight),
+ sources(),
+ db()
+{
+}
+
+
+kt::FlagDB::FlagDB(const FlagDB& other)
+ : preferredWidth(other.preferredWidth),
+ preferredHeight(other.preferredHeight),
+ sources(other.sources),
+ db(other.db)
+{
+}
+
+kt::FlagDB::~FlagDB()
+{
+}
+
+void kt::FlagDB::addFlagSource(const FlagDBSource& source)
+{
+ sources.append(source);
+}
+
+void kt::FlagDB::addFlagSource(const char* type, const QString& pathPattern)
+{
+ addFlagSource(FlagDBSource(type, pathPattern));
+}
+
+const QValueList<kt::FlagDBSource>& kt::FlagDB::listSources() const
+{
+ return sources;
+}
+
+bool kt::FlagDB::isFlagAvailable(const QString& country)
+{
+ return getFlag(country).isNull();
+}
+
+const QPixmap& kt::FlagDB::getFlag(const QString& country)
+{
+ const QString& c = country.lower();
+ if (!db.contains(c)) {
+ QImage img;
+ QPixmap pixmap;
+ for (QValueList<FlagDBSource>::const_iterator it = sources.constBegin(); it != sources.constEnd(); it++) {
+ const QString& path = (*it).getPath(c);
+ if (QFile::exists(path)) {
+ if (img.load(path)) {
+ if (img.width() != preferredWidth || img.height() != preferredHeight) {
+ const QImage& imgScaled = img.smoothScale(preferredWidth, preferredHeight, QImage::ScaleMin);
+ if (!imgScaled.isNull()) {
+ pixmap.convertFromImage(imgScaled);
+ break;
+ } else if (img.width() <= preferredWidth || img.height() <= preferredHeight) {
+ pixmap.convertFromImage(img);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ db[c] = (!pixmap.isNull()) ? pixmap : nullPixmap;
+ }
+ return db[c];
+}
diff --git a/plugins/infowidget/flagdb.h b/plugins/infowidget/flagdb.h
new file mode 100644
index 0000000..f2524ab
--- /dev/null
+++ b/plugins/infowidget/flagdb.h
@@ -0,0 +1,68 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Modestas Vainius <modestas@vainius.eu> *
+ * *
+ * 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 FLAGDB_H
+#define FLAGDB_H
+
+#include <qpixmap.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qmap.h>
+
+namespace kt
+{
+ class FlagDBSource
+ {
+ public:
+ FlagDBSource();
+ FlagDBSource(const char* type, const QString& pathPattern);
+ FlagDBSource(const QString& pathPattern);
+ QString getPath(const QString& country) const;
+
+ const char* getType() { return type; };
+ const QString& getPathPattern() { return pathPattern; };
+
+ private:
+ const char* type;
+ const QString pathPattern;
+ };
+
+ /**
+ @author Modestas Vainius
+ */
+ class FlagDB
+ {
+ public :
+ FlagDB(int preferredWidth, int preferredHeight);
+ FlagDB(const FlagDB& m);
+ ~FlagDB();
+
+ void addFlagSource(const FlagDBSource& source);
+ void addFlagSource(const char* type, const QString& pathPattern);
+ const QValueList<FlagDBSource>& listSources() const;
+ bool isFlagAvailable(const QString& country);
+ const QPixmap& getFlag(const QString& country);
+ private:
+ static const QPixmap& nullPixmap;
+ int preferredWidth, preferredHeight;
+ QValueList<FlagDBSource> sources;
+ QMap<QString,QPixmap> db;
+ };
+}
+
+ #endif
diff --git a/plugins/infowidget/floatspinbox.cpp b/plugins/infowidget/floatspinbox.cpp
new file mode 100644
index 0000000..8b78981
--- /dev/null
+++ b/plugins/infowidget/floatspinbox.cpp
@@ -0,0 +1,226 @@
+/***************************************************************************
+ * Copyright (C) 2006 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Vincent Wagelaar <vincent@ricardis.tudelft.nl> *
+ * Jonas Widarsson <jonas@widarsson.com> *
+ * *
+ * 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 <kglobal.h>
+#include <klocale.h>
+#include <qlineedit.h>
+#include "floatspinbox.h"
+#include "localefloatvalidator.h"
+
+
+kt::FloatSpinBox::FloatSpinBox(
+ QWidget * parent,
+ const char * name
+ )
+ :QSpinBox( -100, 100, 1, parent, name),
+ m_precision_digits( 2 ),
+ m_value(0.0f),
+ m_minValue(0.0f),
+ m_maxValue(0.0f),
+ m_useRange(false),
+ m_oldIntVal(0)
+{
+ QSpinBox::setValue(0);
+ setStep( 0.25f );
+ connect(this, SIGNAL(valueChanged ( int )), this, SLOT(internalValueChanged( int )));
+ setValidator( new LocaleFloatValidator( dynamic_cast<QSpinBox * > (this) ));
+ editor()->setAlignment(Qt::AlignRight);
+}
+
+kt::FloatSpinBox::FloatSpinBox(
+ int precision,
+ QWidget * parent,
+ const char * name
+ )
+ :QSpinBox( -100, 100, 1, parent, name),
+ m_precision_digits( precision ),
+ m_value(0.0f),
+ m_minValue(0.0f),
+ m_maxValue(0.0f),
+ m_useRange(false),
+ m_oldIntVal(0)
+{
+ QSpinBox::setValue(0);
+ setStep( 0.25 );
+ connect(this, SIGNAL(valueChanged ( int )), this, SLOT(internalValueChanged( int )));
+ setValidator( new LocaleFloatValidator( dynamic_cast<QSpinBox * > (this) ));
+}
+
+
+kt::FloatSpinBox::FloatSpinBox(
+ float minValue,
+ float maxValue,
+ float step,
+ int precision,
+ QWidget * parent,
+ const char * name
+ )
+ :QSpinBox( -100, 100, 1, parent, name),
+ m_precision_digits( precision ),
+ m_value(0.0f),
+ m_minValue(minValue),
+ m_maxValue(maxValue),
+ m_useRange(true),
+ m_oldIntVal(0)
+{
+ QSpinBox::setValue(0);
+ setValue(0.0f);
+ setStep( step );
+ connect(this, SIGNAL(valueChanged ( int )), this, SLOT(internalValueChanged( int )));
+ setValidator( new LocaleFloatValidator( this ));
+
+}
+
+QString kt::FloatSpinBox::mapValueToText( int value )
+{
+ /// This is called from QSpinBox, which passes an int.
+ /// As we don't use the QSpinBox's internal value, we ignore it.
+ QString t = KGlobal::locale()->formatNumber( m_value, m_precision_digits);
+ editor()->setText(t);
+ return t;
+}
+
+int kt::FloatSpinBox::mapTextToValue( bool * ok )
+{
+ /// This is called from QSpinBox, which needs an int for return.
+ /// As we don't use the QSpinBox's internal value, we only return 0.
+
+ float value = KGlobal::locale()->readNumber(text(), ok);
+ if (*ok)
+ {
+ setValue(value);
+ *ok = true;
+ }
+ return 1;
+}
+
+float kt::FloatSpinBox::minValue( ) const
+{
+ return m_minValue;
+}
+
+float kt::FloatSpinBox::maxValue( ) const
+{
+ return m_maxValue;
+}
+
+float kt::FloatSpinBox::value( ) const
+{
+ return m_value;
+}
+
+int kt::FloatSpinBox::precision( ) const
+{
+ return m_precision_digits;
+}
+
+void kt::FloatSpinBox::setMinValue( float minValue )
+{
+ if (minValue <= m_maxValue)
+ {
+ m_minValue = minValue;
+ m_useRange = true;
+ }
+}
+
+void kt::FloatSpinBox::setMaxValue( float maxValue )
+{
+ if (maxValue >= m_minValue)
+ {
+ m_maxValue = maxValue;
+ m_useRange = true;
+ }
+}
+
+void kt::FloatSpinBox::setValue( float value )
+{
+ bool changed = false;
+ if (m_useRange)
+ {
+ float old = m_value;
+ m_value = max(m_minValue, min(m_maxValue, value));
+ if ( old != m_value )
+ changed = true;
+ }
+ else
+ {
+ m_value = value;
+ changed = true;
+ }
+ if (changed)
+ {
+ mapValueToText(0);
+ emit valueChanged( m_value );
+ emit valueHasChanged();
+ }
+}
+
+void kt::FloatSpinBox::setStep( float step)
+{
+ if (step > 0)
+ m_step = step;
+}
+
+void kt::FloatSpinBox::internalValueChanged( int value )
+{
+ /// The step buttons won't work without tracking the
+ /// QSpinbox's value changes.
+
+ if ( value > m_oldIntVal)
+ {
+ stepUp();
+ }
+ else
+ {
+ stepDown();
+ }
+
+ if (value > 10)
+ value -= 20;
+
+ if (value < -10)
+ value += 20;
+
+ m_oldIntVal = value;
+}
+
+void kt::FloatSpinBox::setPrecision( int value )
+{
+ m_precision_digits = value;
+}
+
+void kt::FloatSpinBox::stepUp( )
+{
+ setValue( m_value + m_step );
+}
+
+void kt::FloatSpinBox::stepDown( )
+{
+ setValue( m_value - m_step );
+}
+
+kt::FloatSpinBox::~ FloatSpinBox( )
+{
+}
+
+
+#include "floatspinbox.moc"
diff --git a/plugins/infowidget/floatspinbox.h b/plugins/infowidget/floatspinbox.h
new file mode 100644
index 0000000..42545bc
--- /dev/null
+++ b/plugins/infowidget/floatspinbox.h
@@ -0,0 +1,93 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Vincent Wagelaar <vincent@ricardis.tudelft.nl> *
+ * Jonas Widarsson <jonas@widarsson.com> *
+ * *
+ * 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 FLOATSPINBOX_H
+#define FLOATSPINBOX_H
+
+#include <qspinbox.h>
+
+namespace kt
+{
+
+ /**
+ * @author Jonas Widarsson
+ *
+ * A Spinbox for float values which respects KGlobal::locale().
+ * QSpinBox's internal integer value is only
+ * used for step detection.
+ */
+
+ class FloatSpinBox : public QSpinBox
+ {
+ Q_OBJECT
+ public:
+ FloatSpinBox( QWidget* parent=0, const char* name=0 );
+ FloatSpinBox( int precision = 2, QWidget* parent=0, const char* name=0 );
+ FloatSpinBox( float minValue, float maxValue, float step = 0.5, int precision = 2,
+ QWidget* parent=0, const char* name=0 );
+ virtual ~FloatSpinBox();
+
+ QString mapValueToText( int value );
+
+ int mapTextToValue( bool *ok );
+
+ float minValue () const;
+ float maxValue () const;
+ float value () const;
+ int precision() const;
+
+ public slots:
+ virtual void setMinValue ( float minValue );
+ virtual void setMaxValue ( float maxValue );
+ virtual void setValue ( float value );
+ virtual void setStep ( float step );
+ virtual void setPrecision( int value );
+ virtual void stepUp();
+ virtual void stepDown();
+
+ signals:
+ void valueChanged ( float value );
+ void valueHasChanged ();
+
+ private slots:
+ void internalValueChanged( int value );
+
+ private:
+ int m_precision_digits;
+ float m_value;
+ float m_minValue;
+ float m_maxValue;
+ bool m_useRange;
+ float m_step;
+ int m_oldIntVal;
+ float min( float a, float b) const
+ {
+ return (a < b) ? a : b;
+ }
+
+ float max( float a, float b) const
+ {
+ return (a > b) ? a : b;
+ }
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/geoip/FLAGS_LICENCE b/plugins/infowidget/geoip/FLAGS_LICENCE
new file mode 100644
index 0000000..368a8fe
--- /dev/null
+++ b/plugins/infowidget/geoip/FLAGS_LICENCE
@@ -0,0 +1,2 @@
+Flag images found at http://www.hahn-hotel.com/flags/
+"All sets provided by us are free to use to anyone, for commercial or non-commercial websites." \ No newline at end of file
diff --git a/plugins/infowidget/geoip/GeoIP-LICENSE.txt b/plugins/infowidget/geoip/GeoIP-LICENSE.txt
new file mode 100644
index 0000000..457710d
--- /dev/null
+++ b/plugins/infowidget/geoip/GeoIP-LICENSE.txt
@@ -0,0 +1,74 @@
+There are two licenses, one for the C library software, and one for
+the database.
+
+SOFTWARE LICENSE (C library)
+
+The GeoIP C Library is licensed under the GPL. For details see
+the COPYING file.
+
+OPEN DATA LICENSE (GeoIP Standard Edition Database)
+
+Copyright (c) 2003 MaxMind LLC. All Rights Reserved.
+
+All advertising materials and documentation mentioning features or use of
+this database must display the following acknowledgment:
+"This product includes GeoIP data created by MaxMind, available from
+http://maxmind.com/"
+
+Redistribution and use with or without modification, are permitted provided
+that the following conditions are met:
+1. Redistributions must retain the above copyright notice, this list of
+conditions and the following disclaimer in the documentation and/or other
+materials provided with the distribution.
+2. All advertising materials and documentation mentioning features or use of
+this database must display the following acknowledgement:
+"This product includes GeoIP data created by MaxMind, available from
+http://maxmind.com/"
+3. "MaxMind" may not be used to endorse or promote products derived from this
+database without specific prior written permission.
+
+THIS DATABASE IS PROVIDED BY MAXMIND.COM ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL MAXMIND.COM BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Some parts of this software distribution are derived from the APNIC, ARIN and
+RIPE databases (copyright details below). The author of this module makes no
+claims of ownership on those parts.
+
+APNIC conditions of use:
+
+The files are freely available for download and use on the condition that APNIC
+will not be held responsible for any loss or damage arising from the application
+of the information contained in these reports.
+
+APNIC endeavours to the best of its ability to ensure the accuracy of these
+reports; however, APNIC makes no guarantee in this regard.
+
+In particular, it should be noted that these reports seek to indicate the
+country where resources were first allocated or assigned. It is not intended
+that these reports be considered as an authoritative statement of the location
+in which any specific resource may currently be in use.
+
+ARIN database copyright:
+
+Copyright (c) American Registry for Internet Numbers. All rights reserved.
+
+RIPE database copyright:
+
+The information in the RIPE Database is available to the public for agreed
+Internet operation purposes, but is under copyright. The copyright statement is:
+
+"Except for agreed Internet operational purposes, no part of this publication
+may be reproduced, stored in a retrieval system, or transmitted, in any form or
+by any means, electronic, mechanical, recording, or otherwise, without prior
+permission of the RIPE NCC on behalf of the copyright holders. Any use of this
+material to target advertising or similar activities is explicitly forbidden and
+may be prosecuted. The RIPE NCC requests to be notified of any such activities
+or suspicions thereof."
diff --git a/plugins/infowidget/geoip/Makefile.am b/plugins/infowidget/geoip/Makefile.am
new file mode 100644
index 0000000..1a7d6c4
--- /dev/null
+++ b/plugins/infowidget/geoip/Makefile.am
@@ -0,0 +1,41 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/geoip
+
+if ENABLE_GEOIP
+GEOIP_FILES = geoip.dat GeoIP-LICENSE.txt
+else
+GEOIP_FILES =
+endif
+
+if ENABLE_BUILTIN_COUNTRY_FLAGS
+FLAG_FILES = ad.png ae.png af.png ag.png ai.png al.png am.png an.png ao.png \
+ aq.png ar.png as.png at.png au.png aw.png az.png ba.png bb.png bd.png be.png \
+ bf.png bg.png bh.png bi.png bj.png bm.png bn.png bo.png br.png bs.png bt.png \
+ bv.png bw.png by.png bz.png ca.png cc.png cd.png cf.png cg.png ch.png ci.png \
+ ck.png cl.png cm.png cn.png co.png cr.png cs.png cu.png cv.png cx.png cy.png \
+ cz.png de.png dj.png dk.png dm.png do.png dz.png ec.png ee.png eg.png eh.png \
+ er.png es.png et.png eu.png fi.png fj.png fk.png fm.png fo.png fr.png ga.png \
+ gb.png gd.png ge.png gf.png gh.png gi.png gl.png gm.png gn.png gp.png gq.png \
+ gr.png gs.png gt.png gu.png gw.png gy.png hk.png hm.png hn.png hr.png ht.png \
+ hu.png id.png ie.png il.png in.png io.png iq.png ir.png is.png it.png jm.png \
+ jo.png jp.png ke.png kg.png kh.png ki.png km.png kn.png kp.png kr.png kw.png \
+ ky.png kz.png la.png lb.png lc.png li.png lk.png lr.png ls.png lt.png lu.png \
+ lv.png ly.png ma.png mc.png md.png mg.png mh.png mk.png ml.png mm.png mn.png \
+ mo.png mp.png mq.png mr.png ms.png mt.png mu.png mv.png mw.png mx.png my.png \
+ mz.png na.png nc.png ne.png nf.png ng.png ni.png nl.png no.png np.png nr.png \
+ nu.png nz.png om.png pa.png pe.png pf.png pg.png ph.png pk.png pl.png pm.png \
+ pn.png pr.png ps.png pt.png pw.png py.png qa.png re.png ro.png ru.png rw.png \
+ sa.png sb.png sc.png sd.png se.png sg.png sh.png si.png sj.png sk.png sl.png \
+ sm.png sn.png so.png sr.png st.png sv.png sy.png sz.png tc.png td.png tf.png \
+ tg.png th.png tj.png tk.png tl.png tm.png tn.png to.png tp.png tr.png tt.png \
+ tv.png tw.png tz.png ua.png ug.png um.png us.png uy.png uz.png va.png vc.png \
+ ve.png vg.png vi.png vn.png vu.png wf.png ws.png ye.png yt.png yu.png za.png \
+ zm.png zw.png FLAGS_LICENCE
+else
+FLAG_FILES =
+endif
+
+ktdata_DATA = $(FLAG_FILES) $(GEOIP_FILES)
+
diff --git a/plugins/infowidget/geoip/ad.png b/plugins/infowidget/geoip/ad.png
new file mode 100644
index 0000000..bcf1e35
--- /dev/null
+++ b/plugins/infowidget/geoip/ad.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ae.png b/plugins/infowidget/geoip/ae.png
new file mode 100644
index 0000000..4ce8134
--- /dev/null
+++ b/plugins/infowidget/geoip/ae.png
Binary files differ
diff --git a/plugins/infowidget/geoip/af.png b/plugins/infowidget/geoip/af.png
new file mode 100644
index 0000000..14027c0
--- /dev/null
+++ b/plugins/infowidget/geoip/af.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ag.png b/plugins/infowidget/geoip/ag.png
new file mode 100644
index 0000000..93b3eb8
--- /dev/null
+++ b/plugins/infowidget/geoip/ag.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ai.png b/plugins/infowidget/geoip/ai.png
new file mode 100644
index 0000000..6aa3b55
--- /dev/null
+++ b/plugins/infowidget/geoip/ai.png
Binary files differ
diff --git a/plugins/infowidget/geoip/al.png b/plugins/infowidget/geoip/al.png
new file mode 100644
index 0000000..04f7c13
--- /dev/null
+++ b/plugins/infowidget/geoip/al.png
Binary files differ
diff --git a/plugins/infowidget/geoip/am.png b/plugins/infowidget/geoip/am.png
new file mode 100644
index 0000000..dbecf96
--- /dev/null
+++ b/plugins/infowidget/geoip/am.png
Binary files differ
diff --git a/plugins/infowidget/geoip/an.png b/plugins/infowidget/geoip/an.png
new file mode 100644
index 0000000..974daba
--- /dev/null
+++ b/plugins/infowidget/geoip/an.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ao.png b/plugins/infowidget/geoip/ao.png
new file mode 100644
index 0000000..5e08932
--- /dev/null
+++ b/plugins/infowidget/geoip/ao.png
Binary files differ
diff --git a/plugins/infowidget/geoip/aq.png b/plugins/infowidget/geoip/aq.png
new file mode 100644
index 0000000..b08a8b6
--- /dev/null
+++ b/plugins/infowidget/geoip/aq.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ar.png b/plugins/infowidget/geoip/ar.png
new file mode 100644
index 0000000..68c99d9
--- /dev/null
+++ b/plugins/infowidget/geoip/ar.png
Binary files differ
diff --git a/plugins/infowidget/geoip/as.png b/plugins/infowidget/geoip/as.png
new file mode 100644
index 0000000..5903f6c
--- /dev/null
+++ b/plugins/infowidget/geoip/as.png
Binary files differ
diff --git a/plugins/infowidget/geoip/at.png b/plugins/infowidget/geoip/at.png
new file mode 100644
index 0000000..1570d7a
--- /dev/null
+++ b/plugins/infowidget/geoip/at.png
Binary files differ
diff --git a/plugins/infowidget/geoip/au.png b/plugins/infowidget/geoip/au.png
new file mode 100644
index 0000000..486646b
--- /dev/null
+++ b/plugins/infowidget/geoip/au.png
Binary files differ
diff --git a/plugins/infowidget/geoip/aw.png b/plugins/infowidget/geoip/aw.png
new file mode 100644
index 0000000..5831bbe
--- /dev/null
+++ b/plugins/infowidget/geoip/aw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/az.png b/plugins/infowidget/geoip/az.png
new file mode 100644
index 0000000..420a871
--- /dev/null
+++ b/plugins/infowidget/geoip/az.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ba.png b/plugins/infowidget/geoip/ba.png
new file mode 100644
index 0000000..dff9671
--- /dev/null
+++ b/plugins/infowidget/geoip/ba.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bb.png b/plugins/infowidget/geoip/bb.png
new file mode 100644
index 0000000..1811232
--- /dev/null
+++ b/plugins/infowidget/geoip/bb.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bd.png b/plugins/infowidget/geoip/bd.png
new file mode 100644
index 0000000..034f07a
--- /dev/null
+++ b/plugins/infowidget/geoip/bd.png
Binary files differ
diff --git a/plugins/infowidget/geoip/be.png b/plugins/infowidget/geoip/be.png
new file mode 100644
index 0000000..4b50190
--- /dev/null
+++ b/plugins/infowidget/geoip/be.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bf.png b/plugins/infowidget/geoip/bf.png
new file mode 100644
index 0000000..4b522d8
--- /dev/null
+++ b/plugins/infowidget/geoip/bf.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bg.png b/plugins/infowidget/geoip/bg.png
new file mode 100644
index 0000000..60aae1d
--- /dev/null
+++ b/plugins/infowidget/geoip/bg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bh.png b/plugins/infowidget/geoip/bh.png
new file mode 100644
index 0000000..b6524c2
--- /dev/null
+++ b/plugins/infowidget/geoip/bh.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bi.png b/plugins/infowidget/geoip/bi.png
new file mode 100644
index 0000000..d4751e0
--- /dev/null
+++ b/plugins/infowidget/geoip/bi.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bj.png b/plugins/infowidget/geoip/bj.png
new file mode 100644
index 0000000..4dbfd3f
--- /dev/null
+++ b/plugins/infowidget/geoip/bj.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bm.png b/plugins/infowidget/geoip/bm.png
new file mode 100644
index 0000000..c178fe7
--- /dev/null
+++ b/plugins/infowidget/geoip/bm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bn.png b/plugins/infowidget/geoip/bn.png
new file mode 100644
index 0000000..291fc80
--- /dev/null
+++ b/plugins/infowidget/geoip/bn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bo.png b/plugins/infowidget/geoip/bo.png
new file mode 100644
index 0000000..ad2120b
--- /dev/null
+++ b/plugins/infowidget/geoip/bo.png
Binary files differ
diff --git a/plugins/infowidget/geoip/br.png b/plugins/infowidget/geoip/br.png
new file mode 100644
index 0000000..bd1b880
--- /dev/null
+++ b/plugins/infowidget/geoip/br.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bs.png b/plugins/infowidget/geoip/bs.png
new file mode 100644
index 0000000..5395236
--- /dev/null
+++ b/plugins/infowidget/geoip/bs.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bt.png b/plugins/infowidget/geoip/bt.png
new file mode 100644
index 0000000..ef1d430
--- /dev/null
+++ b/plugins/infowidget/geoip/bt.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bv.png b/plugins/infowidget/geoip/bv.png
new file mode 100644
index 0000000..ed4c76b
--- /dev/null
+++ b/plugins/infowidget/geoip/bv.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bw.png b/plugins/infowidget/geoip/bw.png
new file mode 100644
index 0000000..c69641b
--- /dev/null
+++ b/plugins/infowidget/geoip/bw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/by.png b/plugins/infowidget/geoip/by.png
new file mode 100644
index 0000000..655f0ae
--- /dev/null
+++ b/plugins/infowidget/geoip/by.png
Binary files differ
diff --git a/plugins/infowidget/geoip/bz.png b/plugins/infowidget/geoip/bz.png
new file mode 100644
index 0000000..92964f8
--- /dev/null
+++ b/plugins/infowidget/geoip/bz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ca.png b/plugins/infowidget/geoip/ca.png
new file mode 100644
index 0000000..757ea92
--- /dev/null
+++ b/plugins/infowidget/geoip/ca.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cc.png b/plugins/infowidget/geoip/cc.png
new file mode 100644
index 0000000..ba02461
--- /dev/null
+++ b/plugins/infowidget/geoip/cc.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cd.png b/plugins/infowidget/geoip/cd.png
new file mode 100644
index 0000000..6d6e96c
--- /dev/null
+++ b/plugins/infowidget/geoip/cd.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cf.png b/plugins/infowidget/geoip/cf.png
new file mode 100644
index 0000000..fa2b560
--- /dev/null
+++ b/plugins/infowidget/geoip/cf.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cg.png b/plugins/infowidget/geoip/cg.png
new file mode 100644
index 0000000..aae69bb
--- /dev/null
+++ b/plugins/infowidget/geoip/cg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ch.png b/plugins/infowidget/geoip/ch.png
new file mode 100644
index 0000000..aa2e8cd
--- /dev/null
+++ b/plugins/infowidget/geoip/ch.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ci.png b/plugins/infowidget/geoip/ci.png
new file mode 100644
index 0000000..b06b6e1
--- /dev/null
+++ b/plugins/infowidget/geoip/ci.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ck.png b/plugins/infowidget/geoip/ck.png
new file mode 100644
index 0000000..b70d582
--- /dev/null
+++ b/plugins/infowidget/geoip/ck.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cl.png b/plugins/infowidget/geoip/cl.png
new file mode 100644
index 0000000..148f2bc
--- /dev/null
+++ b/plugins/infowidget/geoip/cl.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cm.png b/plugins/infowidget/geoip/cm.png
new file mode 100644
index 0000000..f47d808
--- /dev/null
+++ b/plugins/infowidget/geoip/cm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cn.png b/plugins/infowidget/geoip/cn.png
new file mode 100644
index 0000000..f6c4a20
--- /dev/null
+++ b/plugins/infowidget/geoip/cn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/co.png b/plugins/infowidget/geoip/co.png
new file mode 100644
index 0000000..b6636cd
--- /dev/null
+++ b/plugins/infowidget/geoip/co.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cr.png b/plugins/infowidget/geoip/cr.png
new file mode 100644
index 0000000..f4c0d03
--- /dev/null
+++ b/plugins/infowidget/geoip/cr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cs.png b/plugins/infowidget/geoip/cs.png
new file mode 100644
index 0000000..f923c01
--- /dev/null
+++ b/plugins/infowidget/geoip/cs.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cu.png b/plugins/infowidget/geoip/cu.png
new file mode 100644
index 0000000..edc0752
--- /dev/null
+++ b/plugins/infowidget/geoip/cu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cv.png b/plugins/infowidget/geoip/cv.png
new file mode 100644
index 0000000..d6d1a76
--- /dev/null
+++ b/plugins/infowidget/geoip/cv.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cx.png b/plugins/infowidget/geoip/cx.png
new file mode 100644
index 0000000..452b405
--- /dev/null
+++ b/plugins/infowidget/geoip/cx.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cy.png b/plugins/infowidget/geoip/cy.png
new file mode 100644
index 0000000..6d6d36a
--- /dev/null
+++ b/plugins/infowidget/geoip/cy.png
Binary files differ
diff --git a/plugins/infowidget/geoip/cz.png b/plugins/infowidget/geoip/cz.png
new file mode 100644
index 0000000..1aaca40
--- /dev/null
+++ b/plugins/infowidget/geoip/cz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/de.png b/plugins/infowidget/geoip/de.png
new file mode 100644
index 0000000..fbbc44f
--- /dev/null
+++ b/plugins/infowidget/geoip/de.png
Binary files differ
diff --git a/plugins/infowidget/geoip/dj.png b/plugins/infowidget/geoip/dj.png
new file mode 100644
index 0000000..95d4e30
--- /dev/null
+++ b/plugins/infowidget/geoip/dj.png
Binary files differ
diff --git a/plugins/infowidget/geoip/dk.png b/plugins/infowidget/geoip/dk.png
new file mode 100644
index 0000000..6f60a4a
--- /dev/null
+++ b/plugins/infowidget/geoip/dk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/dm.png b/plugins/infowidget/geoip/dm.png
new file mode 100644
index 0000000..7f240cf
--- /dev/null
+++ b/plugins/infowidget/geoip/dm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/do.png b/plugins/infowidget/geoip/do.png
new file mode 100644
index 0000000..78360ad
--- /dev/null
+++ b/plugins/infowidget/geoip/do.png
Binary files differ
diff --git a/plugins/infowidget/geoip/dz.png b/plugins/infowidget/geoip/dz.png
new file mode 100644
index 0000000..8a53c6f
--- /dev/null
+++ b/plugins/infowidget/geoip/dz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ec.png b/plugins/infowidget/geoip/ec.png
new file mode 100644
index 0000000..aaac909
--- /dev/null
+++ b/plugins/infowidget/geoip/ec.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ee.png b/plugins/infowidget/geoip/ee.png
new file mode 100644
index 0000000..6258c3b
--- /dev/null
+++ b/plugins/infowidget/geoip/ee.png
Binary files differ
diff --git a/plugins/infowidget/geoip/eg.png b/plugins/infowidget/geoip/eg.png
new file mode 100644
index 0000000..8725af0
--- /dev/null
+++ b/plugins/infowidget/geoip/eg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/eh.png b/plugins/infowidget/geoip/eh.png
new file mode 100644
index 0000000..e142882
--- /dev/null
+++ b/plugins/infowidget/geoip/eh.png
Binary files differ
diff --git a/plugins/infowidget/geoip/er.png b/plugins/infowidget/geoip/er.png
new file mode 100644
index 0000000..dbd752c
--- /dev/null
+++ b/plugins/infowidget/geoip/er.png
Binary files differ
diff --git a/plugins/infowidget/geoip/es.png b/plugins/infowidget/geoip/es.png
new file mode 100644
index 0000000..dd4d184
--- /dev/null
+++ b/plugins/infowidget/geoip/es.png
Binary files differ
diff --git a/plugins/infowidget/geoip/et.png b/plugins/infowidget/geoip/et.png
new file mode 100644
index 0000000..e28bd0b
--- /dev/null
+++ b/plugins/infowidget/geoip/et.png
Binary files differ
diff --git a/plugins/infowidget/geoip/eu.png b/plugins/infowidget/geoip/eu.png
new file mode 100644
index 0000000..d25bdca
--- /dev/null
+++ b/plugins/infowidget/geoip/eu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/fi.png b/plugins/infowidget/geoip/fi.png
new file mode 100644
index 0000000..a198c11
--- /dev/null
+++ b/plugins/infowidget/geoip/fi.png
Binary files differ
diff --git a/plugins/infowidget/geoip/fj.png b/plugins/infowidget/geoip/fj.png
new file mode 100644
index 0000000..d3c3126
--- /dev/null
+++ b/plugins/infowidget/geoip/fj.png
Binary files differ
diff --git a/plugins/infowidget/geoip/fk.png b/plugins/infowidget/geoip/fk.png
new file mode 100644
index 0000000..7141415
--- /dev/null
+++ b/plugins/infowidget/geoip/fk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/fm.png b/plugins/infowidget/geoip/fm.png
new file mode 100644
index 0000000..05b7f0c
--- /dev/null
+++ b/plugins/infowidget/geoip/fm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/fo.png b/plugins/infowidget/geoip/fo.png
new file mode 100644
index 0000000..79311ec
--- /dev/null
+++ b/plugins/infowidget/geoip/fo.png
Binary files differ
diff --git a/plugins/infowidget/geoip/fr.png b/plugins/infowidget/geoip/fr.png
new file mode 100644
index 0000000..348ffa5
--- /dev/null
+++ b/plugins/infowidget/geoip/fr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ga.png b/plugins/infowidget/geoip/ga.png
new file mode 100644
index 0000000..643093f
--- /dev/null
+++ b/plugins/infowidget/geoip/ga.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gb.png b/plugins/infowidget/geoip/gb.png
new file mode 100644
index 0000000..45c8bc7
--- /dev/null
+++ b/plugins/infowidget/geoip/gb.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gd.png b/plugins/infowidget/geoip/gd.png
new file mode 100644
index 0000000..ad838b9
--- /dev/null
+++ b/plugins/infowidget/geoip/gd.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ge.png b/plugins/infowidget/geoip/ge.png
new file mode 100644
index 0000000..75d7c88
--- /dev/null
+++ b/plugins/infowidget/geoip/ge.png
Binary files differ
diff --git a/plugins/infowidget/geoip/geoip.dat b/plugins/infowidget/geoip/geoip.dat
new file mode 100644
index 0000000..11f1f6b
--- /dev/null
+++ b/plugins/infowidget/geoip/geoip.dat
Binary files differ
diff --git a/plugins/infowidget/geoip/gf.png b/plugins/infowidget/geoip/gf.png
new file mode 100644
index 0000000..37f4b07
--- /dev/null
+++ b/plugins/infowidget/geoip/gf.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gh.png b/plugins/infowidget/geoip/gh.png
new file mode 100644
index 0000000..798bc00
--- /dev/null
+++ b/plugins/infowidget/geoip/gh.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gi.png b/plugins/infowidget/geoip/gi.png
new file mode 100644
index 0000000..2839ba1
--- /dev/null
+++ b/plugins/infowidget/geoip/gi.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gl.png b/plugins/infowidget/geoip/gl.png
new file mode 100644
index 0000000..0690b6f
--- /dev/null
+++ b/plugins/infowidget/geoip/gl.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gm.png b/plugins/infowidget/geoip/gm.png
new file mode 100644
index 0000000..8bcb283
--- /dev/null
+++ b/plugins/infowidget/geoip/gm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gn.png b/plugins/infowidget/geoip/gn.png
new file mode 100644
index 0000000..48ee312
--- /dev/null
+++ b/plugins/infowidget/geoip/gn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gp.png b/plugins/infowidget/geoip/gp.png
new file mode 100644
index 0000000..e627bf2
--- /dev/null
+++ b/plugins/infowidget/geoip/gp.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gq.png b/plugins/infowidget/geoip/gq.png
new file mode 100644
index 0000000..4b9a1be
--- /dev/null
+++ b/plugins/infowidget/geoip/gq.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gr.png b/plugins/infowidget/geoip/gr.png
new file mode 100644
index 0000000..ce31c8b
--- /dev/null
+++ b/plugins/infowidget/geoip/gr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gs.png b/plugins/infowidget/geoip/gs.png
new file mode 100644
index 0000000..c0f3d5a
--- /dev/null
+++ b/plugins/infowidget/geoip/gs.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gt.png b/plugins/infowidget/geoip/gt.png
new file mode 100644
index 0000000..ed7113f
--- /dev/null
+++ b/plugins/infowidget/geoip/gt.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gu.png b/plugins/infowidget/geoip/gu.png
new file mode 100644
index 0000000..b59cb44
--- /dev/null
+++ b/plugins/infowidget/geoip/gu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gw.png b/plugins/infowidget/geoip/gw.png
new file mode 100644
index 0000000..075c5e2
--- /dev/null
+++ b/plugins/infowidget/geoip/gw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/gy.png b/plugins/infowidget/geoip/gy.png
new file mode 100644
index 0000000..fc64031
--- /dev/null
+++ b/plugins/infowidget/geoip/gy.png
Binary files differ
diff --git a/plugins/infowidget/geoip/hk.png b/plugins/infowidget/geoip/hk.png
new file mode 100644
index 0000000..c2baf31
--- /dev/null
+++ b/plugins/infowidget/geoip/hk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/hm.png b/plugins/infowidget/geoip/hm.png
new file mode 100644
index 0000000..ff84e0b
--- /dev/null
+++ b/plugins/infowidget/geoip/hm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/hn.png b/plugins/infowidget/geoip/hn.png
new file mode 100644
index 0000000..ff8d0ba
--- /dev/null
+++ b/plugins/infowidget/geoip/hn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/hr.png b/plugins/infowidget/geoip/hr.png
new file mode 100644
index 0000000..4965c41
--- /dev/null
+++ b/plugins/infowidget/geoip/hr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ht.png b/plugins/infowidget/geoip/ht.png
new file mode 100644
index 0000000..81541e3
--- /dev/null
+++ b/plugins/infowidget/geoip/ht.png
Binary files differ
diff --git a/plugins/infowidget/geoip/hu.png b/plugins/infowidget/geoip/hu.png
new file mode 100644
index 0000000..48afe0e
--- /dev/null
+++ b/plugins/infowidget/geoip/hu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/id.png b/plugins/infowidget/geoip/id.png
new file mode 100644
index 0000000..b824f31
--- /dev/null
+++ b/plugins/infowidget/geoip/id.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ie.png b/plugins/infowidget/geoip/ie.png
new file mode 100644
index 0000000..8f881c8
--- /dev/null
+++ b/plugins/infowidget/geoip/ie.png
Binary files differ
diff --git a/plugins/infowidget/geoip/il.png b/plugins/infowidget/geoip/il.png
new file mode 100644
index 0000000..68e273c
--- /dev/null
+++ b/plugins/infowidget/geoip/il.png
Binary files differ
diff --git a/plugins/infowidget/geoip/in.png b/plugins/infowidget/geoip/in.png
new file mode 100644
index 0000000..34abb74
--- /dev/null
+++ b/plugins/infowidget/geoip/in.png
Binary files differ
diff --git a/plugins/infowidget/geoip/io.png b/plugins/infowidget/geoip/io.png
new file mode 100644
index 0000000..f5dd57e
--- /dev/null
+++ b/plugins/infowidget/geoip/io.png
Binary files differ
diff --git a/plugins/infowidget/geoip/iq.png b/plugins/infowidget/geoip/iq.png
new file mode 100644
index 0000000..a457f80
--- /dev/null
+++ b/plugins/infowidget/geoip/iq.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ir.png b/plugins/infowidget/geoip/ir.png
new file mode 100644
index 0000000..eac13ef
--- /dev/null
+++ b/plugins/infowidget/geoip/ir.png
Binary files differ
diff --git a/plugins/infowidget/geoip/is.png b/plugins/infowidget/geoip/is.png
new file mode 100644
index 0000000..2089318
--- /dev/null
+++ b/plugins/infowidget/geoip/is.png
Binary files differ
diff --git a/plugins/infowidget/geoip/it.png b/plugins/infowidget/geoip/it.png
new file mode 100644
index 0000000..09836d1
--- /dev/null
+++ b/plugins/infowidget/geoip/it.png
Binary files differ
diff --git a/plugins/infowidget/geoip/jm.png b/plugins/infowidget/geoip/jm.png
new file mode 100644
index 0000000..7fdfb37
--- /dev/null
+++ b/plugins/infowidget/geoip/jm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/jo.png b/plugins/infowidget/geoip/jo.png
new file mode 100644
index 0000000..2b5077f
--- /dev/null
+++ b/plugins/infowidget/geoip/jo.png
Binary files differ
diff --git a/plugins/infowidget/geoip/jp.png b/plugins/infowidget/geoip/jp.png
new file mode 100644
index 0000000..98cd271
--- /dev/null
+++ b/plugins/infowidget/geoip/jp.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ke.png b/plugins/infowidget/geoip/ke.png
new file mode 100644
index 0000000..8192eb8
--- /dev/null
+++ b/plugins/infowidget/geoip/ke.png
Binary files differ
diff --git a/plugins/infowidget/geoip/kg.png b/plugins/infowidget/geoip/kg.png
new file mode 100644
index 0000000..846e83f
--- /dev/null
+++ b/plugins/infowidget/geoip/kg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/kh.png b/plugins/infowidget/geoip/kh.png
new file mode 100644
index 0000000..e8b4481
--- /dev/null
+++ b/plugins/infowidget/geoip/kh.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ki.png b/plugins/infowidget/geoip/ki.png
new file mode 100644
index 0000000..b6e05c6
--- /dev/null
+++ b/plugins/infowidget/geoip/ki.png
Binary files differ
diff --git a/plugins/infowidget/geoip/km.png b/plugins/infowidget/geoip/km.png
new file mode 100644
index 0000000..cf3823a
--- /dev/null
+++ b/plugins/infowidget/geoip/km.png
Binary files differ
diff --git a/plugins/infowidget/geoip/kn.png b/plugins/infowidget/geoip/kn.png
new file mode 100644
index 0000000..82320ae
--- /dev/null
+++ b/plugins/infowidget/geoip/kn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/kp.png b/plugins/infowidget/geoip/kp.png
new file mode 100644
index 0000000..7d86c9f
--- /dev/null
+++ b/plugins/infowidget/geoip/kp.png
Binary files differ
diff --git a/plugins/infowidget/geoip/kr.png b/plugins/infowidget/geoip/kr.png
new file mode 100644
index 0000000..93231a8
--- /dev/null
+++ b/plugins/infowidget/geoip/kr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/kw.png b/plugins/infowidget/geoip/kw.png
new file mode 100644
index 0000000..11a64ba
--- /dev/null
+++ b/plugins/infowidget/geoip/kw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ky.png b/plugins/infowidget/geoip/ky.png
new file mode 100644
index 0000000..94ec427
--- /dev/null
+++ b/plugins/infowidget/geoip/ky.png
Binary files differ
diff --git a/plugins/infowidget/geoip/kz.png b/plugins/infowidget/geoip/kz.png
new file mode 100644
index 0000000..d2061c3
--- /dev/null
+++ b/plugins/infowidget/geoip/kz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/la.png b/plugins/infowidget/geoip/la.png
new file mode 100644
index 0000000..d15f089
--- /dev/null
+++ b/plugins/infowidget/geoip/la.png
Binary files differ
diff --git a/plugins/infowidget/geoip/lb.png b/plugins/infowidget/geoip/lb.png
new file mode 100644
index 0000000..c560362
--- /dev/null
+++ b/plugins/infowidget/geoip/lb.png
Binary files differ
diff --git a/plugins/infowidget/geoip/lc.png b/plugins/infowidget/geoip/lc.png
new file mode 100644
index 0000000..bdbe4ea
--- /dev/null
+++ b/plugins/infowidget/geoip/lc.png
Binary files differ
diff --git a/plugins/infowidget/geoip/li.png b/plugins/infowidget/geoip/li.png
new file mode 100644
index 0000000..82ed982
--- /dev/null
+++ b/plugins/infowidget/geoip/li.png
Binary files differ
diff --git a/plugins/infowidget/geoip/lk.png b/plugins/infowidget/geoip/lk.png
new file mode 100644
index 0000000..ea3ec46
--- /dev/null
+++ b/plugins/infowidget/geoip/lk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/lr.png b/plugins/infowidget/geoip/lr.png
new file mode 100644
index 0000000..bc55adf
--- /dev/null
+++ b/plugins/infowidget/geoip/lr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ls.png b/plugins/infowidget/geoip/ls.png
new file mode 100644
index 0000000..79cd5ad
--- /dev/null
+++ b/plugins/infowidget/geoip/ls.png
Binary files differ
diff --git a/plugins/infowidget/geoip/lt.png b/plugins/infowidget/geoip/lt.png
new file mode 100644
index 0000000..d865e39
--- /dev/null
+++ b/plugins/infowidget/geoip/lt.png
Binary files differ
diff --git a/plugins/infowidget/geoip/lu.png b/plugins/infowidget/geoip/lu.png
new file mode 100644
index 0000000..740a8f7
--- /dev/null
+++ b/plugins/infowidget/geoip/lu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/lv.png b/plugins/infowidget/geoip/lv.png
new file mode 100644
index 0000000..d59a1fc
--- /dev/null
+++ b/plugins/infowidget/geoip/lv.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ly.png b/plugins/infowidget/geoip/ly.png
new file mode 100644
index 0000000..5cb02fb
--- /dev/null
+++ b/plugins/infowidget/geoip/ly.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ma.png b/plugins/infowidget/geoip/ma.png
new file mode 100644
index 0000000..2737e19
--- /dev/null
+++ b/plugins/infowidget/geoip/ma.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mc.png b/plugins/infowidget/geoip/mc.png
new file mode 100644
index 0000000..cfa1b92
--- /dev/null
+++ b/plugins/infowidget/geoip/mc.png
Binary files differ
diff --git a/plugins/infowidget/geoip/md.png b/plugins/infowidget/geoip/md.png
new file mode 100644
index 0000000..b88c574
--- /dev/null
+++ b/plugins/infowidget/geoip/md.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mg.png b/plugins/infowidget/geoip/mg.png
new file mode 100644
index 0000000..33d38af
--- /dev/null
+++ b/plugins/infowidget/geoip/mg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mh.png b/plugins/infowidget/geoip/mh.png
new file mode 100644
index 0000000..344d3ae
--- /dev/null
+++ b/plugins/infowidget/geoip/mh.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mk.png b/plugins/infowidget/geoip/mk.png
new file mode 100644
index 0000000..af3cd2c
--- /dev/null
+++ b/plugins/infowidget/geoip/mk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ml.png b/plugins/infowidget/geoip/ml.png
new file mode 100644
index 0000000..bbc8c61
--- /dev/null
+++ b/plugins/infowidget/geoip/ml.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mm.png b/plugins/infowidget/geoip/mm.png
new file mode 100644
index 0000000..f1c021a
--- /dev/null
+++ b/plugins/infowidget/geoip/mm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mn.png b/plugins/infowidget/geoip/mn.png
new file mode 100644
index 0000000..5662c2e
--- /dev/null
+++ b/plugins/infowidget/geoip/mn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mo.png b/plugins/infowidget/geoip/mo.png
new file mode 100644
index 0000000..68bdd10
--- /dev/null
+++ b/plugins/infowidget/geoip/mo.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mp.png b/plugins/infowidget/geoip/mp.png
new file mode 100644
index 0000000..cec5b93
--- /dev/null
+++ b/plugins/infowidget/geoip/mp.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mq.png b/plugins/infowidget/geoip/mq.png
new file mode 100644
index 0000000..6704e60
--- /dev/null
+++ b/plugins/infowidget/geoip/mq.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mr.png b/plugins/infowidget/geoip/mr.png
new file mode 100644
index 0000000..7b37d98
--- /dev/null
+++ b/plugins/infowidget/geoip/mr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ms.png b/plugins/infowidget/geoip/ms.png
new file mode 100644
index 0000000..487b59b
--- /dev/null
+++ b/plugins/infowidget/geoip/ms.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mt.png b/plugins/infowidget/geoip/mt.png
new file mode 100644
index 0000000..2cd7bb9
--- /dev/null
+++ b/plugins/infowidget/geoip/mt.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mu.png b/plugins/infowidget/geoip/mu.png
new file mode 100644
index 0000000..d57f15e
--- /dev/null
+++ b/plugins/infowidget/geoip/mu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mv.png b/plugins/infowidget/geoip/mv.png
new file mode 100644
index 0000000..4972a4c
--- /dev/null
+++ b/plugins/infowidget/geoip/mv.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mw.png b/plugins/infowidget/geoip/mw.png
new file mode 100644
index 0000000..9086528
--- /dev/null
+++ b/plugins/infowidget/geoip/mw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mx.png b/plugins/infowidget/geoip/mx.png
new file mode 100644
index 0000000..c68a926
--- /dev/null
+++ b/plugins/infowidget/geoip/mx.png
Binary files differ
diff --git a/plugins/infowidget/geoip/my.png b/plugins/infowidget/geoip/my.png
new file mode 100644
index 0000000..2989d2e
--- /dev/null
+++ b/plugins/infowidget/geoip/my.png
Binary files differ
diff --git a/plugins/infowidget/geoip/mz.png b/plugins/infowidget/geoip/mz.png
new file mode 100644
index 0000000..7281b03
--- /dev/null
+++ b/plugins/infowidget/geoip/mz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/na.png b/plugins/infowidget/geoip/na.png
new file mode 100644
index 0000000..258c942
--- /dev/null
+++ b/plugins/infowidget/geoip/na.png
Binary files differ
diff --git a/plugins/infowidget/geoip/nc.png b/plugins/infowidget/geoip/nc.png
new file mode 100644
index 0000000..2abf002
--- /dev/null
+++ b/plugins/infowidget/geoip/nc.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ne.png b/plugins/infowidget/geoip/ne.png
new file mode 100644
index 0000000..d0c59a1
--- /dev/null
+++ b/plugins/infowidget/geoip/ne.png
Binary files differ
diff --git a/plugins/infowidget/geoip/nf.png b/plugins/infowidget/geoip/nf.png
new file mode 100644
index 0000000..a119153
--- /dev/null
+++ b/plugins/infowidget/geoip/nf.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ng.png b/plugins/infowidget/geoip/ng.png
new file mode 100644
index 0000000..44492e1
--- /dev/null
+++ b/plugins/infowidget/geoip/ng.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ni.png b/plugins/infowidget/geoip/ni.png
new file mode 100644
index 0000000..805b800
--- /dev/null
+++ b/plugins/infowidget/geoip/ni.png
Binary files differ
diff --git a/plugins/infowidget/geoip/nl.png b/plugins/infowidget/geoip/nl.png
new file mode 100644
index 0000000..24b3e42
--- /dev/null
+++ b/plugins/infowidget/geoip/nl.png
Binary files differ
diff --git a/plugins/infowidget/geoip/no.png b/plugins/infowidget/geoip/no.png
new file mode 100644
index 0000000..c5d3441
--- /dev/null
+++ b/plugins/infowidget/geoip/no.png
Binary files differ
diff --git a/plugins/infowidget/geoip/np.png b/plugins/infowidget/geoip/np.png
new file mode 100644
index 0000000..35856b5
--- /dev/null
+++ b/plugins/infowidget/geoip/np.png
Binary files differ
diff --git a/plugins/infowidget/geoip/nr.png b/plugins/infowidget/geoip/nr.png
new file mode 100644
index 0000000..e0a801e
--- /dev/null
+++ b/plugins/infowidget/geoip/nr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/nu.png b/plugins/infowidget/geoip/nu.png
new file mode 100644
index 0000000..561ca9e
--- /dev/null
+++ b/plugins/infowidget/geoip/nu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/nz.png b/plugins/infowidget/geoip/nz.png
new file mode 100644
index 0000000..2e2cb1b
--- /dev/null
+++ b/plugins/infowidget/geoip/nz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/om.png b/plugins/infowidget/geoip/om.png
new file mode 100644
index 0000000..f6a8b4f
--- /dev/null
+++ b/plugins/infowidget/geoip/om.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pa.png b/plugins/infowidget/geoip/pa.png
new file mode 100644
index 0000000..97c3335
--- /dev/null
+++ b/plugins/infowidget/geoip/pa.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pe.png b/plugins/infowidget/geoip/pe.png
new file mode 100644
index 0000000..3b8bdf8
--- /dev/null
+++ b/plugins/infowidget/geoip/pe.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pf.png b/plugins/infowidget/geoip/pf.png
new file mode 100644
index 0000000..8b25d20
--- /dev/null
+++ b/plugins/infowidget/geoip/pf.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pg.png b/plugins/infowidget/geoip/pg.png
new file mode 100644
index 0000000..1e2ba72
--- /dev/null
+++ b/plugins/infowidget/geoip/pg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ph.png b/plugins/infowidget/geoip/ph.png
new file mode 100644
index 0000000..6758586
--- /dev/null
+++ b/plugins/infowidget/geoip/ph.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pk.png b/plugins/infowidget/geoip/pk.png
new file mode 100644
index 0000000..fb7d7a4
--- /dev/null
+++ b/plugins/infowidget/geoip/pk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pl.png b/plugins/infowidget/geoip/pl.png
new file mode 100644
index 0000000..d0d71b7
--- /dev/null
+++ b/plugins/infowidget/geoip/pl.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pm.png b/plugins/infowidget/geoip/pm.png
new file mode 100644
index 0000000..bb7b62e
--- /dev/null
+++ b/plugins/infowidget/geoip/pm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pn.png b/plugins/infowidget/geoip/pn.png
new file mode 100644
index 0000000..727b47e
--- /dev/null
+++ b/plugins/infowidget/geoip/pn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pr.png b/plugins/infowidget/geoip/pr.png
new file mode 100644
index 0000000..4487e33
--- /dev/null
+++ b/plugins/infowidget/geoip/pr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ps.png b/plugins/infowidget/geoip/ps.png
new file mode 100644
index 0000000..0a26426
--- /dev/null
+++ b/plugins/infowidget/geoip/ps.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pt.png b/plugins/infowidget/geoip/pt.png
new file mode 100644
index 0000000..8dbc9c9
--- /dev/null
+++ b/plugins/infowidget/geoip/pt.png
Binary files differ
diff --git a/plugins/infowidget/geoip/pw.png b/plugins/infowidget/geoip/pw.png
new file mode 100644
index 0000000..6a79ad8
--- /dev/null
+++ b/plugins/infowidget/geoip/pw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/py.png b/plugins/infowidget/geoip/py.png
new file mode 100644
index 0000000..79fb185
--- /dev/null
+++ b/plugins/infowidget/geoip/py.png
Binary files differ
diff --git a/plugins/infowidget/geoip/qa.png b/plugins/infowidget/geoip/qa.png
new file mode 100644
index 0000000..c74d326
--- /dev/null
+++ b/plugins/infowidget/geoip/qa.png
Binary files differ
diff --git a/plugins/infowidget/geoip/re.png b/plugins/infowidget/geoip/re.png
new file mode 100644
index 0000000..07ba0c7
--- /dev/null
+++ b/plugins/infowidget/geoip/re.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ro.png b/plugins/infowidget/geoip/ro.png
new file mode 100644
index 0000000..09eee0e
--- /dev/null
+++ b/plugins/infowidget/geoip/ro.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ru.png b/plugins/infowidget/geoip/ru.png
new file mode 100644
index 0000000..7944b95
--- /dev/null
+++ b/plugins/infowidget/geoip/ru.png
Binary files differ
diff --git a/plugins/infowidget/geoip/rw.png b/plugins/infowidget/geoip/rw.png
new file mode 100644
index 0000000..1526936
--- /dev/null
+++ b/plugins/infowidget/geoip/rw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sa.png b/plugins/infowidget/geoip/sa.png
new file mode 100644
index 0000000..5d9420d
--- /dev/null
+++ b/plugins/infowidget/geoip/sa.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sb.png b/plugins/infowidget/geoip/sb.png
new file mode 100644
index 0000000..50a584e
--- /dev/null
+++ b/plugins/infowidget/geoip/sb.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sc.png b/plugins/infowidget/geoip/sc.png
new file mode 100644
index 0000000..0f1ea8c
--- /dev/null
+++ b/plugins/infowidget/geoip/sc.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sd.png b/plugins/infowidget/geoip/sd.png
new file mode 100644
index 0000000..cfd32d9
--- /dev/null
+++ b/plugins/infowidget/geoip/sd.png
Binary files differ
diff --git a/plugins/infowidget/geoip/se.png b/plugins/infowidget/geoip/se.png
new file mode 100644
index 0000000..ba49b92
--- /dev/null
+++ b/plugins/infowidget/geoip/se.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sg.png b/plugins/infowidget/geoip/sg.png
new file mode 100644
index 0000000..db17483
--- /dev/null
+++ b/plugins/infowidget/geoip/sg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sh.png b/plugins/infowidget/geoip/sh.png
new file mode 100644
index 0000000..fa95fc4
--- /dev/null
+++ b/plugins/infowidget/geoip/sh.png
Binary files differ
diff --git a/plugins/infowidget/geoip/si.png b/plugins/infowidget/geoip/si.png
new file mode 100644
index 0000000..420c623
--- /dev/null
+++ b/plugins/infowidget/geoip/si.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sj.png b/plugins/infowidget/geoip/sj.png
new file mode 100644
index 0000000..316e9e8
--- /dev/null
+++ b/plugins/infowidget/geoip/sj.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sk.png b/plugins/infowidget/geoip/sk.png
new file mode 100644
index 0000000..1abf082
--- /dev/null
+++ b/plugins/infowidget/geoip/sk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sl.png b/plugins/infowidget/geoip/sl.png
new file mode 100644
index 0000000..824f979
--- /dev/null
+++ b/plugins/infowidget/geoip/sl.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sm.png b/plugins/infowidget/geoip/sm.png
new file mode 100644
index 0000000..e9d4f2b
--- /dev/null
+++ b/plugins/infowidget/geoip/sm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sn.png b/plugins/infowidget/geoip/sn.png
new file mode 100644
index 0000000..c9b026a
--- /dev/null
+++ b/plugins/infowidget/geoip/sn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/so.png b/plugins/infowidget/geoip/so.png
new file mode 100644
index 0000000..c7c155d
--- /dev/null
+++ b/plugins/infowidget/geoip/so.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sr.png b/plugins/infowidget/geoip/sr.png
new file mode 100644
index 0000000..b838461
--- /dev/null
+++ b/plugins/infowidget/geoip/sr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/st.png b/plugins/infowidget/geoip/st.png
new file mode 100644
index 0000000..1be3857
--- /dev/null
+++ b/plugins/infowidget/geoip/st.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sv.png b/plugins/infowidget/geoip/sv.png
new file mode 100644
index 0000000..fc5c5b5
--- /dev/null
+++ b/plugins/infowidget/geoip/sv.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sy.png b/plugins/infowidget/geoip/sy.png
new file mode 100644
index 0000000..87a102d
--- /dev/null
+++ b/plugins/infowidget/geoip/sy.png
Binary files differ
diff --git a/plugins/infowidget/geoip/sz.png b/plugins/infowidget/geoip/sz.png
new file mode 100644
index 0000000..847704f
--- /dev/null
+++ b/plugins/infowidget/geoip/sz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tc.png b/plugins/infowidget/geoip/tc.png
new file mode 100644
index 0000000..a2dd1e3
--- /dev/null
+++ b/plugins/infowidget/geoip/tc.png
Binary files differ
diff --git a/plugins/infowidget/geoip/td.png b/plugins/infowidget/geoip/td.png
new file mode 100644
index 0000000..8d76050
--- /dev/null
+++ b/plugins/infowidget/geoip/td.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tf.png b/plugins/infowidget/geoip/tf.png
new file mode 100644
index 0000000..8b14629
--- /dev/null
+++ b/plugins/infowidget/geoip/tf.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tg.png b/plugins/infowidget/geoip/tg.png
new file mode 100644
index 0000000..1ab1584
--- /dev/null
+++ b/plugins/infowidget/geoip/tg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/th.png b/plugins/infowidget/geoip/th.png
new file mode 100644
index 0000000..b4af833
--- /dev/null
+++ b/plugins/infowidget/geoip/th.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tj.png b/plugins/infowidget/geoip/tj.png
new file mode 100644
index 0000000..bc08004
--- /dev/null
+++ b/plugins/infowidget/geoip/tj.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tk.png b/plugins/infowidget/geoip/tk.png
new file mode 100644
index 0000000..d18f222
--- /dev/null
+++ b/plugins/infowidget/geoip/tk.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tl.png b/plugins/infowidget/geoip/tl.png
new file mode 100644
index 0000000..3a5a3df
--- /dev/null
+++ b/plugins/infowidget/geoip/tl.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tm.png b/plugins/infowidget/geoip/tm.png
new file mode 100644
index 0000000..bdde4d2
--- /dev/null
+++ b/plugins/infowidget/geoip/tm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tn.png b/plugins/infowidget/geoip/tn.png
new file mode 100644
index 0000000..b1d8786
--- /dev/null
+++ b/plugins/infowidget/geoip/tn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/to.png b/plugins/infowidget/geoip/to.png
new file mode 100644
index 0000000..9ffad3f
--- /dev/null
+++ b/plugins/infowidget/geoip/to.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tp.png b/plugins/infowidget/geoip/tp.png
new file mode 100644
index 0000000..2f9e1c5
--- /dev/null
+++ b/plugins/infowidget/geoip/tp.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tr.png b/plugins/infowidget/geoip/tr.png
new file mode 100644
index 0000000..834ff3b
--- /dev/null
+++ b/plugins/infowidget/geoip/tr.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tt.png b/plugins/infowidget/geoip/tt.png
new file mode 100644
index 0000000..8a4697e
--- /dev/null
+++ b/plugins/infowidget/geoip/tt.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tv.png b/plugins/infowidget/geoip/tv.png
new file mode 100644
index 0000000..3cf5a6a
--- /dev/null
+++ b/plugins/infowidget/geoip/tv.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tw.png b/plugins/infowidget/geoip/tw.png
new file mode 100644
index 0000000..612811e
--- /dev/null
+++ b/plugins/infowidget/geoip/tw.png
Binary files differ
diff --git a/plugins/infowidget/geoip/tz.png b/plugins/infowidget/geoip/tz.png
new file mode 100644
index 0000000..38cf2ae
--- /dev/null
+++ b/plugins/infowidget/geoip/tz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ua.png b/plugins/infowidget/geoip/ua.png
new file mode 100644
index 0000000..b1f05dd
--- /dev/null
+++ b/plugins/infowidget/geoip/ua.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ug.png b/plugins/infowidget/geoip/ug.png
new file mode 100644
index 0000000..9e18382
--- /dev/null
+++ b/plugins/infowidget/geoip/ug.png
Binary files differ
diff --git a/plugins/infowidget/geoip/um.png b/plugins/infowidget/geoip/um.png
new file mode 100644
index 0000000..02abc0f
--- /dev/null
+++ b/plugins/infowidget/geoip/um.png
Binary files differ
diff --git a/plugins/infowidget/geoip/us.png b/plugins/infowidget/geoip/us.png
new file mode 100644
index 0000000..21aedb8
--- /dev/null
+++ b/plugins/infowidget/geoip/us.png
Binary files differ
diff --git a/plugins/infowidget/geoip/uy.png b/plugins/infowidget/geoip/uy.png
new file mode 100644
index 0000000..94b3e69
--- /dev/null
+++ b/plugins/infowidget/geoip/uy.png
Binary files differ
diff --git a/plugins/infowidget/geoip/uz.png b/plugins/infowidget/geoip/uz.png
new file mode 100644
index 0000000..f336c66
--- /dev/null
+++ b/plugins/infowidget/geoip/uz.png
Binary files differ
diff --git a/plugins/infowidget/geoip/va.png b/plugins/infowidget/geoip/va.png
new file mode 100644
index 0000000..bd6488a
--- /dev/null
+++ b/plugins/infowidget/geoip/va.png
Binary files differ
diff --git a/plugins/infowidget/geoip/vc.png b/plugins/infowidget/geoip/vc.png
new file mode 100644
index 0000000..6b697e6
--- /dev/null
+++ b/plugins/infowidget/geoip/vc.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ve.png b/plugins/infowidget/geoip/ve.png
new file mode 100644
index 0000000..3fbf630
--- /dev/null
+++ b/plugins/infowidget/geoip/ve.png
Binary files differ
diff --git a/plugins/infowidget/geoip/vg.png b/plugins/infowidget/geoip/vg.png
new file mode 100644
index 0000000..6ebc938
--- /dev/null
+++ b/plugins/infowidget/geoip/vg.png
Binary files differ
diff --git a/plugins/infowidget/geoip/vi.png b/plugins/infowidget/geoip/vi.png
new file mode 100644
index 0000000..d98b021
--- /dev/null
+++ b/plugins/infowidget/geoip/vi.png
Binary files differ
diff --git a/plugins/infowidget/geoip/vn.png b/plugins/infowidget/geoip/vn.png
new file mode 100644
index 0000000..23add83
--- /dev/null
+++ b/plugins/infowidget/geoip/vn.png
Binary files differ
diff --git a/plugins/infowidget/geoip/vu.png b/plugins/infowidget/geoip/vu.png
new file mode 100644
index 0000000..131d19a
--- /dev/null
+++ b/plugins/infowidget/geoip/vu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/wf.png b/plugins/infowidget/geoip/wf.png
new file mode 100644
index 0000000..9576dc7
--- /dev/null
+++ b/plugins/infowidget/geoip/wf.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ws.png b/plugins/infowidget/geoip/ws.png
new file mode 100644
index 0000000..dc44158
--- /dev/null
+++ b/plugins/infowidget/geoip/ws.png
Binary files differ
diff --git a/plugins/infowidget/geoip/ye.png b/plugins/infowidget/geoip/ye.png
new file mode 100644
index 0000000..245f46f
--- /dev/null
+++ b/plugins/infowidget/geoip/ye.png
Binary files differ
diff --git a/plugins/infowidget/geoip/yt.png b/plugins/infowidget/geoip/yt.png
new file mode 100644
index 0000000..3e6ef07
--- /dev/null
+++ b/plugins/infowidget/geoip/yt.png
Binary files differ
diff --git a/plugins/infowidget/geoip/yu.png b/plugins/infowidget/geoip/yu.png
new file mode 100644
index 0000000..b00030c
--- /dev/null
+++ b/plugins/infowidget/geoip/yu.png
Binary files differ
diff --git a/plugins/infowidget/geoip/za.png b/plugins/infowidget/geoip/za.png
new file mode 100644
index 0000000..c601244
--- /dev/null
+++ b/plugins/infowidget/geoip/za.png
Binary files differ
diff --git a/plugins/infowidget/geoip/zm.png b/plugins/infowidget/geoip/zm.png
new file mode 100644
index 0000000..201f4cf
--- /dev/null
+++ b/plugins/infowidget/geoip/zm.png
Binary files differ
diff --git a/plugins/infowidget/geoip/zw.png b/plugins/infowidget/geoip/zw.png
new file mode 100644
index 0000000..66754d4
--- /dev/null
+++ b/plugins/infowidget/geoip/zw.png
Binary files differ
diff --git a/plugins/infowidget/infowidgetplugin.cpp b/plugins/infowidget/infowidgetplugin.cpp
new file mode 100644
index 0000000..4957c48
--- /dev/null
+++ b/plugins/infowidget/infowidgetplugin.cpp
@@ -0,0 +1,244 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qscrollview.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <interfaces/coreinterface.h>
+#include <interfaces/guiinterface.h>
+#include <interfaces/torrentinterface.h>
+
+#include "infowidgetplugin.h"
+#include "infowidgetprefpage.h"
+#include "statustab.h"
+#include "fileview.h"
+#include "chunkdownloadview.h"
+#include "peerview.h"
+#include "trackerview.h"
+#include "infowidgetpluginsettings.h"
+#include "ktorrentmonitor.h"
+
+
+#define NAME "Info Widget"
+#define AUTHOR "Joris Guisson"
+#define EMAIL "joris.guisson@gmail.com"
+
+
+K_EXPORT_COMPONENT_FACTORY(ktinfowidgetplugin,KGenericFactory<kt::InfoWidgetPlugin>("ktinfowidgetplugin"))
+
+namespace kt
+{
+
+
+ InfoWidgetPlugin::InfoWidgetPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("Info Widget"),AUTHOR,EMAIL,
+ i18n("Shows additional information about a download. Like which chunks have been downloaded, how many seeders and leechers ..."),
+ "ktinfowidget")
+ {
+ pref = 0;
+ peer_view = 0;
+ cd_view = 0;
+ tracker_view = 0;
+ file_view = 0;
+ status_tab = 0;
+ monitor = 0;
+ }
+
+
+ InfoWidgetPlugin::~InfoWidgetPlugin()
+ {}
+
+
+ void InfoWidgetPlugin::load()
+ {
+ status_tab = new StatusTab(0);
+ file_view = new FileView(0);
+
+ pref = new InfoWidgetPrefPage(this);
+ getGUI()->addViewListener(this);
+ getGUI()->addToolWidget(status_tab,"info",i18n("Status"),GUIInterface::DOCK_BOTTOM);
+ getGUI()->addToolWidget(file_view,"folder",i18n("Files"),GUIInterface::DOCK_BOTTOM);
+
+ showPeerView( InfoWidgetPluginSettings::showPeerView() );
+ showChunkView( InfoWidgetPluginSettings::showChunkView() );
+ showTrackerView( InfoWidgetPluginSettings::showTrackersView() );
+
+ getGUI()->addPrefPage(pref);
+ currentTorrentChanged(const_cast<kt::TorrentInterface*>(getGUI()->getCurrentTorrent()));
+
+ file_view->restoreLayout(KGlobal::config(),"FileView");
+ }
+
+ void InfoWidgetPlugin::unload()
+ {
+ if (cd_view)
+ cd_view->saveLayout(KGlobal::config(),"ChunkDownloadView");
+ if (peer_view)
+ peer_view->saveLayout(KGlobal::config(),"PeerView");
+ if (file_view)
+ file_view->saveLayout(KGlobal::config(),"FileView");
+
+ getGUI()->removeViewListener(this);
+ getGUI()->removePrefPage(pref);
+ getGUI()->removeToolWidget(status_tab);
+ getGUI()->removeToolWidget(file_view);
+ if (cd_view)
+ getGUI()->removeToolWidget(cd_view);
+ if (tracker_view)
+ getGUI()->removeToolWidget(tracker_view);
+ if (peer_view)
+ getGUI()->removeToolWidget(peer_view);
+
+ delete monitor;
+ monitor = 0;
+ delete status_tab;
+ status_tab = 0;
+ delete file_view;
+ file_view = 0;
+ delete cd_view;
+ cd_view = 0;
+ delete peer_view;
+ peer_view = 0;
+ delete tracker_view;
+ tracker_view = 0;
+ delete pref;
+ pref = 0;
+ }
+
+ void InfoWidgetPlugin::guiUpdate()
+ {
+ if (status_tab && status_tab->isVisible())
+ status_tab->update();
+
+ if (file_view && file_view->isVisible())
+ file_view->update();
+
+ if (peer_view && peer_view->isVisible())
+ peer_view->update();
+
+ if (cd_view && cd_view->isVisible())
+ cd_view->update();
+
+ if (tracker_view && tracker_view->isVisible())
+ tracker_view->update();
+ }
+
+ void InfoWidgetPlugin::currentTorrentChanged(TorrentInterface* tc)
+ {
+ if (status_tab)
+ status_tab->changeTC(tc);
+ if (file_view)
+ file_view->changeTC(tc);
+ if (cd_view)
+ cd_view->changeTC(tc);
+ if (tracker_view)
+ tracker_view->changeTC(tc);
+
+ if (peer_view)
+ peer_view->setEnabled(tc != 0);
+
+ createMonitor(tc);
+ }
+
+ bool InfoWidgetPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+
+
+ void InfoWidgetPlugin::showPeerView(bool show)
+ {
+ kt::TorrentInterface* tc = const_cast<kt::TorrentInterface*>(getGUI()->getCurrentTorrent());
+
+ if (show && !peer_view)
+ {
+ peer_view = new PeerView(0);
+ getGUI()->addToolWidget(peer_view,"kdmconfig",i18n("Peers"),GUIInterface::DOCK_BOTTOM);
+
+ peer_view->restoreLayout(KGlobal::config(),"PeerView");
+ createMonitor(tc);
+ }
+ else if (!show && peer_view)
+ {
+ peer_view->saveLayout(KGlobal::config(),"PeerView");
+ getGUI()->removeToolWidget(peer_view);
+ delete peer_view; peer_view = 0;
+ createMonitor(tc);
+ }
+ }
+
+ void InfoWidgetPlugin::showChunkView(bool show)
+ {
+ kt::TorrentInterface* tc = const_cast<kt::TorrentInterface*>(getGUI()->getCurrentTorrent());
+
+ if (show && !cd_view)
+ {
+ cd_view = new ChunkDownloadView(0);
+ getGUI()->addToolWidget(cd_view,"fifteenpieces",i18n("Chunks"),GUIInterface::DOCK_BOTTOM);
+
+ cd_view->restoreLayout(KGlobal::config(),"ChunkDownloadView");
+ cd_view->changeTC(tc);
+ createMonitor(tc);
+ }
+ else if (!show && cd_view)
+ {
+ cd_view->saveLayout(KGlobal::config(),"ChunkDownloadView");
+ getGUI()->removeToolWidget(cd_view);
+ delete cd_view; cd_view = 0;
+ createMonitor(tc);
+ }
+ }
+
+ void InfoWidgetPlugin::showTrackerView(bool show)
+ {
+ if (show && !tracker_view)
+ {
+ tracker_view = new TrackerView(0);
+ getGUI()->addToolWidget(tracker_view,"network",i18n("Trackers"),
+ GUIInterface::DOCK_BOTTOM);
+ tracker_view->changeTC(const_cast<kt::TorrentInterface*>(getGUI()->getCurrentTorrent()));
+ // seeing that a merge of the trackers might happen after a torrent has been loaded
+ // we need to update the tracker_view
+ connect(getCore(),SIGNAL(loadingFinished(const KURL&, bool, bool)),
+ tracker_view,SLOT(onLoadingFinished(const KURL&, bool, bool)));
+ }
+ else if (!show && tracker_view)
+ {
+ getGUI()->removeToolWidget(tracker_view);
+ delete tracker_view; tracker_view = 0;
+ }
+ }
+
+ void InfoWidgetPlugin::createMonitor(TorrentInterface* tc)
+ {
+ if (monitor)
+ delete monitor; monitor = 0;
+
+ if (peer_view)
+ peer_view->removeAll();
+ if (cd_view)
+ cd_view->removeAll();
+
+ if (tc && (peer_view || cd_view))
+ monitor = new KTorrentMonitor(tc,peer_view,cd_view);
+ }
+}
+
+#include "infowidgetplugin.moc"
diff --git a/plugins/infowidget/infowidgetplugin.h b/plugins/infowidget/infowidgetplugin.h
new file mode 100644
index 0000000..9e08e75
--- /dev/null
+++ b/plugins/infowidget/infowidgetplugin.h
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTINFOWIDGETPLUGIN_H
+#define KTINFOWIDGETPLUGIN_H
+
+#include <interfaces/plugin.h>
+#include <interfaces/guiinterface.h>
+
+
+
+namespace kt
+{
+ class PeerView;
+ class TrackerView;
+ class StatusTab;
+ class FileView;
+ class ChunkDownloadView;
+ class InfoWidgetPrefPage;
+ class KTorrentMonitor;
+
+
+ /**
+ @author Joris Guisson
+ */
+ class InfoWidgetPlugin : public Plugin,public ViewListener
+ {
+ Q_OBJECT
+ public:
+ InfoWidgetPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~InfoWidgetPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual void guiUpdate();
+ virtual void currentTorrentChanged(TorrentInterface* tc);
+ virtual bool versionCheck(const QString & version) const;
+
+ ///Show PeerView in main window
+ void showPeerView(bool show);
+ ///Show ChunkDownloadView in main window
+ void showChunkView(bool show);
+ ///Show TrackerView in main window
+ void showTrackerView(bool show);
+ private:
+ void createMonitor(TorrentInterface* tc);
+
+ private:
+ PeerView* peer_view;
+ ChunkDownloadView* cd_view;
+ TrackerView* tracker_view;
+ FileView* file_view;
+ StatusTab* status_tab;
+ KTorrentMonitor* monitor;
+
+ InfoWidgetPrefPage* pref;
+ };
+
+}
+
+#endif
diff --git a/plugins/infowidget/infowidgetpluginsettings.kcfgc b/plugins/infowidget/infowidgetpluginsettings.kcfgc
new file mode 100644
index 0000000..39b3109
--- /dev/null
+++ b/plugins/infowidget/infowidgetpluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktinfowidgetplugin.kcfg
+ClassName=InfoWidgetPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables
diff --git a/plugins/infowidget/infowidgetprefpage.cpp b/plugins/infowidget/infowidgetprefpage.cpp
new file mode 100644
index 0000000..16e1384
--- /dev/null
+++ b/plugins/infowidget/infowidgetprefpage.cpp
@@ -0,0 +1,74 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <qcheckbox.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include "infowidgetplugin.h"
+#include "infowidgetprefpage.h"
+#include "infowidgetpluginsettings.h"
+#include "iwpref.h"
+
+
+namespace kt
+{
+
+ InfoWidgetPrefPage::InfoWidgetPrefPage(InfoWidgetPlugin* iw)
+ : PrefPageInterface(i18n("Info Widget"),i18n("Information Widget Options"),KGlobal::iconLoader()->loadIcon("ktinfowidget",KIcon::NoGroup)),iw(iw)
+ {
+ pref = 0;
+ }
+
+
+ InfoWidgetPrefPage::~InfoWidgetPrefPage()
+ {}
+
+
+ bool InfoWidgetPrefPage::apply()
+ {
+ InfoWidgetPluginSettings::setShowPeerView(pref->m_show_pv->isChecked());
+ InfoWidgetPluginSettings::setShowChunkView(pref->m_show_cdv->isChecked());
+ InfoWidgetPluginSettings::setShowTrackersView(pref->m_show_tv->isChecked());
+ InfoWidgetPluginSettings::writeConfig();
+ iw->showPeerView( InfoWidgetPluginSettings::showPeerView() );
+ iw->showChunkView( InfoWidgetPluginSettings::showChunkView() );
+ iw->showTrackerView( InfoWidgetPluginSettings::showTrackersView() );
+ return true;
+ }
+
+ void InfoWidgetPrefPage::createWidget(QWidget* parent)
+ {
+ pref = new IWPref(parent);
+ updateData();
+ }
+
+ void InfoWidgetPrefPage::deleteWidget()
+ {
+ delete pref;
+ }
+
+ void InfoWidgetPrefPage::updateData()
+ {
+ pref->m_show_pv->setChecked(InfoWidgetPluginSettings::showPeerView());
+ pref->m_show_cdv->setChecked(InfoWidgetPluginSettings::showChunkView());
+ pref->m_show_tv->setChecked(InfoWidgetPluginSettings::showTrackersView());
+ }
+
+}
diff --git a/plugins/infowidget/infowidgetprefpage.h b/plugins/infowidget/infowidgetprefpage.h
new file mode 100644
index 0000000..a1fa40f
--- /dev/null
+++ b/plugins/infowidget/infowidgetprefpage.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTINFOWIDGETPREFPAGE_H
+#define KTINFOWIDGETPREFPAGE_H
+
+#include <interfaces/prefpageinterface.h>
+
+class IWPref;
+
+namespace kt
+{
+ class InfoWidgetPlugin;
+
+
+ /**
+ @author Joris Guisson
+ */
+ class InfoWidgetPrefPage : public PrefPageInterface
+ {
+ InfoWidgetPlugin* iw;
+ IWPref* pref;
+ public:
+ InfoWidgetPrefPage(InfoWidgetPlugin* iw);
+ virtual ~InfoWidgetPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void deleteWidget();
+ virtual void updateData();
+
+ };
+
+}
+
+#endif
diff --git a/plugins/infowidget/iwfiletreediritem.cpp b/plugins/infowidget/iwfiletreediritem.cpp
new file mode 100644
index 0000000..1ddf899
--- /dev/null
+++ b/plugins/infowidget/iwfiletreediritem.cpp
@@ -0,0 +1,224 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <util/functions.h>
+#include <interfaces/torrentfileinterface.h>
+#include <interfaces/torrentinterface.h>
+#include "iwfiletreediritem.h"
+#include "iwfiletreeitem.h"
+#include "functions.h"
+
+using namespace kt;
+
+namespace kt
+{
+
+ IWFileTreeDirItem::IWFileTreeDirItem(KListView* klv,const QString & name)
+ : kt::FileTreeDirItem(klv,name)
+ {
+ }
+
+ IWFileTreeDirItem::IWFileTreeDirItem(IWFileTreeDirItem* parent,const QString & name)
+ : kt::FileTreeDirItem(parent,name)
+ {
+ }
+
+ IWFileTreeDirItem::~IWFileTreeDirItem()
+ {
+ }
+
+
+ void IWFileTreeDirItem::updatePercentageInformation()
+ {
+ // first set all the child items
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ IWFileTreeItem* item = (IWFileTreeItem*)i->second;
+ item->updatePercentageInformation();
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ ((IWFileTreeDirItem*)j->second)->updatePercentageInformation();
+ j++;
+ }
+ }
+
+ void IWFileTreeDirItem::updatePreviewInformation(kt::TorrentInterface* tc)
+ {
+ // first set all the child items
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ IWFileTreeItem* item = (IWFileTreeItem*)i->second;
+ item->updatePreviewInformation(tc);
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ ((IWFileTreeDirItem*)j->second)->updatePreviewInformation(tc);
+ j++;
+ }
+ }
+
+ Priority IWFileTreeDirItem::updatePriorityInformation(kt::TorrentInterface* tc)
+ {
+ // first set all the child items
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ bool setpriority = false;
+ bool oneexcluded = false;
+ Priority priority = PREVIEW_PRIORITY;
+ if(i != children.end())
+ {
+ IWFileTreeItem* item = (IWFileTreeItem*)i->second;
+ item->updatePriorityInformation(tc);
+ i++;
+ priority = item->getTorrentFile().getPriority();
+ if(priority == EXCLUDED)
+ oneexcluded = true;
+ setpriority = true;
+ }
+ while (i != children.end())
+ {
+ IWFileTreeItem* item = (IWFileTreeItem*)i->second;
+ item->updatePriorityInformation(tc);
+ i++;
+ if(item->getTorrentFile().getPriority() != priority)
+ setpriority = false;
+ if(item->getTorrentFile().getPriority() == EXCLUDED)
+ oneexcluded = true;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ if(j != subdirs.end() && children.begin() == children.end())
+ {
+ Priority priority =
+ ((IWFileTreeDirItem*)j->second)->updatePriorityInformation(tc);
+ if(priority != PREVIEW_PRIORITY)
+ setpriority = true;
+ if(priority == EXCLUDED)
+ oneexcluded = true;
+ j++;
+ }
+
+ while (j != subdirs.end())
+ {
+ if(((IWFileTreeDirItem*)j->second)->updatePriorityInformation(tc)
+ != priority)
+ setpriority = false;
+ if(((IWFileTreeDirItem*)j->second)->updatePriorityInformation(tc)
+ == EXCLUDED)
+ oneexcluded = true;
+ j++;
+ }
+
+ if(setpriority)
+ {
+ switch(priority)
+ {
+ case FIRST_PRIORITY:
+ setText(2, i18n("Yes, First"));
+ childStateChange();
+ break;
+ case LAST_PRIORITY:
+ setText(2, i18n("Yes, Last"));
+ childStateChange();
+ break;
+ case EXCLUDED:
+ setText(2, i18n("No"));
+ childStateChange();
+ break;
+ default:
+ setText(2, i18n("Yes"));
+ childStateChange();
+ break;
+ }
+ return priority;
+ }
+ if(oneexcluded)
+ {
+ setText(2, i18n("No"));
+ childStateChange();
+ }
+ else
+ {
+ setText(2, i18n("Yes"));
+ childStateChange();
+ }
+ return PREVIEW_PRIORITY;
+ }
+
+ FileTreeItem* IWFileTreeDirItem::newFileTreeItem(const QString & name,TorrentFileInterface & file)
+ {
+ return new IWFileTreeItem(this,name,file);
+ }
+
+ FileTreeDirItem* IWFileTreeDirItem::newFileTreeDirItem(const QString & subdir)
+ {
+ return new IWFileTreeDirItem(this,subdir);
+ }
+
+ void IWFileTreeDirItem::updateDNDInformation()
+ {
+ // first set all the child items
+ bt::PtrMap<QString,FileTreeItem>::iterator i = children.begin();
+ while (i != children.end())
+ {
+ IWFileTreeItem* item = (IWFileTreeItem*)i->second;
+ item->updateDNDInformation();
+ i++;
+ }
+
+ // then recursivly move on to subdirs
+ bt::PtrMap<QString,FileTreeDirItem>::iterator j = subdirs.begin();
+ while (j != subdirs.end())
+ {
+ ((IWFileTreeDirItem*)j->second)->updateDNDInformation();
+ j++;
+ }
+ }
+
+ bt::ConfirmationResult IWFileTreeDirItem::confirmationDialog()
+ {
+ return bt::KEEP_DATA;
+/* QString msg = i18n("Do you want to keep the existing data for seeding ?");
+ int ret = KMessageBox::warningYesNoCancel(0,msg,QString::null,
+ KGuiItem(i18n("Keep the data")),
+ KGuiItem(i18n("Delete the data")));
+ if (ret == KMessageBox::Yes)
+ return bt::KEEP_DATA;
+ else if (ret == KMessageBox::No)
+ return bt::THROW_AWAY_DATA;
+ else
+ return bt::CANCELED;
+ */
+ }
+}
diff --git a/plugins/infowidget/iwfiletreediritem.h b/plugins/infowidget/iwfiletreediritem.h
new file mode 100644
index 0000000..90aa7ea
--- /dev/null
+++ b/plugins/infowidget/iwfiletreediritem.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 IWFILETREEDIRITEM_H
+#define IWFILETREEDIRITEM_H
+
+#include <interfaces/filetreediritem.h>
+
+class IWFileTreeItem;
+
+using bt::Uint32;
+using bt::Priority;
+using bt::FIRST_PRIORITY;
+using bt::NORMAL_PRIORITY;
+using bt::LAST_PRIORITY;
+using bt::PREVIEW_PRIORITY;
+using bt::EXCLUDED;
+
+namespace bt
+{
+ class TorrentFile;
+ class TorrentInterface;
+}
+
+namespace kt
+{
+ using namespace bt;
+ /**
+ * @author Joris Guisson
+ *
+ * Directory item in the InfoWidget's file view.
+ */
+ class IWFileTreeDirItem : public kt::FileTreeDirItem
+ {
+ public:
+ IWFileTreeDirItem(KListView* klv,const QString & name);
+ IWFileTreeDirItem(IWFileTreeDirItem* parent,const QString & name);
+ virtual ~IWFileTreeDirItem();
+
+ /**
+ * Update the preview information.
+ * @param tc The TorrentInterface object
+ */
+ void updatePreviewInformation(kt::TorrentInterface* tc);
+
+ /**
+ * Update the downloaded percentage information.
+ */
+ void updatePercentageInformation();
+
+ Priority updatePriorityInformation(kt::TorrentInterface* tc);
+
+ /**
+ * Update the DND information of each file item.
+ */
+ void updateDNDInformation();
+
+ virtual kt::FileTreeItem* newFileTreeItem(const QString & name, kt::TorrentFileInterface & file);
+ virtual kt::FileTreeDirItem* newFileTreeDirItem(const QString & subdir);
+ virtual bt::ConfirmationResult confirmationDialog();
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/iwfiletreeitem.cpp b/plugins/infowidget/iwfiletreeitem.cpp
new file mode 100644
index 0000000..e6281df
--- /dev/null
+++ b/plugins/infowidget/iwfiletreeitem.cpp
@@ -0,0 +1,166 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+#include <interfaces/functions.h>
+#include <interfaces/torrentinterface.h>
+#include <interfaces/torrentfileinterface.h>
+#include <util/bitset.h>
+#include "iwfiletreeitem.h"
+#include "iwfiletreediritem.h"
+#include "functions.h"
+
+using namespace kt;
+
+namespace kt
+{
+
+ IWFileTreeItem::IWFileTreeItem(IWFileTreeDirItem* item,const QString & name,kt::TorrentFileInterface & file)
+ : FileTreeItem(item,name,file)
+ {
+ perc_complete = 0.0;
+ connect(&file,SIGNAL(downloadPercentageChanged( float )),this,SLOT(onPercentageUpdated( float )));
+ connect(&file,SIGNAL(previewAvailable( bool )),this,SLOT(onPreviewAvailable( bool )));
+ }
+
+ IWFileTreeItem::~IWFileTreeItem()
+ {
+ }
+
+ int IWFileTreeItem::compare(QListViewItem* i, int col, bool ascending) const
+ {
+ if (col == 4)
+ {
+ IWFileTreeItem* other = dynamic_cast<IWFileTreeItem*>(i);
+ if (!other)
+ return 0;
+ else
+ return CompareVal(perc_complete,other->perc_complete);
+ }
+ else
+ {
+ return FileTreeItem::compare(i, col, ascending);
+ }
+ }
+
+
+ void IWFileTreeItem::updatePreviewInformation(kt::TorrentInterface* tc)
+ {
+ if (file.isMultimedia())
+ {
+ if (tc->readyForPreview(file.getFirstChunk(), file.getFirstChunk()+1) )
+ {
+ setText(3, i18n("Available"));
+ }
+ else
+ {
+ setText(3, i18n("Pending"));
+ }
+ }
+ else
+ setText(3, i18n("No"));
+ }
+
+ void IWFileTreeItem::updatePercentageInformation()
+ {
+ onPercentageUpdated(file.getDownloadPercentage());
+ }
+
+ void IWFileTreeItem::onPercentageUpdated(float p)
+ {
+ double percent = p;
+ if (percent < 0.0)
+ percent = 0.0;
+ else if (percent > 100.0)
+ percent = 100.0;
+ KLocale* loc = KGlobal::locale();
+ setText(4,i18n("%1 %").arg(loc->formatNumber(percent,2)));
+ perc_complete = percent;
+ }
+
+ void IWFileTreeItem::onPreviewAvailable(bool av)
+ {
+ if (av)
+ {
+ setText(3, i18n("Available"));
+ }
+ else if (file.isMultimedia())
+ {
+ setText(3, i18n("Pending"));
+ }
+ else
+ {
+ setText(3, i18n("No"));
+ }
+ }
+
+ void IWFileTreeItem::updatePriorityInformation(kt::TorrentInterface* tc)
+ {
+ switch(file.getPriority())
+ {
+ case FIRST_PRIORITY:
+ setText(2, i18n("Yes, First"));
+ break;
+ case LAST_PRIORITY:
+ setText(2, i18n("Yes, Last"));
+ break;
+ case ONLY_SEED_PRIORITY:
+ case EXCLUDED:
+ setText(2, i18n("No"));
+ break;
+ case PREVIEW_PRIORITY:
+ break;
+ default:
+ setText(2, i18n("Yes"));
+ break;
+ }
+ }
+
+ void IWFileTreeItem::updateDNDInformation()
+ {
+ if (file.doNotDownload() && isOn())
+ {
+ setChecked(false);
+ setText(2, i18n("No"));
+ }
+ }
+
+ bt::ConfirmationResult IWFileTreeItem::confirmationDialog()
+ {
+ return bt::KEEP_DATA;
+ /*
+ QString msg = i18n("Do you want to keep the existing data for seeding ?");
+ int ret = KMessageBox::warningYesNoCancel(0,msg,QString::null,
+ KGuiItem(i18n("Keep the data")),
+ KGuiItem(i18n("Delete the data")));
+ if (ret == KMessageBox::Yes)
+ return bt::KEEP_DATA;
+ else if (ret == KMessageBox::No)
+ return bt::THROW_AWAY_DATA;
+ else
+ return bt::CANCELED;
+ */
+ }
+
+}
+
+#include "iwfiletreeitem.moc"
+
diff --git a/plugins/infowidget/iwfiletreeitem.h b/plugins/infowidget/iwfiletreeitem.h
new file mode 100644
index 0000000..7877ff1
--- /dev/null
+++ b/plugins/infowidget/iwfiletreeitem.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 IWFILETREEITEM_H
+#define IWFILETREEITEM_H
+
+#include <qobject.h>
+#include <interfaces/filetreeitem.h>
+
+using namespace bt;
+
+namespace kt
+{
+ class TorrentFileInterface;
+ class TorrentInterface;
+ class IWFileTreeDirItem;
+
+ /**
+ * @author Joris Guisson
+ *
+ * File item in the InfoWidget's file view.
+ */
+ class IWFileTreeItem : public QObject, public kt::FileTreeItem
+ {
+ Q_OBJECT
+
+ double perc_complete;
+ public:
+ IWFileTreeItem(IWFileTreeDirItem* item,const QString & name,kt::TorrentFileInterface & file);
+ virtual ~IWFileTreeItem();
+
+ void updatePreviewInformation(kt::TorrentInterface* tc);
+ void updatePercentageInformation();
+ void updatePriorityInformation(kt::TorrentInterface* tc);
+ void updateDNDInformation();
+ protected:
+ virtual int compare(QListViewItem* i, int col, bool ascending) const;
+ virtual bt::ConfirmationResult confirmationDialog();
+
+ protected slots:
+ void onPercentageUpdated(float p);
+ void onPreviewAvailable(bool av);
+ };
+}
+
+
+
+#endif
diff --git a/plugins/infowidget/iwpref.ui b/plugins/infowidget/iwpref.ui
new file mode 100644
index 0000000..1007259
--- /dev/null
+++ b/plugins/infowidget/iwpref.ui
@@ -0,0 +1,69 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>IWPref</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>IWPref</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>138</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>m_show_pv</cstring>
+ </property>
+ <property name="text">
+ <string>Show list of peers</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>m_show_cdv</cstring>
+ </property>
+ <property name="text">
+ <string>Show list of chunks currentl&amp;y downloading</string>
+ </property>
+ </widget>
+ <spacer row="3" column="0">
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>m_show_tv</cstring>
+ </property>
+ <property name="text">
+ <string>Show list of trackers</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/plugins/infowidget/ktinfowidgetplugin.desktop b/plugins/infowidget/ktinfowidgetplugin.desktop
new file mode 100644
index 0000000..535f90c
--- /dev/null
+++ b/plugins/infowidget/ktinfowidgetplugin.desktop
@@ -0,0 +1,29 @@
+[Desktop Entry]
+Name=SearchPlugin
+Name[bg]=Приставка за търсене
+Name[br]=Lugent klask
+Name[da]=SøgePlugin
+Name[de]=Suche-Modul
+Name[el]=Πρόσθετο αναζήτησης
+Name[es]=Complemento de búsqueda
+Name[et]=Otsimisplugin
+Name[fa]=وصلۀ جستجو
+Name[it]=Plugin di ricerca
+Name[nb]=Søkemodul
+Name[nds]=Söök-Moduul
+Name[nl]=Zoekplugin
+Name[pl]=Wtyczka wyszukiwania
+Name[pt]='Plugin' de Procura
+Name[pt_BR]=Plugin de Busca
+Name[sk]=Vyhľadávací Plugin
+Name[sr]=Прикључак претраге
+Name[sr@Latn]=Priključak pretrage
+Name[sv]=Sökinsticksprogram
+Name[tr]=Arama Eklentisi
+Name[uk]=Втулок пошуку
+Name[xx]=xxSearchPluginxx
+Name[zh_CN]=搜索插件
+Name[zh_TW]=搜尋外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktinfowidgetplugin
diff --git a/plugins/infowidget/ktinfowidgetplugin.kcfg b/plugins/infowidget/ktinfowidgetplugin.kcfg
new file mode 100644
index 0000000..51048fa
--- /dev/null
+++ b/plugins/infowidget/ktinfowidgetplugin.kcfg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktinfowidgetpluginrc"/>
+ <group name="general">
+ <entry name="showPeerView" type="Bool">
+ <label>Show peer view tab in main window</label>
+ <default>true</default>
+ </entry>
+ <entry name="showChunkView" type="Bool">
+ <label>Show chunk download view tab in main window</label>
+ <default>true</default>
+ </entry>
+ <entry name="showTrackersView" type="Bool">
+ <label>Show trackers view tab in main window</label>
+ <default>true</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/infowidget/ktorrentmonitor.cpp b/plugins/infowidget/ktorrentmonitor.cpp
new file mode 100644
index 0000000..7494a5c
--- /dev/null
+++ b/plugins/infowidget/ktorrentmonitor.cpp
@@ -0,0 +1,88 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <interfaces/peerinterface.h>
+#include <interfaces/torrentinterface.h>
+#include <interfaces/chunkdownloadinterface.h>
+#include "ktorrentmonitor.h"
+#include "peerview.h"
+#include "chunkdownloadview.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ KTorrentMonitor::KTorrentMonitor(kt::TorrentInterface* tc,
+ PeerView* pv,
+ ChunkDownloadView* cdv) : tc(tc),pv(pv),cdv(cdv)
+ {
+ if (tc)
+ tc->setMonitor(this);
+ }
+
+
+ KTorrentMonitor::~KTorrentMonitor()
+ {
+ if (tc)
+ tc->setMonitor(0);
+ }
+
+
+ void KTorrentMonitor::downloadRemoved(kt::ChunkDownloadInterface* cd)
+ {
+ if (cdv)
+ cdv->removeDownload(cd);
+ }
+
+ void KTorrentMonitor::downloadStarted(kt::ChunkDownloadInterface* cd)
+ {
+ if (cdv)
+ cdv->addDownload(cd);
+ }
+
+ void KTorrentMonitor::peerAdded(kt::PeerInterface* peer)
+ {
+ if (pv)
+ pv->addPeer(peer);
+ }
+
+ void KTorrentMonitor::peerRemoved(kt::PeerInterface* peer)
+ {
+ if (pv)
+ pv->removePeer(peer);
+ }
+
+ void KTorrentMonitor::stopped()
+ {
+ if (pv)
+ pv->removeAll();
+ if (cdv)
+ cdv->removeAll();
+ }
+
+ void KTorrentMonitor::destroyed()
+ {
+ if (pv)
+ pv->removeAll();
+ if (cdv)
+ cdv->removeAll();
+ tc = 0;
+ }
+}
diff --git a/plugins/infowidget/ktorrentmonitor.h b/plugins/infowidget/ktorrentmonitor.h
new file mode 100644
index 0000000..6a312a2
--- /dev/null
+++ b/plugins/infowidget/ktorrentmonitor.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTORRENTMONITOR_H
+#define KTORRENTMONITOR_H
+
+#include <interfaces/monitorinterface.h>
+
+
+
+namespace kt
+{
+ class TorrentInterface;
+ class PeerView;
+ class ChunkDownloadView;
+
+ /**
+ @author Joris Guisson
+ */
+ class KTorrentMonitor : public kt::MonitorInterface
+ {
+ kt::TorrentInterface* tc;
+ PeerView* pv;
+ ChunkDownloadView* cdv;
+ public:
+ KTorrentMonitor(
+ kt::TorrentInterface* tc,
+ PeerView* pv,
+ ChunkDownloadView* cdv);
+ virtual ~KTorrentMonitor();
+
+ virtual void downloadRemoved(kt::ChunkDownloadInterface* cd);
+ virtual void downloadStarted(kt::ChunkDownloadInterface* cd);
+ virtual void peerAdded(kt::PeerInterface* peer);
+ virtual void peerRemoved(kt::PeerInterface* peer);
+ virtual void stopped();
+ virtual void destroyed();
+
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/localefloatvalidator.cpp b/plugins/infowidget/localefloatvalidator.cpp
new file mode 100644
index 0000000..7faafed
--- /dev/null
+++ b/plugins/infowidget/localefloatvalidator.cpp
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2006 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Vincent Wagelaar <vincent@ricardis.tudelft.nl> *
+ * Jonas Widarsson <jonas@widarsson.com> *
+ * *
+ * 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 <kglobal.h>
+#include <klocale.h>
+#include "localefloatvalidator.h"
+
+kt::LocaleFloatValidator::LocaleFloatValidator( QObject * parent, const char * name )
+:QValidator(parent, name)
+{
+ QString decimalPoint = QRegExp::escape(KGlobal::locale()->decimalSymbol());
+ regexp.setPattern("^-?\\d*(" + decimalPoint + "\\d*)?$");
+}
+
+QValidator::State kt::LocaleFloatValidator::validate( QString & str, int & pos) const
+{
+ return regexp.exactMatch(str) ? QValidator::Acceptable : QValidator::Invalid;
+}
+
+
+#include "localefloatvalidator.moc"
diff --git a/plugins/infowidget/localefloatvalidator.h b/plugins/infowidget/localefloatvalidator.h
new file mode 100644
index 0000000..d4d12ee
--- /dev/null
+++ b/plugins/infowidget/localefloatvalidator.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2005 by *
+ * Joris Guisson <joris.guisson@gmail.com> *
+ * Vincent Wagelaar <vincent@ricardis.tudelft.nl> *
+ * Jonas Widarsson <jonas@widarsson.com> *
+ * *
+ * 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 LOCALEFLOATVALIDATOR_H
+#define LOCALEFLOATVALIDATOR_H
+
+#include <qvalidator.h>
+class QRegExp;
+namespace kt{
+ /**
+ * @author Jonas Widarsson
+ *
+ * A float validator that respects KLocale::decimalSymbol()
+ */
+ class LocaleFloatValidator : public QValidator
+ {
+ Q_OBJECT
+ public:
+ LocaleFloatValidator( QObject * parent, const char *name = 0 );
+
+ virtual QValidator::State validate( QString & str, int & pos) const;
+ private:
+ QRegExp regexp;
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/peerview.cpp b/plugins/infowidget/peerview.cpp
new file mode 100644
index 0000000..0e05791
--- /dev/null
+++ b/plugins/infowidget/peerview.cpp
@@ -0,0 +1,357 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson <joris.guisson@gmail.com> *
+ * Copyright (C) 2007 by Modestas Vainius <modestas@vainius.eu> *
+ * *
+ * 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 <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <ksocketaddress.h>
+#include <qpoint.h>
+#include <qlistview.h>
+#include <kpopupmenu.h>
+#include <interfaces/peerinterface.h>
+#include <interfaces/functions.h>
+#include <torrent/ipblocklist.h>
+#include <util/log.h>
+#include "config.h"
+
+#ifdef USE_SYSTEM_GEOIP
+#include <GeoIP.h>
+#else
+#include "GeoIP.h"
+#endif
+#include "peerview.h"
+#include "flagdb.h"
+
+using namespace bt;
+using namespace kt;
+
+namespace kt
+{
+
+ Uint32 PeerViewItem::pvi_count = 0;
+ // Global GeoIP pointer, gets destroyed when no PeerViewItem's exist
+ static GeoIP* geo_ip = 0;
+ static QPixmap yes_pix;
+ static QPixmap no_pix;
+ static QPixmap lock_pix;
+ static FlagDB flagDB(22, 18);
+ static bool yes_no_pix_loaded = false;
+ static bool geoip_db_exists = true;
+ static QString geoip_data_file;
+
+ PeerViewItem::PeerViewItem(PeerView* pv,kt::PeerInterface* peer) : KListViewItem(pv),peer(peer)
+ {
+ if (!yes_no_pix_loaded)
+ {
+ KIconLoader* iload = KGlobal::iconLoader();
+ /* Prefer builtin flag images to the ones provided by KDE */
+ flagDB.addFlagSource("data", QString("ktorrent/geoip/%1.png"));
+ flagDB.addFlagSource("locale", QString("l10n/%1/flag.png"));
+ yes_pix = iload->loadIcon("button_ok",KIcon::Small);
+ no_pix = iload->loadIcon("button_cancel",KIcon::Small);
+ lock_pix = iload->loadIcon("ktencrypted",KIcon::Small);
+#ifdef USE_SYSTEM_GEOIP
+ geo_ip = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD);
+ geoip_db_exists = (geo_ip != NULL);
+#else
+ geoip_db_exists = !locate("data", "ktorrent/geoip/geoip.dat").isNull();
+ if(geoip_db_exists) {
+ geoip_data_file = "ktorrent/geoip/geoip.dat";
+ } else {
+ geoip_db_exists = !locate("data", "ktorrent/geoip/GeoIP.dat").isNull();
+ if (geoip_db_exists)
+ geoip_data_file = "ktorrent/geoip/GeoIP.dat";
+ }
+#endif
+ yes_no_pix_loaded = true;
+ }
+
+ pvi_count++;
+ const char * hostname = 0;
+ const char * country_code = 0;
+ const char * country_name = 0;
+ int country_id = 0;
+
+ const PeerInterface::Stats & s = peer->getStats();
+ hostname = s.ip_address.ascii();
+
+ // open GeoIP if necessary
+ if (!geo_ip && geoip_db_exists) {
+#ifdef USE_SYSTEM_GEOIP
+ geo_ip = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD);
+#else
+ geo_ip = GeoIP_open(locate("data", geoip_data_file).ascii(),0);
+#endif
+ }
+ if (geo_ip)
+ {
+ country_id = GeoIP_id_by_name(geo_ip, hostname);
+ country_code = GeoIP_country_code[country_id];
+ country_name = GeoIP_country_name[country_id];
+ setText(1, country_name);
+ m_country = QString(country_name);
+ }
+ else
+ {
+ setText(1,"N/A");
+ }
+
+ /* if (s.fast_extensions)
+ setText(0,s.ip_address + " (F)");
+ else*/
+ setText(0,s.ip_address);
+
+ struct in_addr addr = {0};
+ inet_aton(s.ip_address.ascii(),&addr);
+ ip = ntohl(addr.s_addr);
+
+ setText(2,s.client);
+
+ if (country_code)
+ {
+ setPixmap(1, flagDB.getFlag(country_code));
+ }
+
+ if (s.encrypted)
+ setPixmap(0,lock_pix);
+ update();
+ }
+
+ PeerViewItem::~PeerViewItem()
+ {
+ if (pvi_count > 0) // just to be sure, let this not wrap around
+ pvi_count--;
+
+ // destroy when not needed anymore
+ if (pvi_count == 0 && geo_ip)
+ {
+ GeoIP_delete(geo_ip);
+ geo_ip = 0;
+ }
+ }
+
+
+ void PeerViewItem::update()
+ {
+ KLocale* loc = KGlobal::locale();
+ const PeerInterface::Stats & s = peer->getStats();
+
+ if (s.download_rate >= 103) // lowest "visible" speed, all below will be 0,0 Kb/s
+ setText(3,KBytesPerSecToString(s.download_rate / 1024.0));
+ else
+ setText(3, "");
+ if (s.upload_rate >= 103) // lowest "visible" speed, all below will be 0,0 Kb/s
+ setText(4,KBytesPerSecToString(s.upload_rate / 1024.0));
+ else
+ setText(4, "");
+ //setPixmap(5,!s.choked ? yes_pix : no_pix);
+ setText(5,s.choked ? i18n("Yes") : i18n("No"));
+ //setPixmap(6,!s.snubbed ? yes_pix : no_pix);
+ setText(6,s.snubbed ? i18n("Yes") : i18n("No"));
+ setText(7,QString("%1 %").arg(loc->formatNumber(s.perc_of_file,2)));
+ setPixmap(8,s.dht_support ? yes_pix : no_pix);
+ setText(9,loc->formatNumber(s.aca_score,2));
+ setPixmap(10,s.has_upload_slot ? yes_pix : QPixmap());
+ setText(11,QString("%1 / %2").arg(s.num_down_requests).arg(s.num_up_requests));
+ setText(12, BytesToString(s.bytes_downloaded));
+ setText(13, BytesToString(s.bytes_uploaded));
+ }
+
+ int PeerViewItem::compare(QListViewItem * i,int col,bool) const
+ {
+ PeerViewItem* pvi = (PeerViewItem*) i;
+ PeerInterface* op = pvi->peer;
+ const PeerInterface::Stats & s = peer->getStats();
+ const PeerInterface::Stats & os = op->getStats();
+ switch (col)
+ {
+ case 0: return CompareVal(ip,pvi->ip); // use numeric representation to sort
+ //return QString::compare(s.ip_address,os.ip_address);
+ case 1: return QString::compare(m_country, pvi->m_country);
+ case 2: return QString::compare(s.client,os.client);
+ case 3: return CompareVal(s.download_rate,os.download_rate);
+ case 4: return CompareVal(s.upload_rate,os.upload_rate);
+ case 5: return CompareVal(s.choked,os.choked);
+ case 6: return CompareVal(s.snubbed,os.snubbed);
+ case 7: return CompareVal(s.perc_of_file,os.perc_of_file);
+ case 8: return CompareVal(s.dht_support,os.dht_support);
+ case 9: return CompareVal(s.aca_score,os.aca_score);
+ case 10: return CompareVal(s.has_upload_slot,os.has_upload_slot);
+ case 11: return CompareVal(s.num_down_requests+s.num_up_requests, os.num_down_requests+os.num_up_requests);
+ case 12: return CompareVal(s.bytes_downloaded, os.bytes_downloaded);
+ case 13: return CompareVal(s.bytes_uploaded, os.bytes_uploaded);
+
+ }
+ return 0;
+ }
+
+ PeerView::PeerView(QWidget *parent, const char *name)
+ : KListView(parent, name)
+ {
+ addColumn(i18n("IP"));
+ addColumn(i18n("Country"));
+ addColumn(i18n("Client"));
+ addColumn(i18n("Down Speed"));
+ addColumn(i18n("Up Speed"));
+ addColumn(i18n("Choked"));
+ addColumn(i18n("Snubbed"));
+ addColumn(i18n("Availability"));
+ addColumn(i18n("DHT"));
+ addColumn(i18n("Score"));
+ addColumn(i18n("Upload Slot"));
+ addColumn(i18n("Requests"));
+ addColumn(i18n("Downloaded"));
+ addColumn(i18n("Uploaded"));
+
+ setAllColumnsShowFocus(true);
+ setShowSortIndicator(true);
+
+ setColumnAlignment(3,Qt::AlignRight);
+ setColumnAlignment(4,Qt::AlignRight);
+ setColumnAlignment(5,Qt::AlignCenter);
+ setColumnAlignment(6,Qt::AlignCenter);
+ setColumnAlignment(7,Qt::AlignRight);
+ setColumnAlignment(8,Qt::AlignCenter);
+ setColumnAlignment(9,Qt::AlignRight);
+ setColumnAlignment(10,Qt::AlignCenter);
+ setColumnAlignment(11,Qt::AlignCenter);
+ setColumnAlignment(12,Qt::AlignRight);
+ setColumnAlignment(13,Qt::AlignRight);
+
+ for (Uint32 i = 0;i < (Uint32)columns();i++)
+ setColumnWidthMode(i,QListView::Manual);
+
+ setShowSortIndicator(true);
+
+ menu = new KPopupMenu(this);
+ kick_id = menu->insertItem(KGlobal::iconLoader()->loadIcon("delete_user", KIcon::NoGroup), i18n("to kick", "Kick peer"));
+ ban_id = menu->insertItem(KGlobal::iconLoader()->loadIcon("filter",KIcon::NoGroup), i18n("to ban", "Ban peer"));
+
+ connect(this,SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint& )),
+ this,SLOT(showContextMenu(KListView*, QListViewItem*, const QPoint& )));
+ connect(menu, SIGNAL ( activated ( int ) ), this, SLOT ( contextItem ( int ) ) );
+ setFrameShape(QFrame::NoFrame);
+ }
+
+
+ PeerView::~PeerView()
+ {}
+
+ void PeerView::addPeer(kt::PeerInterface* peer)
+ {
+ PeerViewItem* i = new PeerViewItem(this,peer);
+ items.insert(peer,i);
+ }
+
+ void PeerView::removePeer(kt::PeerInterface* peer)
+ {
+ QMap<kt::PeerInterface*,PeerViewItem*>::iterator it = items.find(peer);
+ if (it == items.end())
+ {
+ return;
+ }
+
+ PeerViewItem* pvi = it.data();
+ if (pvi == curr)
+ curr = 0;
+
+ delete pvi;
+ items.erase(peer);
+
+ }
+
+ void PeerView::banPeer(kt::PeerInterface* peer)
+ {
+ if(!peer)
+ return;
+
+ IPBlocklist& filter = IPBlocklist::instance();
+ const PeerInterface::Stats & s = peer->getStats();
+ KNetwork::KIpAddress ip(s.ip_address);
+ QString ips = ip.toString();
+ /**
+ * @TODO Clean this up.
+ * this whole mess was because of KNetwork classes
+ * since we no longer use them, may I clean it up?
+ * I'll wait some time just in case...
+ **/
+ if(ips.startsWith(":"))
+ filter.insert(ips.section(":",-1),3);
+ else
+ filter.insert(ips,3);
+ peer->kill();
+ }
+
+ void PeerView::kickPeer(kt::PeerInterface* peer)
+ {
+ if(!peer)
+ return;
+
+ peer->kill();
+ }
+
+ void PeerView::update()
+ {
+ QMap<kt::PeerInterface*,PeerViewItem*>::iterator i = items.begin();
+ while (i != items.end())
+ {
+ PeerViewItem* it = i.data();
+ it->update();
+ i++;
+ }
+ sort();
+ }
+
+ void PeerView::removeAll()
+ {
+ items.clear();
+ clear();
+ }
+
+ void PeerView::showContextMenu( KListView*, QListViewItem* item, const QPoint& p)
+ {
+ if(!item)
+ return;
+
+ curr = dynamic_cast<PeerViewItem*>(item);
+ if (curr)
+ {
+ menu->setItemEnabled(ban_id, true);
+ menu->setItemEnabled(kick_id, true);
+ menu->popup(p);
+ }
+ }
+
+ void PeerView::contextItem(int id)
+ {
+ if (id == ban_id && curr)
+ banPeer(curr->getPeer());
+
+ if (id == kick_id && curr)
+ kickPeer(curr->getPeer());
+ }
+}
+
+#include "peerview.moc"
diff --git a/plugins/infowidget/peerview.h b/plugins/infowidget/peerview.h
new file mode 100644
index 0000000..a4a8b94
--- /dev/null
+++ b/plugins/infowidget/peerview.h
@@ -0,0 +1,81 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 PEERVIEW_H
+#define PEERVIEW_H
+
+#include <qmap.h>
+#include <klistview.h>
+#include <qlistview.h>
+#include <kpopupmenu.h>
+#include <qpoint.h>
+#include <util/constants.h>
+
+namespace kt
+{
+ class PeerInterface;
+ class PeerView;
+
+ class PeerViewItem : public KListViewItem
+ {
+ kt::PeerInterface* peer;
+ QString m_country;
+ bt::Uint32 ip;
+ // counter to keep track of how many PeerViewItem objects are in existence
+ static bt::Uint32 pvi_count;
+ public:
+ PeerViewItem(PeerView* pv,kt::PeerInterface* peer);
+ virtual ~PeerViewItem();
+
+ void update();
+ int compare(QListViewItem * i,int col,bool) const;
+ kt::PeerInterface* getPeer() { return peer; }
+
+ };
+
+ /**
+ @author Joris Guisson
+ */
+ class PeerView : public KListView
+ {
+ Q_OBJECT
+
+ QMap<kt::PeerInterface*,PeerViewItem*> items;
+ public:
+ PeerView(QWidget *parent = 0, const char *name = 0);
+ virtual ~PeerView();
+
+ public slots:
+ void addPeer(kt::PeerInterface* peer);
+ void removePeer(kt::PeerInterface* peer);
+ void banPeer(kt::PeerInterface* peer);
+ void kickPeer(kt::PeerInterface* peer);
+ void update();
+ void removeAll();
+ void showContextMenu(KListView* ,QListViewItem* item,const QPoint & p);
+ void contextItem(int id);
+ private:
+ KPopupMenu* menu;
+ int ban_id;
+ int kick_id;
+ PeerViewItem* curr;
+ };
+}
+
+#endif
diff --git a/plugins/infowidget/statustab.cpp b/plugins/infowidget/statustab.cpp
new file mode 100644
index 0000000..b0974ed
--- /dev/null
+++ b/plugins/infowidget/statustab.cpp
@@ -0,0 +1,267 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <math.h>
+#include <float.h>
+#include <qdatetime.h>
+#include <qcheckbox.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <interfaces/functions.h>
+#include <interfaces/torrentinterface.h>
+
+#include "downloadedchunkbar.h"
+#include "availabilitychunkbar.h"
+#include "floatspinbox.h"
+#include "statustab.h"
+
+namespace kt
+{
+
+ StatusTab::StatusTab(QWidget* parent, const char* name, WFlags fl)
+ : StatusTabBase(parent,name,fl),curr_tc(0)
+ {
+ QColorGroup cg = colorGroup();
+ // do not use hardcoded colors
+ m_info_caption->setPaletteBackgroundColor(cg.mid());
+ m_chunks_caption->setPaletteBackgroundColor(cg.mid());
+ m_sharing_caption->setPaletteBackgroundColor(cg.mid());
+
+ maxRatio->setMinValue(0.0f);
+ maxRatio->setMaxValue(100.0f);
+ maxRatio->setStep(0.1f);
+ connect(maxRatio, SIGNAL(valueHasChanged()), this, SLOT(maxRatioReturnPressed()));
+ connect(useLimit, SIGNAL( toggled(bool) ), this, SLOT( useLimitToggled(bool) ) );
+
+ maxTime->setMinValue(0.0f);
+ maxTime->setMaxValue(10000000.0f);
+ maxTime->setStep(0.05f);
+ maxTime->setSpecialValueText(i18n("No limit"));
+ connect(useTimeLimit,SIGNAL(toggled(bool)), this,SLOT(useTimeLimitToggled(bool)));
+ connect(maxTime,SIGNAL(valueHasChanged()), this, SLOT(timeValueChanged()));
+
+ int h = (int)ceil(fontMetrics().height()*1.25);
+ m_chunk_bar->setFixedHeight(h);
+ m_av_chunk_bar->setFixedHeight(h);
+ }
+
+ StatusTab::~StatusTab()
+ {}
+
+ void StatusTab::changeTC(kt::TorrentInterface* tc)
+ {
+ if (tc == curr_tc)
+ return;
+
+ curr_tc = tc;
+
+ m_chunk_bar->setTC(tc);
+ m_av_chunk_bar->setTC(tc);
+ setEnabled(tc != 0);
+
+ if (curr_tc)
+ {
+ float ratio = curr_tc->getMaxShareRatio();
+ if(ratio > 0)
+ {
+ useLimit->setChecked(true);
+ maxRatio->setValue(ratio);
+ }
+ else
+ {
+ maxRatio->setValue(0.0);
+ useLimit->setChecked(false);
+ maxRatio->setEnabled(false);
+ }
+
+ float hours = curr_tc->getMaxSeedTime();
+ if (hours > 0)
+ {
+ maxTime->setEnabled(true);
+ useTimeLimit->setChecked(true);
+ maxTime->setValue(hours);
+ }
+ else
+ {
+ maxTime->setEnabled(false);
+ useTimeLimit->setChecked(false);
+ }
+ }
+ else
+ {
+ maxRatio->setValue(0.00f);
+ m_share_ratio->clear();
+ m_tracker_status->clear();
+ m_seeders->clear();
+ m_leechers->clear();
+ m_tracker_update_time->clear();
+ m_avg_up->clear();
+ m_avg_down->clear();
+ }
+
+ update();
+ }
+
+ void StatusTab::update()
+ {
+ if (!curr_tc)
+ return;
+
+ const TorrentStats & s = curr_tc->getStats();
+
+ m_chunk_bar->updateBar();
+ m_av_chunk_bar->updateBar();
+
+ if (s.running)
+ {
+ QTime t;
+ t = t.addSecs(curr_tc->getTimeToNextTrackerUpdate());
+ m_tracker_update_time->setText(t.toString("mm:ss"));
+ }
+ else
+ {
+ m_tracker_update_time->setText("");
+ }
+
+ m_tracker_status->setText(s.trackerstatus);
+
+ m_seeders->setText(QString("%1 (%2)")
+ .arg(s.seeders_connected_to).arg(s.seeders_total));
+
+ m_leechers->setText(QString("%1 (%2)")
+ .arg(s.leechers_connected_to).arg(s.leechers_total));
+
+ float ratio = kt::ShareRatio(s);
+ if(!maxRatio->hasFocus() && useLimit->isChecked())
+ maxRatioUpdate();
+
+ m_share_ratio->setText(QString("<font color=\"%1\">%2</font>").arg(ratio <= 0.8 ? "#ff0000" : "#1c9a1c").arg(KGlobal::locale()->formatNumber(ratio,2)));
+
+ Uint32 secs = curr_tc->getRunningTimeUL();
+ if (secs == 0)
+ {
+ m_avg_up->setText(KBytesPerSecToString(0));
+
+ }
+ else
+ {
+ double r = (double)s.bytes_uploaded / 1024.0;
+ m_avg_up->setText(KBytesPerSecToString(r / secs));
+ }
+
+ secs = curr_tc->getRunningTimeDL();
+ if (secs == 0)
+ {
+ m_avg_down->setText(KBytesPerSecToString(0));
+ }
+ else
+ {
+ double r = (double)(s.bytes_downloaded - s.imported_bytes)/ 1024.0;
+ m_avg_down->setText(KBytesPerSecToString(r / secs));
+ }
+ }
+
+ void StatusTab::maxRatioReturnPressed()
+ {
+ if(!curr_tc)
+ return;
+
+ curr_tc->setMaxShareRatio(maxRatio->value());
+ }
+
+ void StatusTab::useLimitToggled(bool state)
+ {
+ if(!curr_tc)
+ return;
+
+ maxRatio->setEnabled(state);
+ if (!state)
+ {
+ curr_tc->setMaxShareRatio(0.00f);
+ maxRatio->setValue(0.00f);
+ }
+ else
+ {
+ float msr = curr_tc->getMaxShareRatio();
+ if(msr == 0.00f)
+ {
+ curr_tc->setMaxShareRatio(1.00f);
+ maxRatio->setValue(1.00f);
+ }
+
+ float sr = kt::ShareRatio(curr_tc->getStats());
+ if(sr >= 1.00f)
+ {
+ //always add 1 to max share ratio to prevent stopping if torrent is running.
+ curr_tc->setMaxShareRatio(sr + 1.00f);
+ maxRatio->setValue(sr + 1.00f);
+ }
+ }
+ }
+
+ void StatusTab::maxRatioUpdate()
+ {
+ if(!curr_tc)
+ return;
+
+ float ratio = curr_tc->getMaxShareRatio();
+ if(ratio > 0.00f)
+ {
+ maxRatio->setEnabled(true);
+ useLimit->setChecked(true);
+ maxRatio->setValue(ratio);
+ }
+ else
+ {
+ maxRatio->setEnabled(false);
+ useLimit->setChecked(false);
+ maxRatio->setValue(0.00f);
+ }
+ }
+
+ void StatusTab::useTimeLimitToggled(bool on)
+ {
+ if(!curr_tc)
+ return;
+
+ maxTime->setEnabled(on);
+ if (on)
+ {
+ Uint32 dl = curr_tc->getRunningTimeDL();
+ Uint32 ul = curr_tc->getRunningTimeUL();
+ float hours = (ul - dl) / 3600.0f + 1.0; // add one hour to current seed time to not stop immediatly
+ maxTime->setValue(hours);
+ curr_tc->setMaxSeedTime(hours);
+ }
+ else
+ {
+ curr_tc->setMaxSeedTime(0.0f);
+ }
+ }
+
+ void StatusTab::timeValueChanged()
+ {
+ if (curr_tc)
+ curr_tc->setMaxSeedTime(maxTime->value());
+ }
+
+}
+
+#include "statustab.moc"
+
diff --git a/plugins/infowidget/statustab.h b/plugins/infowidget/statustab.h
new file mode 100644
index 0000000..14e987d
--- /dev/null
+++ b/plugins/infowidget/statustab.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 STATUSTAB_H
+#define STATUSTAB_H
+
+#include "statustabbase.h"
+
+namespace kt
+{
+ class TorrentInterface;
+
+ class StatusTab : public StatusTabBase
+ {
+ Q_OBJECT
+
+ public:
+ StatusTab(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ virtual ~StatusTab();
+
+
+ public slots:
+ void changeTC(kt::TorrentInterface* tc);
+ void update();
+ void maxRatioReturnPressed();
+ void useLimitToggled(bool on);
+ void useTimeLimitToggled(bool on);
+ void timeValueChanged();
+ private:
+ void maxRatioUpdate();
+
+ private:
+ kt::TorrentInterface* curr_tc;
+ };
+}
+
+#endif
+
diff --git a/plugins/infowidget/statustabbase.ui b/plugins/infowidget/statustabbase.ui
new file mode 100644
index 0000000..179f68a
--- /dev/null
+++ b/plugins/infowidget/statustabbase.ui
@@ -0,0 +1,667 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>StatusTabBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>StatusTabBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>839</width>
+ <height>250</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Status</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_info_caption</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>200</red>
+ <green>200</green>
+ <blue>200</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Info</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Seeders:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_6</cstring>
+ </property>
+ <property name="text">
+ <string>Leechers:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>m_seeders</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>m_leechers</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Average Down Speed:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>m_avg_down</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>m_avg_up</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_7</cstring>
+ </property>
+ <property name="text">
+ <string>Average Up Speed:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>Next update in:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1_5</cstring>
+ </property>
+ <property name="text">
+ <string>Tracker Status:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>m_tracker_status</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="1">
+ <property name="name">
+ <cstring>m_tracker_update_time</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>207</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout17</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout25</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_chunks_caption</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>200</red>
+ <green>200</green>
+ <blue>200</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Chunks</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Parts of the torrent which have been downloaded:</string>
+ </property>
+ </widget>
+ <widget class="kt::DownloadedChunkBar">
+ <property name="name">
+ <cstring>m_chunk_bar</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Parts of the torrent which are available:</string>
+ </property>
+ </widget>
+ <widget class="kt::AvailabilityChunkBar">
+ <property name="name">
+ <cstring>m_av_chunk_bar</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>4</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>VLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>m_sharing_caption</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>200</red>
+ <green>200</green>
+ <blue>200</blue>
+ </color>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Sharing</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="kt::FloatSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>maxRatio</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Your upload will stop when share ratio gets to this value. Zero means no limit.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel3_3</cstring>
+ </property>
+ <property name="text">
+ <string>Share ratio:</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="kt::FloatSpinBox">
+ <property name="name">
+ <cstring>maxTime</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Your upload will stop when you have uploaded for this many hours.</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_9</cstring>
+ </property>
+ <property name="text">
+ <string>Hours</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>useLimit</cstring>
+ </property>
+ <property name="text">
+ <string>Ratio limit:</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Limit works only in seed mode</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>useTimeLimit</cstring>
+ </property>
+ <property name="text">
+ <string>Time &amp;limit:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="1">
+ <property name="name">
+ <cstring>m_share_ratio</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>50</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="frameShape">
+ <enum>Panel</enum>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>MinimumExpanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>kt::DownloadedChunkBar</class>
+ <header location="local">downloadedchunkbar.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>20</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+ <customwidget>
+ <class>kt::AvailabilityChunkBar</class>
+ <header location="local">availabilitychunkbar.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>20</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+ <customwidget>
+ <class>kt::FloatSpinBox</class>
+ <header location="local">floatspinbox.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image0</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XBM.GZ" length="79">789c534e494dcbcc4b554829cdcdad8c2fcf4c29c95030e0524611cd48cd4ccf28010a1797249664262b2467241641a592324b8aa363156c15aab914146aadb90067111b1f</data>
+ </image>
+</images>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>downloadedchunkbar.h</includehint>
+ <includehint>availabilitychunkbar.h</includehint>
+ <includehint>floatspinbox.h</includehint>
+ <includehint>floatspinbox.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/infowidget/trackerview.cpp b/plugins/infowidget/trackerview.cpp
new file mode 100644
index 0000000..2339189
--- /dev/null
+++ b/plugins/infowidget/trackerview.cpp
@@ -0,0 +1,243 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "trackerview.h"
+#include <interfaces/torrentinterface.h>
+#include <interfaces/trackerslist.h>
+
+#include <qdatetime.h>
+#include <qstring.h>
+#include <qlabel.h>
+#include <qlistview.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+
+#include <klocale.h>
+#include <kurl.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <ksqueezedtextlabel.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klistview.h>
+
+#include <torrent/globals.h>
+#include <util/log.h>
+
+namespace kt
+{
+ TrackerView::TrackerView(QWidget *parent, const char *name)
+ :TrackerViewBase(parent, name), tc(0)
+ {
+ KIconLoader* iload = KGlobal::iconLoader();
+ btnUpdate->setIconSet(iload->loadIconSet("apply", KIcon::Small));
+ btnAdd->setIconSet(iload->loadIconSet("add", KIcon::Small));
+ btnRemove->setIconSet(iload->loadIconSet("remove", KIcon::Small));
+ btnRestore->setIconSet(iload->loadIconSet("undo", KIcon::Small));
+
+ QPalette p = lblCurrent->palette();
+ p.setColor(QPalette::Active,QColorGroup::Base,p.color(QPalette::Active,QColorGroup::Background));
+ lblCurrent->setPalette(p);
+ }
+
+ TrackerView::~TrackerView()
+ {
+ }
+
+ void TrackerView::btnAdd_clicked()
+ {
+ if(!tc || txtTracker->text().isEmpty())
+ return;
+
+ if(tc->getStats().priv_torrent)
+ {
+ KMessageBox::sorry(0, i18n("Cannot add a tracker to a private torrent."));
+ return;
+ }
+
+ KURL url(txtTracker->text());
+ if(!url.isValid())
+ {
+ KMessageBox::error(0, i18n("Malformed URL."));
+ return;
+ }
+
+ new QListViewItem(listTrackers, txtTracker->text());
+ tc->getTrackersList()->addTracker(url,true);
+ }
+
+ void TrackerView::btnRemove_clicked()
+ {
+ QListViewItem* current = listTrackers->currentItem();
+ if(!current)
+ return;
+
+ KURL url(current->text(0));
+ if(tc->getTrackersList()->removeTracker(url))
+ delete current;
+ else
+ KMessageBox::sorry(0, i18n("Cannot remove torrent default tracker."));
+ }
+
+ void TrackerView::btnChange_clicked()
+ {
+ QListViewItem* current = listTrackers->currentItem();
+ if(!current)
+ return;
+
+ KURL url(current->text(0));
+ tc->getTrackersList()->setTracker(url);
+ tc->updateTracker();
+ }
+
+ void TrackerView::btnRestore_clicked()
+ {
+ tc->getTrackersList()->restoreDefault();
+ tc->updateTracker();
+
+ // update the list of trackers
+ listTrackers->clear();
+
+ const KURL::List trackers = tc->getTrackersList()->getTrackerURLs();
+ if(trackers.empty())
+ return;
+
+ for (KURL::List::const_iterator i = trackers.begin();i != trackers.end();i++)
+ new QListViewItem(listTrackers, (*i).prettyURL());
+ }
+
+ void TrackerView::btnUpdate_clicked()
+ {
+ if(!tc)
+ return;
+
+ tc->updateTracker();
+ }
+
+ void TrackerView::listTrackers_currentChanged(QListViewItem* item)
+ {
+ if(!item)
+ txtTracker->clear();
+ else
+ txtTracker->setText(item->text(0));
+ }
+
+ void TrackerView::changeTC(TorrentInterface* ti)
+ {
+ if (tc == ti)
+ return;
+
+ setEnabled(ti != 0);
+ torrentChanged(ti);
+ update();
+ }
+
+ void TrackerView::update()
+ {
+ if(!tc)
+ return;
+
+ const TorrentStats & s = tc->getStats();
+ if (s.running)
+ {
+ QTime t;
+ t = t.addSecs(tc->getTimeToNextTrackerUpdate());
+ lblUpdate->setText(t.toString("mm:ss"));
+ }
+
+ //Update manual annunce button
+ btnUpdate->setEnabled(s.running && tc->announceAllowed());
+ // only enable change when we can actually change and the torrent is running
+ btnChange->setEnabled(s.running && listTrackers->childCount() > 1);
+
+ lblStatus->setText("<b>" + s.trackerstatus + "</b>");
+ if (tc->getTrackersList())
+ {
+ QString t = tc->getTrackersList()->getTrackerURL().prettyURL();
+ if (lblCurrent->text() != t )
+ lblCurrent->setText(t);
+ }
+ else
+ lblCurrent->clear();
+
+ btnAdd->setEnabled(txtTracker->text() != QString::null && !tc->getStats().priv_torrent);
+ }
+
+ void TrackerView::onLoadingFinished(const KURL & ,bool,bool)
+ {
+ torrentChanged(tc);
+ }
+
+ void TrackerView::torrentChanged(TorrentInterface* ti)
+ {
+ tc = ti;
+ listTrackers->clear();
+ if(!tc)
+ {
+ lblStatus->clear();
+ lblCurrent->clear();
+ lblUpdate->clear();
+ txtTracker->clear();
+
+ btnAdd->setEnabled(false);
+ btnRemove->setEnabled(false);
+ btnRestore->setEnabled(false);
+ btnChange->setEnabled(false);
+ btnRestore->setEnabled(false);
+ return;
+ }
+
+ const TorrentStats & s = tc->getStats();
+
+ if (s.priv_torrent)
+ {
+ btnAdd->setEnabled(false);
+ btnRemove->setEnabled(false);
+ btnRestore->setEnabled(false);
+ txtTracker->setText(i18n("You cannot add trackers to a private torrent"));
+ txtTracker->setEnabled(false);
+ }
+ else
+ {
+ btnAdd->setEnabled(true);
+ btnRemove->setEnabled(true);
+ btnRestore->setEnabled(true);
+ txtTracker->clear();
+ txtTracker->setEnabled(true);
+ }
+
+ const KURL::List trackers = tc->getTrackersList()->getTrackerURLs();
+ if(trackers.empty())
+ {
+ new QListViewItem(listTrackers, tc->getTrackersList()->getTrackerURL().prettyURL());
+ }
+ else
+ {
+ for (KURL::List::const_iterator i = trackers.begin();i != trackers.end();i++)
+ new QListViewItem(listTrackers, (*i).prettyURL());
+ }
+
+ btnUpdate->setEnabled(s.running && tc->announceAllowed());
+ btnChange->setEnabled(s.running && listTrackers->childCount() > 1);
+ }
+}
+
+
+#include "trackerview.moc"
diff --git a/plugins/infowidget/trackerview.h b/plugins/infowidget/trackerview.h
new file mode 100644
index 0000000..fd23fb8
--- /dev/null
+++ b/plugins/infowidget/trackerview.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Joris Guisson, Ivan Vasic *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 TRACKERVIEW_H
+#define TRACKERVIEW_H
+
+#include <kurl.h>
+#include "trackerviewbase.h"
+
+namespace kt
+{
+ class TorrentInterface;
+ class TorrentFileInterface;
+
+ /**
+ * @author Ivan Vasic <ivan@ktorrent.org>
+ */
+ class TrackerView: public TrackerViewBase
+ {
+ Q_OBJECT
+ public:
+ TrackerView(QWidget *parent = 0, const char *name = 0);
+ virtual ~TrackerView();
+
+ void update();
+ void changeTC(TorrentInterface* ti);
+
+ public slots:
+ virtual void btnUpdate_clicked();
+ virtual void btnRestore_clicked();
+ virtual void btnChange_clicked();
+ virtual void btnRemove_clicked();
+ virtual void btnAdd_clicked();
+ virtual void listTrackers_currentChanged(QListViewItem*);
+ void onLoadingFinished(const KURL & ,bool,bool);
+
+ private:
+ void torrentChanged(TorrentInterface* ti);
+
+ private:
+ TorrentInterface* tc;
+
+ };
+}
+#endif
diff --git a/plugins/infowidget/trackerviewbase.ui b/plugins/infowidget/trackerviewbase.ui
new file mode 100644
index 0000000..758ddc7
--- /dev/null
+++ b/plugins/infowidget/trackerviewbase.ui
@@ -0,0 +1,317 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>TrackerViewBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>TrackerViewBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>750</width>
+ <height>254</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLineEdit" row="1" column="0">
+ <property name="name">
+ <cstring>txtTracker</cstring>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>btnUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Update Tracker</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Minimum update interval - 60 seconds</string>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>btnAdd</cstring>
+ </property>
+ <property name="text">
+ <string>Add Trac&amp;ker</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnRemove</cstring>
+ </property>
+ <property name="text">
+ <string>Remove Tracker</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnChange</cstring>
+ </property>
+ <property name="text">
+ <string>Ch&amp;ange Tracker</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>68</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnRestore</cstring>
+ </property>
+ <property name="text">
+ <string>Restore Defaults</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="KListView" row="2" column="0">
+ <column>
+ <property name="text">
+ <string>Trackers</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>listTrackers</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ <property name="fullWidth">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>URL:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>lblCurrent</cstring>
+ </property>
+ <property name="font">
+ <font>
+ <bold>1</bold>
+ </font>
+ </property>
+ <property name="frameShape">
+ <enum>NoFrame</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Plain</enum>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5_2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Status:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblStatus</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Next update in:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblUpdate</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>btnChange</sender>
+ <signal>clicked()</signal>
+ <receiver>TrackerViewBase</receiver>
+ <slot>btnChange_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnUpdate</sender>
+ <signal>clicked()</signal>
+ <receiver>TrackerViewBase</receiver>
+ <slot>btnUpdate_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnAdd</sender>
+ <signal>clicked()</signal>
+ <receiver>TrackerViewBase</receiver>
+ <slot>btnAdd_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnRemove</sender>
+ <signal>clicked()</signal>
+ <receiver>TrackerViewBase</receiver>
+ <slot>btnRemove_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnRestore</sender>
+ <signal>clicked()</signal>
+ <receiver>TrackerViewBase</receiver>
+ <slot>btnRestore_clicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>btnChange_clicked()</slot>
+ <slot>listTrackers_currentChanged(QListViewItem*)</slot>
+ <slot>btnUpdate_clicked()</slot>
+ <slot>btnAdd_clicked()</slot>
+ <slot>btnRemove_clicked()</slot>
+ <slot>btnRestore_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klistview.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/ipfilter/Makefile.am b/plugins/ipfilter/Makefile.am
new file mode 100644
index 0000000..02b193a
--- /dev/null
+++ b/plugins/ipfilter/Makefile.am
@@ -0,0 +1,31 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktipfilterplugin.la
+noinst_HEADERS = ipfilterplugin.h ipblockingprefpage.h antip2p.h \
+ convertdialog.h
+ktipfilterplugin_la_SOURCES = ipfilterplugin.cpp ipblockingpref.ui \
+ ipblockingprefpage.cpp ipfilterpluginsettings.kcfgc antip2p.cpp convert_dlg.ui \
+ convertdialog.cpp
+
+# Libs needed by the plugin
+ktipfilterplugin_la_LIBADD = $(LIB_KHTML) $(LIB_KPARTS) \
+ ../../libktorrent/libktorrent.la $(LIB_QT) \
+ $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktipfilterplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktsearchplugin
+# plugins_DATA = ktsearchpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktipfilterplugin.desktop
+
+kde_kcfg_DATA = ktipfilterplugin.kcfg
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/ipfilter/antip2p.cpp b/plugins/ipfilter/antip2p.cpp
new file mode 100644
index 0000000..28f9b24
--- /dev/null
+++ b/plugins/ipfilter/antip2p.cpp
@@ -0,0 +1,237 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 "antip2p.h"
+
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/constants.h>
+#include <util/mmapfile.h>
+
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+#include <qstring.h>
+#include <qvaluelist.h>
+
+using namespace bt;
+
+namespace kt
+{
+
+ bool IPBlock::operator < (const IPBlock & b) const
+ {
+ if (ip2 < b.ip1) // a range is before b range
+ return true;
+ else if (b.ip2 < ip1) // b range is before a range
+ return false;
+ else
+ return ip1 < b.ip1;// a and b intersect
+ }
+
+ Uint32 AntiP2P::toUint32(const QString& ip)
+ {
+ bool test;
+ Uint32 ret = ip.section('.',0,0).toULongLong(&test);
+ ret <<= 8;
+ ret |= ip.section('.',1,1).toULong(&test);
+ ret <<= 8;
+ ret |= ip.section('.',2,2).toULong(&test);
+ ret <<= 8;
+ ret |= ip.section('.',3,3).toULong(&test);
+
+ return ret;
+ }
+
+ QString fromUint32(Uint32 ip)
+ {
+ Uint32 tmp = ip;
+ QString out;
+
+ tmp = ip;
+ tmp &= 0x000000FF;
+ out.prepend(QString("%1").arg(tmp));
+ ip >>= 8;
+ tmp = ip;
+ tmp &= 0x000000FF;
+ out.prepend(QString("%1.").arg(tmp));
+ ip >>= 8;
+ tmp = ip;
+ tmp &= 0x000000FF;
+ out.prepend(QString("%1.").arg(tmp));
+ ip >>= 8;
+ tmp = ip;
+ tmp &= 0x000000FF;
+ out.prepend(QString("%1.").arg(tmp));
+
+ return out;
+ }
+
+ AntiP2P::AntiP2P()
+ {
+ header_loaded = false;
+ load();
+ }
+
+ AntiP2P::~AntiP2P()
+ {
+ if(file)
+ delete file;
+
+ Out(SYS_IPF|LOG_ALL) << "Anti-P2P filter unloaded." << endl;
+ }
+
+ void AntiP2P::load()
+ {
+ file = new MMapFile();
+ if(! file->open(KGlobal::dirs()->saveLocation("data","ktorrent") + "level1.dat", MMapFile::READ) )
+ {
+ Out(SYS_IPF|LOG_NOTICE) << "Anti-p2p file not loaded." << endl;
+ file = 0;
+ return;
+ }
+ Out(SYS_IPF|LOG_ALL) << "Loading Anti-P2P filter..." << endl;
+ }
+
+ void AntiP2P::loadHeader()
+ {
+ if(!file)
+ return;
+
+ Uint32 nrElements = file->getSize() / sizeof(IPBlock);
+ uint blocksize = nrElements < 100 ? 10 : 100; // number of entries that each HeaderBlock holds. If total number is < 100, than this value is 10.
+ HeaderBlock hb;
+
+ for(Uint64 i = 0; i < file->getSize() ; i+= sizeof(IPBlock)*(blocksize) )
+ {
+ IPBlock ipb;
+ hb.offset = i;
+ file->seek(MMapFile::BEGIN, i);
+ file->read(&ipb, sizeof(IPBlock));
+ hb.ip1 = ipb.ip1;
+ if ( i + (blocksize-1)*sizeof(IPBlock) > file->getSize() ) //last entry
+ {
+ file->seek(MMapFile::BEGIN, file->getSize() - sizeof(IPBlock));
+ file->read(&ipb, sizeof(IPBlock));
+ hb.ip2 = ipb.ip2;
+ hb.nrEntries = nrElements % blocksize;
+
+ blocks.push_back(hb);
+ break;
+ }
+ file->seek(MMapFile::BEGIN, i + (blocksize-1)*sizeof(IPBlock));
+ file->read(&ipb, sizeof(IPBlock));
+ hb.ip2 = ipb.ip2;
+ hb.nrEntries = blocksize;
+ blocks.push_back(hb);
+ }
+
+ Out(SYS_IPF|LOG_NOTICE) << "AntiP2P header loaded." << endl;
+ header_loaded = true;
+ }
+
+ bool AntiP2P::exists()
+ {
+ return file != 0;
+ }
+
+ bool AntiP2P::isBlockedIP(const QString& ip )
+ {
+ Uint32 test = toUint32(ip);
+ return isBlockedIP(test);
+ }
+
+ int AntiP2P::searchHeader(Uint32& ip, int start, int end)
+ {
+ if (end == 0)
+ return -1; //empty list
+
+ if (end == 1)
+ {
+ if (blocks[start].ip1 <= ip && blocks[start].ip2 >= ip) //then our IP is somewhere in between
+ {
+ if (blocks[start].ip1 == ip || blocks[start].ip2 == ip)
+ return -2; //Return -2 to signal that this IP matches either IP from header. No need to search mmaped file in that case.
+ else
+ return start; //else return block index
+ }
+ else
+ return -1; //not found
+ }
+ else
+ {
+ int i = start + end/2;
+ if (blocks[i].ip1 <= ip)
+ return searchHeader(ip, i, end - end/2);
+ else
+ return searchHeader(ip, start, end/2);
+ }
+ }
+
+ bool AntiP2P::isBlockedIP( Uint32& ip )
+ {
+ if (!header_loaded)
+ {
+ Out(SYS_IPF|LOG_IMPORTANT) << "Tried to check if IP was blocked, but no AntiP2P header was loaded." << endl;
+ return false;
+ }
+
+ int in_header = searchHeader(ip, 0, blocks.count());
+ switch (in_header)
+ {
+ case -1:
+ return false; //ip is not blocked
+ case -2:
+ return true; //ip is blocked (we're really lucky to find it in header already)
+ default:
+ //search mmapped file
+ HeaderBlock to_be_searched = blocks[in_header];
+ Uint8* fptr = (Uint8*) file->getDataPointer();
+ fptr += to_be_searched.offset;
+ IPBlock* file_blocks = (IPBlock*) fptr;
+ return searchFile(file_blocks, ip, 0, to_be_searched.nrEntries);
+ break;
+ }
+ return false;
+ }
+
+ bool AntiP2P::searchFile(IPBlock* file_blocks, Uint32& ip, int start, int end)
+ {
+ if (end == 0)
+ return false; //empty list, so not found
+
+ if (end == 1)
+ {
+ if (file_blocks[start].ip1 <= ip && file_blocks[start].ip2 >= ip) //we have a match!
+ return true;
+ else
+ return false; //IP is not found.
+ }
+
+ else
+ {
+ int i = start + end/2;
+ if (file_blocks[i].ip1 <= ip)
+ return searchFile(file_blocks, ip, i, end - end/2);
+ else
+ return searchFile(file_blocks, ip, start, end/2);
+ }
+ }
+}
diff --git a/plugins/ipfilter/antip2p.h b/plugins/ipfilter/antip2p.h
new file mode 100644
index 0000000..48350e3
--- /dev/null
+++ b/plugins/ipfilter/antip2p.h
@@ -0,0 +1,117 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 ANTIP2P_H
+#define ANTIP2P_H
+
+#include <util/mmapfile.h>
+#include <util/constants.h>
+
+#include <qvaluelist.h>
+#include <qstring.h>
+
+namespace kt
+{
+ typedef struct
+ {
+ bt::Uint32 ip1;
+ bt::Uint32 ip2;
+ bt::Uint64 offset;
+ bt::Uint32 nrEntries;
+ } HeaderBlock;
+
+ struct IPBlock
+ {
+ bt::Uint32 ip1;
+ bt::Uint32 ip2;
+
+ bool operator < (const IPBlock & b) const;
+ };
+
+ /**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief This class is used to manage anti-p2p filter list, so called level1.
+ */
+ class AntiP2P
+ {
+ public:
+ AntiP2P();
+ ~AntiP2P();
+
+ /**
+ * Checks if anti-p2p file is present. Used to check if we should use level1 list
+ **/
+ bool exists();
+
+
+ /**
+ * Creates and loads the header from antip2p filter file.
+ **/
+ void loadHeader();
+
+
+ /**
+ * Checks if specified IP is listed in filter file.
+ * @return TRUE if IP should be blocked, FALSE otherwise
+ * @param ip QString representation of IP to be checked
+ **/
+ bool isBlockedIP(const QString& ip);
+
+ /**
+ * Overloaded function. Uses Uint32 IP to be checked
+ **/
+ bool isBlockedIP(bt::Uint32& ip);
+
+ /**
+ * This function converts QString IP to Uint32 format.
+ **/
+ static bt::Uint32 toUint32(const QString& ip);
+
+ private:
+ bt::MMapFile* file;
+ QValueList<HeaderBlock> blocks;
+
+ ///Is AntiP2P header loaded
+ bool header_loaded;
+
+ /**
+ * Loads filter file
+ */
+ void load();
+
+ /**
+ * Binary searches AntiP2P::blocks to find range where IP could be.
+ * @returns
+ * -1 if IP cannot be in the list
+ * -2 if IP is already found in blocks
+ * or index of HeaderBlock in AntiP2P::blocks which will be used for direct file search.
+ **/
+ int searchHeader(bt::Uint32& ip, int start, int end);
+
+
+ /**
+ * Binary searches AntiP2P::file to find IP.
+ * @returns TRUE if IP should be blocked FALSE otherwise
+ **/
+ bool searchFile(IPBlock* file_blocks, bt::Uint32& ip, int start, int end);
+
+ };
+}
+#endif
diff --git a/plugins/ipfilter/convert_dlg.ui b/plugins/ipfilter/convert_dlg.ui
new file mode 100644
index 0000000..cc246ed
--- /dev/null
+++ b/plugins/ipfilter/convert_dlg.ui
@@ -0,0 +1,157 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ConvertingDlg</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ConvertingDlg</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>414</width>
+ <height>156</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="caption">
+ <string>Converting...</string>
+ </property>
+ <property name="modal">
+ <bool>true</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>Fixed</enum>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Click on the 'convert' button to start converting antip2p file. NOTE: This process could take a while even on fast machines and during that time you will not be able to use KTorrent.</string>
+ </property>
+ <property name="textFormat">
+ <enum>AutoText</enum>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ <property name="indent">
+ <number>-2</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>lbl_progress</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KProgress" row="2" column="0">
+ <property name="name">
+ <cstring>kProgress1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>390</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>label1</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnClose</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnCancel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>C&amp;ancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>btnClose</sender>
+ <signal>clicked()</signal>
+ <receiver>ConvertingDlg</receiver>
+ <slot>btnClose_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>ConvertingDlg</receiver>
+ <slot>btnCancel_clicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>btnClose_clicked()</slot>
+ <slot>btnCancel_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kprogress.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/ipfilter/convertdialog.cpp b/plugins/ipfilter/convertdialog.cpp
new file mode 100644
index 0000000..6fed40f
--- /dev/null
+++ b/plugins/ipfilter/convertdialog.cpp
@@ -0,0 +1,262 @@
+/***************************************************************************
+* Copyright (C) 2005 by Joris Guisson *
+* joris.guisson@gmail.com *
+* *
+* 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 "convertdialog.h"
+
+#include <kapplication.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kurl.h>
+#include <kmessagebox.h>
+#include <kio/netaccess.h>
+#include <kprogress.h>
+#include <kmimetype.h>
+
+#include <util/log.h>
+#include <util/constants.h>
+#include <torrent/globals.h>
+#include <interfaces/coreinterface.h>
+
+#include <qfile.h>
+#include <qstringlist.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qvalidator.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qevent.h>
+#include <qurloperator.h>
+#include "antip2p.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+
+ Uint32 toUint32(QString& ip)
+ {
+ bool test;
+ Uint32 ret = ip.section('.',0,0).toULongLong(&test);
+ ret <<= 8;
+ ret |= ip.section('.',1,1).toULong(&test);
+ ret <<= 8;
+ ret |= ip.section('.',2,2).toULong(&test);
+ ret <<= 8;
+ ret |= ip.section('.',3,3).toULong(&test);
+
+ return ret;
+ }
+
+ IPBlock RangeToBlock(const QString& range)
+ {
+ IPBlock block;
+ QStringList ls = QStringList::split('-', range);
+ block.ip1 = toUint32(ls[0]);
+ block.ip2 = toUint32(ls[1]);
+ return block;
+ }
+
+ ConvertDialog::ConvertDialog( IPFilterPlugin* p, QWidget *parent, const char *name )
+ : ConvertingDlg( parent, name )
+ {
+ m_plugin = p;
+ btnClose->setText(i18n("Convert"));
+ to_convert = true;
+ converting = false;
+ canceled = false;
+ kProgress1->setEnabled(false);
+ }
+
+ void ConvertDialog::convert()
+ {
+ QFile source( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.txt" );
+ QFile target( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat" );
+ QFile temp( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp" );
+
+ if(target.exists())
+ {
+ //make backup
+ KIO::NetAccess::file_copy(KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat", KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp", -1, true);
+ }
+
+ /* READ INPUT FILE */
+ QValueList<IPBlock> list;
+ lbl_progress->setText( i18n( "Loading txt file..." ) );
+ label1->setText( i18n("Please wait...") );
+ ulong source_size = source.size();
+ btnClose->setEnabled( false );
+ converting = true;
+
+ int counter = 0;
+
+ if ( source.open( IO_ReadOnly ) )
+ {
+ QTextStream stream( &source );
+ kProgress1->setEnabled(true);
+
+ int i = 0;
+ QRegExp rx( "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}-[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" );
+ QRegExpValidator v( rx, 0 );
+ int poz = 0;
+
+ while ( !stream.atEnd() )
+ {
+ if(canceled)
+ return;
+
+ KApplication::kApplication() ->processEvents();
+ QString line = stream.readLine();
+ i += line.length() * sizeof( char ); //rough estimation of string size
+ kProgress1->setProgress( i * 100 / source_size );
+ ++i;
+
+ QString ip_part = line.section( ':' , -1 );
+ if ( v.validate( ip_part, poz ) != QValidator::Acceptable )
+ continue;
+ else
+ ++counter;
+
+ list += RangeToBlock(ip_part);
+ }
+ source.close();
+ }
+ else
+ {
+ Out(SYS_IPF|LOG_IMPORTANT) << "Cannot find level1 file" << endl;
+ btnClose->setEnabled( true );
+ btnClose->setText(i18n("&Close"));
+ label1->setText("");
+ to_convert = false;
+ converting = false;
+ return ;
+ }
+
+ if ( counter != 0 )
+ {
+ qHeapSort(list);
+ lbl_progress->setText( i18n( "Converting..." ) );
+ if ( m_plugin )
+ m_plugin->unloadAntiP2P();
+
+ ulong blocks = list.count();
+
+ /** WRITE TO OUTPUT **/
+ if ( !target.open( IO_WriteOnly ) )
+ {
+ Out(SYS_IPF|LOG_IMPORTANT) << "Unable to open file for writing" << endl;
+ btnClose->setEnabled( true );
+ btnClose->setText(i18n("&Close"));
+ label1->setText("");
+ to_convert = false;
+ converting = false;
+ return ;
+ }
+
+ Out(SYS_IPF|LOG_NOTICE) << "Loading finished. Starting conversion..." << endl;
+
+ QValueList<IPBlock>::iterator iter;
+ int i = 0;
+ for (iter = list.begin(); iter != list.end(); ++iter, ++i)
+ {
+ IPBlock & block = *iter;
+ target.writeBlock( ( char* ) & block, sizeof( IPBlock ) );
+ if ( i % 1000 == 0 )
+ {
+ kProgress1->setProgress( ( int ) 100 * i / blocks );
+ if ( i % 10000 == 0 )
+ Out(SYS_IPF|LOG_DEBUG) << "Block " << i << " written." << endl;
+ }
+ KApplication::kApplication()->processEvents();
+
+ if(canceled)
+ return;
+ }
+ kProgress1->setProgress(100);
+ Out(SYS_IPF|LOG_NOTICE) << "Finished converting." << endl;
+ lbl_progress->setText( i18n( "File converted." ) );
+ target.close();
+ }
+ else
+ {
+ lbl_progress->setText( "<font color=\"#ff0000\">" + i18n( "Could not load filter:" ) + "</font>" + i18n( "Bad filter file. It may be corrupted or has a bad format." ) );
+ target.remove();
+ source.remove();
+ btnClose->setEnabled( true );
+ btnClose->setText(i18n("&Close"));
+ label1->setText("");
+ to_convert = false;
+ converting = false;
+ }
+
+ KApplication::kApplication()->processEvents();
+ //reload level1 filter
+ if ( m_plugin )
+ m_plugin->loadAntiP2P();
+
+ btnClose->setEnabled( true );
+ to_convert = false;
+ converting = false;
+ btnClose->setText(i18n("&Close"));
+ label1->setText("");
+ }
+
+ void ConvertDialog::btnClose_clicked()
+ {
+ if(to_convert)
+ convert();
+ else
+ this->close();
+ }
+
+ void ConvertDialog::closeEvent(QCloseEvent* e)
+ {
+ if(!converting)
+ e->accept();
+ else
+ e->ignore();
+ }
+
+ void ConvertDialog::btnCancel_clicked()
+ {
+ if(converting)
+ {
+ QFile target( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat" );
+ if(target.exists())
+ target.remove();
+
+ QFile temp( KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp");
+ if(temp.exists())
+ {
+ KIO::NetAccess::file_copy(KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat.tmp", KGlobal::dirs() ->saveLocation( "data", "ktorrent" ) + "level1.dat", -1, true);
+ temp.remove();
+ }
+
+ canceled = true;
+ Out(SYS_IPF|LOG_NOTICE) << "Conversion canceled." << endl;
+ }
+
+
+ this->reject();
+ }
+
+}
+
+#include "convertdialog.moc"
diff --git a/plugins/ipfilter/convertdialog.h b/plugins/ipfilter/convertdialog.h
new file mode 100644
index 0000000..be451f3
--- /dev/null
+++ b/plugins/ipfilter/convertdialog.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+* Copyright (C) 2005 by Joris Guisson *
+* joris.guisson@gmail.com *
+* *
+* 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 CONVERTDIALOG_H
+#define CONVERTDIALOG_H
+
+#include "convert_dlg.h"
+#include "ipfilterplugin.h"
+
+#include <qevent.h>
+
+namespace kt
+{
+ class ConvertDialog: public ConvertingDlg
+ {
+ Q_OBJECT
+
+ public:
+ ConvertDialog( IPFilterPlugin* p, QWidget *parent = 0, const char *name = 0 );
+
+ public slots:
+ virtual void btnClose_clicked();
+
+ private:
+ void convert();
+ IPFilterPlugin* m_plugin;
+ bool to_convert;
+ bool converting;
+ bool canceled;
+
+ private slots:
+ void closeEvent(QCloseEvent* e);
+ virtual void btnCancel_clicked();
+ };
+}
+#endif
diff --git a/plugins/ipfilter/ipblockingpref.ui b/plugins/ipfilter/ipblockingpref.ui
new file mode 100644
index 0000000..43870f0
--- /dev/null
+++ b/plugins/ipfilter/ipblockingpref.ui
@@ -0,0 +1,204 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>IPBlockingPref</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>IPBlockingPref</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>564</width>
+ <height>444</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>IPBlocking Preferences</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox" row="0" column="0">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="title">
+ <string>Select PeerGuardian Filter File </string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>checkUseLevel1</cstring>
+ </property>
+ <property name="text">
+ <string>Use PeerGuardian filter?</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>IP filter file:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_url</cstring>
+ </property>
+ <property name="url" stdset="0">
+ <string>http://www.bluetack.co.uk/modules.php?name=Downloads&amp;d_op=getit&amp;lid=8</string>
+ </property>
+ <property name="showLocalProtocol">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>361</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnDownload</cstring>
+ </property>
+ <property name="text">
+ <string>Dow&amp;nload/Convert</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Download PeerGuardian filter from bluetack.co.uk or blocklist.org.
+NOTE: ZIP file from bluetack.co.uk is supported.</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>lbl_status1</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>btnDownload</sender>
+ <signal>clicked()</signal>
+ <receiver>IPBlockingPref</receiver>
+ <slot>btnDownload_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>checkUseLevel1</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>IPBlockingPref</receiver>
+ <slot>checkUseLevel1_toggled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkUseLevel1</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel1_2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>checkUseLevel1</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel1_3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>btnDownload_clicked()</slot>
+ <slot>checkUseLevel1_toggled(bool)</slot>
+ <slot>checkUseKTfilter_toggled(bool)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/ipfilter/ipblockingprefpage.cpp b/plugins/ipfilter/ipblockingprefpage.cpp
new file mode 100644
index 0000000..6d06d1b
--- /dev/null
+++ b/plugins/ipfilter/ipblockingprefpage.cpp
@@ -0,0 +1,258 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 "ipblockingprefpage.h"
+#include "ipblockingpref.h"
+#include "ipfilterpluginsettings.h"
+#include "ipfilterplugin.h"
+#include "convertdialog.h"
+
+#include <kapplication.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kurlrequester.h>
+#include <kurl.h>
+#include <kmessagebox.h>
+#include <kio/netaccess.h>
+#include <kprogress.h>
+#include <kmimetype.h>
+
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <interfaces/coreinterface.h>
+
+#include <qthread.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qregexp.h>
+#include <qvalidator.h>
+#include <qlayout.h>
+#include <qdialog.h>
+#include <qobject.h>
+
+using namespace bt;
+
+#define MAX_RANGES 500
+
+namespace kt
+{
+ IPBlockingPrefPageWidget::IPBlockingPrefPageWidget(QWidget* parent) : IPBlockingPref(parent)
+ {
+ m_url->setURL(IPBlockingPluginSettings::filterURL());
+ if (m_url->url() == "")
+ m_url->setURL(QString("http://www.bluetack.co.uk/config/splist.zip"));
+
+ bool use_level1 = IPBlockingPluginSettings::useLevel1();
+
+ checkUseLevel1->setChecked(use_level1);
+
+ if(use_level1)
+ {
+ lbl_status1->setText(i18n("Status: Loaded and running."));
+ m_url->setEnabled(true);
+ btnDownload->setEnabled(true);
+ }
+ else
+ {
+ lbl_status1->setText(i18n("Status: Not loaded."));
+ m_url->setEnabled(false);
+ btnDownload->setEnabled(false);
+ }
+
+ m_plugin = 0;
+ }
+
+ void IPBlockingPrefPageWidget::apply()
+ {
+ IPBlockingPluginSettings::setFilterURL(m_url->url());
+ IPBlockingPluginSettings::setUseLevel1(checkUseLevel1->isChecked());
+ IPBlockingPluginSettings::writeConfig();
+
+ if(checkUseLevel1->isChecked())
+ {
+ QFile target(KGlobal::dirs()->saveLocation("data","ktorrent") + "level1.dat");
+ if(target.exists())
+ lbl_status1->setText(i18n("Status: Loaded and running."));
+ else
+ lbl_status1->setText(i18n("Status: <font color=\"#ff0000\">Filter file not found.</font> Download and convert filter file."));
+ }
+ else
+ lbl_status1->setText(i18n("Status: Not loaded."));
+ }
+
+ void IPBlockingPrefPageWidget::btnDownload_clicked()
+ {
+ QString target(KGlobal::dirs()->saveLocation("data","ktorrent") + "level1");
+ QFile target_file(target);
+ QFile txtfile(target + ".txt");
+ KURL url(m_url->url());
+ KURL dest(target);
+ KURL temp(KGlobal::dirs()->saveLocation("data","ktorrent") + "level1.tmp");
+ if(KIO::NetAccess::exists(temp,false, this))
+ KIO::NetAccess::del(temp,this);
+
+ bool download = true;
+
+ if(txtfile.exists())
+ {
+ if((KMessageBox::questionYesNo(this, i18n("Selected file already exists, do you want to download it again?"),i18n("File Exists")) == 4))
+ download = false;
+ else
+ KIO::NetAccess::move(target, temp);
+ }
+
+ if(download)
+ {
+ if(!url.isLocalFile())
+ {
+ if (KIO::NetAccess::download(url,target,NULL))
+ {
+ //Level1 list successfully downloaded, remove temporary file
+ KIO::NetAccess::removeTempFile(target);
+ KIO::NetAccess::del(temp, this);
+ }
+ else
+ {
+ QString err = KIO::NetAccess::lastErrorString();
+ if(err != QString::null)
+ KMessageBox::error(0,KIO::NetAccess::lastErrorString(),i18n("Error"));
+ else
+ KIO::NetAccess::move(temp, target);
+
+
+ //we don't want to convert since download failed
+ return;
+ }
+ }
+ else
+ {
+ if (!KIO::NetAccess::file_copy(url,dest, -1, true))
+ {
+ KMessageBox::error(0,KIO::NetAccess::lastErrorString(),i18n("Error"));
+ return;
+ }
+ }
+
+ //now determine if it's ZIP or TXT file
+ KMimeType::Ptr ptr = KMimeType::findByPath(target);
+ if(ptr->name() == "application/x-zip")
+ {
+ KURL zipfile("zip:" + target + "/splist.txt");
+ KURL destinationfile(target + ".txt");
+ KIO::NetAccess::file_copy(zipfile,destinationfile, -1, true);
+ }
+ else
+ {
+ KURL zipfile(target);
+ KURL destinationfile(target + ".txt");
+ KIO::NetAccess::file_copy(zipfile,destinationfile, -1, true);
+ }
+
+ }
+ convert();
+ }
+
+ void IPBlockingPrefPageWidget::checkUseLevel1_toggled(bool check)
+ {
+ if(check)
+ {
+ m_url->setEnabled(true);
+ btnDownload->setEnabled(true);
+ }
+ else
+ {
+ lbl_status1->setText("");
+ m_url->setEnabled(false);
+ btnDownload->setEnabled(false);
+ }
+ }
+
+ void IPBlockingPrefPageWidget::convert()
+ {
+ QFile target(KGlobal::dirs()->saveLocation("data","ktorrent") + "level1.dat");
+ if(target.exists())
+ {
+ if((KMessageBox::questionYesNo(this,i18n("Filter file (level1.dat) already exists, do you want to convert it again?"),i18n("File Exists")) == 4))
+ return;
+// else
+// KIO::NetAccess::del(KGlobal::dirs()->saveLocation("data","ktorrent") + "level1.dat", NULL);
+ }
+ ConvertDialog dlg(m_plugin);
+ dlg.exec();
+ }
+
+ void IPBlockingPrefPageWidget::setPlugin(IPFilterPlugin* p)
+ {
+ m_plugin = p;
+ }
+
+ void IPBlockingPrefPageWidget::setPrefPage( IPBlockingPrefPage * p )
+ {
+ m_prefpage = p;
+ }
+
+ void IPBlockingPrefPageWidget::setConverting(bool enable)
+ {
+ btnDownload->setEnabled(enable);
+ lbl_status1->setText("");
+ }
+
+
+ ////////////////////////////////////////////////////////////////////////////////////
+
+ IPBlockingPrefPage::IPBlockingPrefPage(CoreInterface* core, IPFilterPlugin* p)
+ : PrefPageInterface(i18n("IPBlocking Filter"), i18n("IPBlocking Filter Options"), KGlobal::iconLoader()->loadIcon("filter",KIcon::NoGroup)), m_core(core), m_plugin(p)
+ {
+ widget = 0;
+ }
+
+ IPBlockingPrefPage::~IPBlockingPrefPage()
+ {}
+
+ bool IPBlockingPrefPage::apply()
+ {
+ widget->apply();
+
+ if(IPBlockingPluginSettings::useLevel1())
+ m_plugin->loadAntiP2P();
+ else
+ m_plugin->unloadAntiP2P();
+
+ return true;
+ }
+
+ void IPBlockingPrefPage::createWidget(QWidget* parent)
+ {
+ widget = new IPBlockingPrefPageWidget(parent);
+ widget->setPlugin(m_plugin);
+ widget->setPrefPage(this);
+ }
+
+ void IPBlockingPrefPage::deleteWidget()
+ {
+ delete widget;
+ widget = 0;
+ }
+
+ void IPBlockingPrefPage::updateData()
+ {}
+}
diff --git a/plugins/ipfilter/ipblockingprefpage.h b/plugins/ipfilter/ipblockingprefpage.h
new file mode 100644
index 0000000..3779965
--- /dev/null
+++ b/plugins/ipfilter/ipblockingprefpage.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 IPBLOCKINGPREFPAGE_H
+#define IPBLOCKINGPREFPAGE_H
+
+#include <interfaces/prefpageinterface.h>
+#include "ipblockingpref.h"
+#include "ipfilterplugin.h"
+#include <interfaces/coreinterface.h>
+#include <qthread.h>
+#include <qobject.h>
+
+class KProgress;
+
+namespace kt
+{
+ class IPFilterPlugin;
+ class IPBlockingPrefPage;
+
+ /**
+ @author Ivan Vasic
+ */
+ class IPBlockingPrefPageWidget : public IPBlockingPref
+ {
+ public:
+ IPBlockingPrefPageWidget(QWidget *parent = 0);
+ void apply();
+ void convert();
+ void setPlugin(IPFilterPlugin* p);
+ void setPrefPage(IPBlockingPrefPage* p);
+
+ //used with ConvertThread to enable/disable controls while converting
+ void setConverting(bool enable);
+
+ public slots:
+ virtual void btnDownload_clicked();
+ virtual void checkUseLevel1_toggled(bool);
+
+ private:
+ IPFilterPlugin* m_plugin;
+ IPBlockingPrefPage* m_prefpage;
+ };
+
+ /**
+ * @author Ivan Vasic
+ * @brief IPBlocking plugin interface page
+ **/
+ class IPBlockingPrefPage : public PrefPageInterface
+ {
+ public:
+ IPBlockingPrefPage(CoreInterface* core, IPFilterPlugin* p);
+ virtual ~IPBlockingPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void updateData();
+ virtual void deleteWidget();
+
+ private:
+ CoreInterface* m_core;
+ IPBlockingPrefPageWidget* widget;
+ IPFilterPlugin* m_plugin;
+ };
+}
+#endif
diff --git a/plugins/ipfilter/ipfilterplugin.cpp b/plugins/ipfilter/ipfilterplugin.cpp
new file mode 100644
index 0000000..2f53197
--- /dev/null
+++ b/plugins/ipfilter/ipfilterplugin.cpp
@@ -0,0 +1,129 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+
+#include <interfaces/coreinterface.h>
+#include <interfaces/guiinterface.h>
+#include <util/constants.h>
+#include <torrent/ipblocklist.h>
+
+#include <qstring.h>
+
+#include "ipfilterplugin.h"
+#include "ipfilterpluginsettings.h"
+#include "antip2p.h"
+
+using namespace bt;
+
+K_EXPORT_COMPONENT_FACTORY(ktipfilterplugin,KGenericFactory<kt::IPFilterPlugin>("ipfilterplugin"))
+
+namespace kt
+{
+ const QString NAME = "IP Filter";
+ const QString AUTHOR = "Ivan Vasic";
+ const QString EMAIL = "ivasic@gmail.com";
+ const QString DESCRIPTION = i18n("Filters out unwanted peers based on their IP address");
+
+ IPFilterPlugin::IPFilterPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("IP Filter"),AUTHOR,EMAIL,DESCRIPTION,"filter")
+ {
+ // setXMLFile("ktpluginui.rc");
+ level1 = 0;
+ }
+
+
+ IPFilterPlugin::~IPFilterPlugin()
+ {
+ //...just in case something goes wrong...
+ IPBlocklist& ipblist = IPBlocklist::instance();
+ ipblist.unsetPluginInterfacePtr();
+ }
+
+ void IPFilterPlugin::load()
+ {
+ pref = new IPBlockingPrefPage(getCore(), this);
+ getGUI()->addPrefPage(pref);
+
+ if(IPBlockingPluginSettings::useLevel1())
+ loadAntiP2P();
+
+ //now we need to set a pointer to the IPBlocklist
+ IPBlocklist& ipblist = IPBlocklist::instance();
+ ipblist.setPluginInterfacePtr(this);
+ }
+
+ void IPFilterPlugin::unload()
+ {
+ //First unset pointer in IPBlocklist
+ IPBlocklist& ipblist = IPBlocklist::instance();
+ ipblist.unsetPluginInterfacePtr();
+
+ getGUI()->removePrefPage(pref);
+ delete pref;
+ pref = 0;
+ if(level1)
+ {
+ delete level1;
+ level1 = 0;
+ }
+ }
+
+ bool IPFilterPlugin::loadAntiP2P()
+ {
+ if(level1 != 0)
+ return true;
+ level1 = new AntiP2P();
+ if(!level1->exists())
+ {
+ delete level1;
+ level1 = 0;
+ return false;
+ }
+ level1->loadHeader();
+ return true;
+ }
+
+ bool IPFilterPlugin::unloadAntiP2P()
+ {
+ if(level1 != 0)
+ {
+ delete level1;
+ level1 = 0;
+ return true;
+ }
+ else
+ //anything else to check?
+ return true;
+ }
+
+ bool IPFilterPlugin::isBlockedIP(const QString& ip)
+ {
+ if (level1 == 0)
+ return false;
+
+ return level1->isBlockedIP(ip);
+ }
+
+ bool IPFilterPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+}
diff --git a/plugins/ipfilter/ipfilterplugin.h b/plugins/ipfilter/ipfilterplugin.h
new file mode 100644
index 0000000..2e9c984
--- /dev/null
+++ b/plugins/ipfilter/ipfilterplugin.h
@@ -0,0 +1,73 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTIPFILTERPLUGIN_H
+#define KTIPFILTERPLUGIN_H
+
+#include <interfaces/plugin.h>
+#include <interfaces/ipblockinginterface.h>
+
+#include "ipblockingprefpage.h"
+#include "antip2p.h"
+
+class QString;
+
+namespace kt
+{
+ class IPBlockingPrefPage;
+
+ /**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief IP filter plugin
+ *
+ * This plugin will load IP ranges from specific files into KT IPBlocklist.
+ */
+ class IPFilterPlugin : public Plugin, public kt::IPBlockingInterface
+ {
+ Q_OBJECT
+ public:
+ IPFilterPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~IPFilterPlugin();
+
+ virtual void load();
+ virtual void unload();
+
+ ///Loads the KT format list filter
+ void loadFilters();
+
+ ///Loads the anti-p2p filter list
+ bool loadAntiP2P();
+
+ ///Unloads the anti-p2p filter list
+ bool unloadAntiP2P();
+
+
+ ///Checks if IP is listed in AntiP2P filter list.
+ bool isBlockedIP(const QString& ip);
+
+ bool versionCheck(const QString & version) const;
+ private:
+ IPBlockingPrefPage* pref;
+ AntiP2P* level1;
+ };
+
+}
+
+#endif
diff --git a/plugins/ipfilter/ipfilterpluginsettings.kcfgc b/plugins/ipfilter/ipfilterpluginsettings.kcfgc
new file mode 100644
index 0000000..b9aeaeb
--- /dev/null
+++ b/plugins/ipfilter/ipfilterpluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktipfilterplugin.kcfg
+ClassName=IPBlockingPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables \ No newline at end of file
diff --git a/plugins/ipfilter/ktipfilterplugin.desktop b/plugins/ipfilter/ktipfilterplugin.desktop
new file mode 100644
index 0000000..3c442a9
--- /dev/null
+++ b/plugins/ipfilter/ktipfilterplugin.desktop
@@ -0,0 +1,56 @@
+[Desktop Entry]
+Name=IPFilterPlugin
+Name[bg]=Приставка за IP-филтриране
+Name[br]=Lugent Sil IP
+Name[de]=IP-Filter-Modul
+Name[el]=Πρόσθετο φίλτρου IP
+Name[es]=Filtro de IP
+Name[et]=IP-filtri plugin
+Name[it]=Plugin filtro ip
+Name[nb]=IP-filtermodul
+Name[nds]="IP-Filter"-Moduul
+Name[nl]=IPFilter-plugin
+Name[pl]=Wtyczka filtru IP
+Name[pt]=Filtro de IPs
+Name[pt_BR]=Plugin de Filtro de IP
+Name[sk]=IPFilter Plugin
+Name[sr]=Прикључак IP филтера
+Name[sr@Latn]=Priključak IP filtera
+Name[sv]=IP-filterinsticksprogram
+Name[tr]=IP Filtre Eklentisi
+Name[xx]=xxIPFilterPluginxx
+Name[zh_CN]=IP 过滤器插件
+Name[zh_TW]=IPFilter外掛程式
+Comment=IP filter plugin for KTorrent
+Comment[ar]=قابس مرشح IP لِــ KTorrent
+Comment[bg]=Приставка за IP-филтриране (KTorrent)
+Comment[br]=Lugent sil IP evit KTorrentt
+Comment[ca]=Connector de filtres d'IP per a Ktorrent
+Comment[cs]=IP filtr modul pro KTorrent
+Comment[de]=IP-Filter-Modul für KTorrent
+Comment[el]=Πρόσθετο φίλτρου IP για το KTorrent
+Comment[es]=Complemento de filtro de IP de KTorrent
+Comment[et]=KTorrenti IP-filtri plugin
+Comment[fa]=وصلۀ پالایۀ IP برای KTorrent
+Comment[gl]=Plugin de filtrado de IPs para KTorrent
+Comment[it]=Plugin filtro ip per KTorrent
+Comment[ja]=KTorrent のための IP フィルタプラグイン
+Comment[ka]=KTorrent-ის IP ფილტრაციის მოდული
+Comment[nb]=IP-filtermodul for KTorrent
+Comment[nds]="IP-Filter"-Moduul för KTorrent
+Comment[nl]=Plugin om op IP-adressen te filteren in KTorrent
+Comment[pl]=Wtyczka filtru IP dla KTorrent
+Comment[pt]='Plugin' de filtragem de IPs do KTorrent
+Comment[pt_BR]=Plugin de Filtro de IP para o KTorrent
+Comment[sk]=IP filter plugin pre KTorrent
+Comment[sr]=Прикључак IP филтера за KTorrent
+Comment[sr@Latn]=Priključak IP filtera za KTorrent
+Comment[sv]=IP-filterinsticksprogram för Ktorrent
+Comment[tr]=KTorrent için IP filtre eklentisi
+Comment[uk]=Втулок фільтрування IP для KTorrent
+Comment[xx]=xxIP filter plugin for KTorrentxx
+Comment[zh_CN]=KTorrent 的 IP 过滤器插件
+Comment[zh_TW]=KTorrent IP 過濾器外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktipfilterplugin
diff --git a/plugins/ipfilter/ktipfilterplugin.kcfg b/plugins/ipfilter/ktipfilterplugin.kcfg
new file mode 100644
index 0000000..18ab419
--- /dev/null
+++ b/plugins/ipfilter/ktipfilterplugin.kcfg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktipfilterpluginrc"/>
+ <group name="general">
+ <entry name="filterURL" type="String">
+ <label>Level1 filter url</label>
+ <default></default>
+ </entry>
+ <entry name="useLevel1" type="Bool">
+ <label>Use level1 filter?</label>
+ <default>FALSE</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/logviewer/Makefile.am b/plugins/logviewer/Makefile.am
new file mode 100644
index 0000000..c925a12
--- /dev/null
+++ b/plugins/logviewer/Makefile.am
@@ -0,0 +1,33 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktlogviewerplugin.la
+
+
+# Libs needed by the plugin
+ktlogviewerplugin_la_LIBADD = $(LIB_KHTML) $(LIB_KPARTS) \
+ ../../libktorrent/libktorrent.la $(LIB_QT) \
+ $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktlogviewerplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktsearchplugin
+# plugins_DATA = ktsearchpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktlogviewerplugin.desktop
+
+kde_kcfg_DATA = ktlogviewerplugin.kcfg
+
+noinst_HEADERS = logviewerplugin.h logviewer.h logprefpage.h logprefwidget.h \
+ logflags.h
+ktlogviewerplugin_la_SOURCES = logviewerplugin.cpp logviewer.cpp \
+ logprefpage.cpp logprefwidgetbase.ui logprefwidget.cpp logviewerpluginsettings.kcfgc \
+ logflags.cpp
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/logviewer/ktlogviewerplugin.desktop b/plugins/logviewer/ktlogviewerplugin.desktop
new file mode 100644
index 0000000..ba2e625
--- /dev/null
+++ b/plugins/logviewer/ktlogviewerplugin.desktop
@@ -0,0 +1,26 @@
+[Desktop Entry]
+Name=LogViewerPlugin
+Name[bg]=Приставка за преглед на журнални файлове
+Name[de]=Modul zur Anzeige von Protokolldateien
+Name[el]=Πρόσθετο προβολής καταγραφής
+Name[es]=Visualizador del registro
+Name[et]=Loginäitaja plugin
+Name[it]=Plugin visore registro
+Name[nb]=Logvisningsmodul
+Name[nds]=Logbookkieker-Moduul
+Name[nl]=Logweergaveplugin
+Name[pl]=Wtyczka wyświetlania dziennika
+Name[pt]=Visualizador do Registo
+Name[pt_BR]=Plugin de Vizualização de Log
+Name[sk]=LogViewer Plugin
+Name[sr]=Прикључак приказа дневника
+Name[sr@Latn]=Priključak prikaza dnevnika
+Name[sv]=Loggvisningsinsticksprogram
+Name[tr]=Kayıt Görüntü Eklentisi
+Name[uk]=Втулок перегляду журналу
+Name[xx]=xxLogViewerPluginxx
+Name[zh_CN]=日志查看器插件
+Name[zh_TW]=紀錄檢視器外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktlogviewerplugin
diff --git a/plugins/logviewer/ktlogviewerplugin.kcfg b/plugins/logviewer/ktlogviewerplugin.kcfg
new file mode 100644
index 0000000..c6e4a25
--- /dev/null
+++ b/plugins/logviewer/ktlogviewerplugin.kcfg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <group name="general">
+
+ <entry name = "useRichText" type ="Bool">
+ <label>Use rich log text</label>
+ <default>false</default>
+ </entry>
+
+ <entry name="sysGEN" type="UInt">
+ <label>General info messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysCON" type="UInt">
+ <label>Connections messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysDHT" type="UInt">
+ <label>DHT messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysTRK" type="UInt">
+ <label>Tracker info messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysDIO" type="UInt">
+ <label>Disk IO info messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysIPF" type="UInt">
+ <label>IPFilter plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysSRC" type="UInt">
+ <label>Search plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysPFI" type="UInt">
+ <label>PartFileImport plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysINW" type="UInt">
+ <label>InfoWidget plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysPNP" type="UInt">
+ <label>UPnP plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysSNF" type="UInt">
+ <label>ScanFolder plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysSCD" type="UInt">
+ <label>Scheduler plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysRSS" type="UInt">
+ <label>RSS plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ <entry name="sysWEB" type="UInt">
+ <label>WebInterface plugin messages flag</label>
+ <default>0</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/logviewer/logflags.cpp b/plugins/logviewer/logflags.cpp
new file mode 100644
index 0000000..ef1ba69
--- /dev/null
+++ b/plugins/logviewer/logflags.cpp
@@ -0,0 +1,170 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "logflags.h"
+#include "logviewer.h"
+#include "logviewerpluginsettings.h"
+
+#include <util/log.h>
+#include <torrent/globals.h>
+
+#include <qstring.h>
+
+using namespace bt;
+
+namespace kt
+{
+
+ LogFlags* LogFlags::self = 0;
+ LogViewer* LogFlags::m_log = 0;
+
+ LogFlags::LogFlags()
+ {
+ updateFlags();
+ }
+
+ LogFlags::~LogFlags()
+ {}
+
+ LogFlags& LogFlags::instance()
+ {
+ if (!self)
+ self = new LogFlags();
+ return *self;
+ }
+
+ bool LogFlags::checkFlags(unsigned int arg)
+ {
+ if(arg & SYS_GEN)
+ return m_flags.SYSGEN & arg;
+
+ if(arg & SYS_CON)
+ return (arg & m_flags.SYSCON) && ((arg & 0x0000000F) <= m_flags.SYSCON);
+
+ if(arg & SYS_DHT)
+ return (arg & m_flags.SYSDHT) && ((arg & 0x0000000F) <= m_flags.SYSDHT);
+
+ if(arg & SYS_TRK)
+ return (arg & m_flags.SYSTRK) && ((arg & 0x0000000F) <= m_flags.SYSTRK);
+
+ if(arg & SYS_DIO)
+ return (arg & m_flags.SYSDIO) && ((arg & 0x0000000F) <= m_flags.SYSDIO);
+
+ if(arg & SYS_INW)
+ return (arg & m_flags.SYSINW) && ((arg & 0x0000000F) <= m_flags.SYSINW);
+
+ if(arg & SYS_IPF)
+ return (arg & m_flags.SYSIPF) && ((arg & 0x0000000F) <= m_flags.SYSIPF);
+
+ if(arg & SYS_PFI)
+ return (arg & m_flags.SYSPFI) && ((arg & 0x0000000F) <= m_flags.SYSPFI);
+
+ if(arg & SYS_PNP)
+ return (arg & m_flags.SYSPNP) && ((arg & 0x0000000F) <= m_flags.SYSPNP);
+
+ if(arg & SYS_SCD)
+ return (arg & m_flags.SYSSCD) && ((arg & 0x0000000F) <= m_flags.SYSSCD);
+
+ if(arg & SYS_SNF)
+ return (arg & m_flags.SYSSNF) && ((arg & 0x0000000F) <= m_flags.SYSSNF);
+
+ if(arg & SYS_SRC)
+ return (arg & m_flags.SYSSRC) && ((arg & 0x0000000F) <= m_flags.SYSSRC);
+
+ if(arg & SYS_RSS)
+ return (arg & m_flags.SYSRSS) && ((arg & 0x0000000F) <= m_flags.SYSRSS);
+
+ if(arg & SYS_WEB)
+ return (arg & m_flags.SYSWEB) && ((arg & 0x0000000F) <= m_flags.SYSWEB);
+
+ return true;
+ }
+
+ void LogFlags::updateFlags()
+ {
+ m_flags.SYSGEN = LogViewerPluginSettings::sysGEN();
+ m_flags.SYSCON = LogViewerPluginSettings::sysCON();
+ m_flags.SYSDHT = LogViewerPluginSettings::sysDHT();
+ m_flags.SYSTRK = LogViewerPluginSettings::sysTRK();
+ m_flags.SYSDIO = LogViewerPluginSettings::sysDIO();
+
+ m_flags.SYSINW = LogViewerPluginSettings::sysINW();
+ m_flags.SYSIPF = LogViewerPluginSettings::sysIPF();
+ m_flags.SYSPFI = LogViewerPluginSettings::sysPFI();
+ m_flags.SYSPNP = LogViewerPluginSettings::sysPNP();
+ m_flags.SYSSCD = LogViewerPluginSettings::sysSCD();
+ m_flags.SYSSNF = LogViewerPluginSettings::sysSNF();
+ m_flags.SYSSRC = LogViewerPluginSettings::sysSRC();
+ m_flags.SYSRSS = LogViewerPluginSettings::sysRSS();
+ m_flags.SYSWEB = LogViewerPluginSettings::sysWEB();
+
+ m_useRichText = LogViewerPluginSettings::useRichText();
+
+ if(m_log)
+ m_log->setRichText(m_useRichText);
+ }
+
+ void LogFlags::finalize()
+ {
+ delete self;
+ self = 0;
+ m_log = 0;
+ }
+
+ bool LogFlags::useRichText()
+ {
+ return m_useRichText;
+ }
+
+ void LogFlags::setLog(LogViewer* log)
+ {
+ m_log = log;
+ }
+
+ QString& LogFlags::getFormattedMessage(unsigned int arg, QString& line)
+ {
+ if( (arg & LOG_ALL) == LOG_ALL)
+ {
+ return line;
+ }
+
+ if(arg & 0x04)
+ {
+ line.prepend("<font color=\"#646464\">");
+ line.append("</font>");
+ return line;
+ }
+
+ if(arg & 0x02)
+ {
+ line.prepend("<font color=\"#000000\">");
+ line.append("</font>");
+ return line;
+ }
+
+ if(arg & 0x01)
+ {
+ line.prepend("<font color=\"#460000\">");
+ line.append("</font>");
+ return line;
+ }
+
+ return line;
+ }
+}
diff --git a/plugins/logviewer/logflags.h b/plugins/logviewer/logflags.h
new file mode 100644
index 0000000..9d7245a
--- /dev/null
+++ b/plugins/logviewer/logflags.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTLOGFLAGS_H
+#define KTLOGFLAGS_H
+
+class QString;
+
+namespace kt
+{
+ struct _logFlags
+ {
+ unsigned int SYSCON;
+ unsigned int SYSTRK;
+ unsigned int SYSDHT;
+ unsigned int SYSGEN;
+ unsigned int SYSDIO;
+
+ unsigned int SYSIPF;
+ unsigned int SYSSRC;
+ unsigned int SYSPNP;
+ unsigned int SYSINW;
+ unsigned int SYSSNF;
+ unsigned int SYSPFI;
+ unsigned int SYSSCD;
+ unsigned int SYSRSS;
+ unsigned int SYSWEB;
+ };
+
+ class LogViewer;
+
+ /**
+ * Class to read/save logging messages flags.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class LogFlags
+ {
+ public:
+ virtual ~LogFlags();
+
+ static LogFlags& instance();
+
+ ///Checks current flags with arg. Return true if message should be shown
+ bool checkFlags(unsigned int arg);
+
+ ///Updates flags from Settings::
+ void updateFlags();
+
+ ///Destroys this object
+ static void finalize();
+
+ ///Checks if LogViewer should print rich text format.
+ bool useRichText();
+
+ ///Sets a pointer to LogViewer
+ void setLog(LogViewer* log);
+
+ ///Makes line rich text according to arg level.
+ QString& getFormattedMessage(unsigned int arg, QString& line);
+
+ private:
+ LogFlags();
+
+ struct _logFlags m_flags;
+
+ static LogFlags* self;
+
+ static LogViewer* m_log;
+
+ bool m_useRichText;
+ };
+
+}
+
+#endif
diff --git a/plugins/logviewer/logprefpage.cpp b/plugins/logviewer/logprefpage.cpp
new file mode 100644
index 0000000..cc89a68
--- /dev/null
+++ b/plugins/logviewer/logprefpage.cpp
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasic *
+ * ivasic@gmail.com *
+ * *
+ * 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 "logprefpage.h"
+#include "logprefwidget.h"
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+namespace kt
+{
+
+ LogPrefPage::LogPrefPage()
+ : PrefPageInterface(i18n("LogViewer"), i18n("LogViewer Options"),
+ KGlobal::iconLoader()->loadIcon("toggle_log",KIcon::NoGroup))
+ {
+ m_widget = 0;
+ }
+
+
+ LogPrefPage::~LogPrefPage()
+ {}
+
+ bool LogPrefPage::apply()
+ {
+ if(m_widget)
+ return m_widget->apply();
+
+ return true;
+ }
+
+ void LogPrefPage::createWidget(QWidget* parent)
+ {
+ m_widget = new LogPrefWidget(parent);
+ }
+
+ void LogPrefPage::updateData()
+ {
+ }
+
+ void LogPrefPage::deleteWidget()
+ {
+ if(m_widget)
+ delete m_widget;
+ }
+}
diff --git a/plugins/logviewer/logprefpage.h b/plugins/logviewer/logprefpage.h
new file mode 100644
index 0000000..3aed61b
--- /dev/null
+++ b/plugins/logviewer/logprefpage.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasic *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTLOGPREFPAGE_H
+#define KTLOGPREFPAGE_H
+
+#include <interfaces/prefpageinterface.h>
+
+#include "logprefwidget.h"
+
+namespace kt
+{
+
+ /**
+ * LogViewer plugin preferences page
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class LogPrefPage : public PrefPageInterface
+ {
+ public:
+ LogPrefPage();
+ virtual ~LogPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void updateData();
+ virtual void deleteWidget();
+
+ private:
+ LogPrefWidget* m_widget;
+ };
+
+}
+
+#endif
diff --git a/plugins/logviewer/logprefwidget.cpp b/plugins/logviewer/logprefwidget.cpp
new file mode 100644
index 0000000..6bf99bd
--- /dev/null
+++ b/plugins/logviewer/logprefwidget.cpp
@@ -0,0 +1,123 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasic *
+ * ivasic@gmail.com *
+ * *
+ * 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 "logprefwidget.h"
+#include "logviewerpluginsettings.h"
+#include "logflags.h"
+
+#include <kglobal.h>
+#include <klocale.h>
+
+#include <qwidget.h>
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+
+namespace kt
+{
+ LogPrefWidget::LogPrefWidget(QWidget *parent, const char *name)
+ :LogPrefWidgetBase(parent, name)
+ {
+ m_sysgen->setCurrentItem(getLevel(LogViewerPluginSettings::sysGEN()));
+ m_syscon->setCurrentItem(getLevel(LogViewerPluginSettings::sysCON()));
+ m_sysdht->setCurrentItem(getLevel(LogViewerPluginSettings::sysDHT()));
+ m_systrk->setCurrentItem(getLevel(LogViewerPluginSettings::sysTRK()));
+ m_sysdio->setCurrentItem(getLevel(LogViewerPluginSettings::sysDIO()));
+
+ m_sysipf->setCurrentItem(getLevel(LogViewerPluginSettings::sysIPF()));
+ m_syspfi->setCurrentItem(getLevel(LogViewerPluginSettings::sysPFI()));
+ m_sysinw->setCurrentItem(getLevel(LogViewerPluginSettings::sysINW()));
+ m_syspnp->setCurrentItem(getLevel(LogViewerPluginSettings::sysPNP()));
+ m_syssrc->setCurrentItem(getLevel(LogViewerPluginSettings::sysSRC()));
+ m_sysscd->setCurrentItem(getLevel(LogViewerPluginSettings::sysSCD()));
+ m_syssnf->setCurrentItem(getLevel(LogViewerPluginSettings::sysSNF()));
+ m_sysrss->setCurrentItem(getLevel(LogViewerPluginSettings::sysRSS()));
+ m_sysweb->setCurrentItem(getLevel(LogViewerPluginSettings::sysWEB()));
+
+ m_useRich->setChecked(LogViewerPluginSettings::useRichText());
+ }
+
+ bool LogPrefWidget::apply()
+ {
+ LogViewerPluginSettings::setSysGEN(getArg(m_sysgen->currentItem()));
+ LogViewerPluginSettings::setSysCON(getArg(m_syscon->currentItem()));
+ LogViewerPluginSettings::setSysDHT(getArg(m_sysdht->currentItem()));
+ LogViewerPluginSettings::setSysTRK(getArg(m_systrk->currentItem()));
+ LogViewerPluginSettings::setSysDIO(getArg(m_sysdio->currentItem()));
+
+ LogViewerPluginSettings::setSysIPF(getArg(m_sysipf->currentItem()));
+ LogViewerPluginSettings::setSysPFI(getArg(m_syspfi->currentItem()));
+ LogViewerPluginSettings::setSysINW(getArg(m_sysinw->currentItem()));
+ LogViewerPluginSettings::setSysPNP(getArg(m_syspnp->currentItem()));
+ LogViewerPluginSettings::setSysSRC(getArg(m_syssrc->currentItem()));
+ LogViewerPluginSettings::setSysSCD(getArg(m_sysscd->currentItem()));
+ LogViewerPluginSettings::setSysSNF(getArg(m_syssnf->currentItem()));
+ LogViewerPluginSettings::setSysRSS(getArg(m_sysrss->currentItem()));
+ LogViewerPluginSettings::setSysWEB(getArg(m_sysweb->currentItem()));
+
+ LogViewerPluginSettings::setUseRichText(m_useRich->isChecked());
+
+
+ LogViewerPluginSettings::writeConfig();
+
+ LogFlags::instance().updateFlags();
+
+ return true;
+ }
+
+ int LogPrefWidget::getLevel(unsigned int arg)
+ {
+ switch(arg)
+ {
+ case 0x0F:
+ return 0;
+ case 0x07:
+ return 1;
+ case 0x03:
+ return 2;
+ case 0x01:
+ return 3;
+ case 0x00:
+ return 4;
+ default:
+ return 0;
+ }
+ }
+
+ unsigned int LogPrefWidget::getArg(int level)
+ {
+ switch(level)
+ {
+ case 0:
+ return 0x0F;
+ case 1:
+ return 0x07;
+ case 2:
+ return 0x03;
+ case 3:
+ return 0x01;
+ case 4:
+ return 0x00;
+ default:
+ return 0;
+ }
+ }
+}
+
+#include "logprefwidget.moc"
diff --git a/plugins/logviewer/logprefwidget.h b/plugins/logviewer/logprefwidget.h
new file mode 100644
index 0000000..35a6c06
--- /dev/null
+++ b/plugins/logviewer/logprefwidget.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasic *
+ * ivasic@gmail.com *
+ * *
+ * 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 LOGPREFWIDGET_H
+#define LOGPREFWIDGET_H
+
+#include "logprefwidgetbase.h"
+
+namespace kt
+{
+ class LogPrefWidget: public LogPrefWidgetBase
+ {
+ Q_OBJECT
+ public:
+ LogPrefWidget(QWidget *parent = 0, const char *name = 0);
+ bool apply();
+
+ private:
+ int getLevel(unsigned int arg);
+ unsigned int getArg(int level);
+ };
+}
+#endif
diff --git a/plugins/logviewer/logprefwidgetbase.ui b/plugins/logviewer/logprefwidgetbase.ui
new file mode 100644
index 0000000..76e7124
--- /dev/null
+++ b/plugins/logviewer/logprefwidgetbase.ui
@@ -0,0 +1,648 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>LogPrefWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>LogPrefWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>LogViewer Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>110</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QButtonGroup" row="0" column="1">
+ <property name="name">
+ <cstring>buttonGroup2</cstring>
+ </property>
+ <property name="title">
+ <string>Plugins</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysipf</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>IPFilter:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_5</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_syssrc</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Search:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_6</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_syspnp</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>UPnP:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_7</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel2_4</cstring>
+ </property>
+ <property name="text">
+ <string>ScanFolder:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_8</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_syssnf</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="4" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysscd</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel2_5</cstring>
+ </property>
+ <property name="text">
+ <string>Scheduler:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_9</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="5" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_syspfi</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="5" column="0">
+ <property name="name">
+ <cstring>textLabel2_6</cstring>
+ </property>
+ <property name="text">
+ <string>PartFileImport:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_10</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="6" column="0">
+ <property name="name">
+ <cstring>textLabel2_7</cstring>
+ </property>
+ <property name="text">
+ <string>InfoWidget:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_11</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="6" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysinw</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="7" column="0">
+ <property name="name">
+ <cstring>textLabel2_7_2</cstring>
+ </property>
+ <property name="text">
+ <string>RSS plugin:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_11</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="7" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysrss</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="8" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysweb</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="8" column="0">
+ <property name="name">
+ <cstring>textLabel2_7_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>WebInterface plugin:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>comboBox1_11</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="0" column="0">
+ <property name="name">
+ <cstring>buttonGroup3</cstring>
+ </property>
+ <property name="title">
+ <string>System</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>General:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2_8</cstring>
+ </property>
+ <property name="text">
+ <string>Connections:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel2_9</cstring>
+ </property>
+ <property name="text">
+ <string>DHT:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel2_10</cstring>
+ </property>
+ <property name="text">
+ <string>Tracker:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysgen</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_syscon</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysdht</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Disk I/O:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_systrk</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="4" column="1">
+ <item>
+ <property name="text">
+ <string>All</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Debug</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Notice</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Important</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>None</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>m_sysdio</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>buttonGroup3_2</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>m_useRich</cstring>
+ </property>
+ <property name="text">
+ <string>Use rich te&amp;xt for log</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/plugins/logviewer/logviewer.cpp b/plugins/logviewer/logviewer.cpp
new file mode 100644
index 0000000..5e6b16c
--- /dev/null
+++ b/plugins/logviewer/logviewer.cpp
@@ -0,0 +1,110 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kglobal.h>
+#include <kconfig.h>
+#include <qapplication.h>
+#include "logviewer.h"
+#include "logflags.h"
+#include "logviewerpluginsettings.h"
+
+namespace kt
+{
+ const int LOG_EVENT_TYPE = 65432;
+
+ class LogEvent : public QCustomEvent
+ {
+ QString str;
+ public:
+ LogEvent(const QString & str) : QCustomEvent(LOG_EVENT_TYPE),str(str)
+ {}
+
+ virtual ~LogEvent()
+ {}
+
+ const QString & msg() const {return str;}
+ };
+
+ LogViewer::LogViewer(QWidget *parent, const char *name)
+ : KTextBrowser(parent, name), LogMonitorInterface()
+ {
+ /*
+ IMPORTANT: use LogText mode, so that setMaxLogLines will work, if not everything will be kept in memory.
+ */
+ setTextFormat(Qt::LogText);
+ setMaxLogLines(200);
+ setMinimumSize(QSize(0,50));
+ setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
+ KGlobal::config()->setGroup("LogViewer");
+ if (KGlobal::config()->hasKey("LogViewerWidgetSize"))
+ {
+ QSize s = KGlobal::config()->readSizeEntry("LogViewerWidgetSize",0);
+ resize(s);
+ }
+
+ LogFlags::instance().setLog(this);
+ }
+
+
+ LogViewer::~LogViewer()
+ {
+ KGlobal::config()->setGroup("LogViewer");
+ KGlobal::config()->writeEntry("LogViewerWidgetSize",size());
+ LogFlags::instance().setLog(0);
+ }
+
+
+ void LogViewer::message(const QString& line, unsigned int arg)
+ {
+ /*
+ IMPORTANT: because QTextBrowser is not thread safe, we must use the Qt event mechanism
+ to add strings to it, this will ensure that strings will only be added in the main application
+ thread.
+ */
+ if(arg==0x00 || LogFlags::instance().checkFlags(arg))
+ {
+ if(m_useRichText)
+ {
+ QString tmp = line;
+ LogEvent* le = new LogEvent(LogFlags::instance().getFormattedMessage(arg, tmp));
+ QApplication::postEvent(this,le);
+ }
+ else
+ {
+ LogEvent* le = new LogEvent(line);
+ QApplication::postEvent(this,le);
+ }
+ }
+ }
+
+ void LogViewer::customEvent(QCustomEvent* ev)
+ {
+ if (ev->type() == LOG_EVENT_TYPE)
+ {
+ LogEvent* le = (LogEvent*)ev;
+ append(le->msg());
+ }
+ }
+
+ void LogViewer::setRichText(bool val)
+ {
+ m_useRichText = val;
+ }
+}
+#include "logviewer.moc"
diff --git a/plugins/logviewer/logviewer.h b/plugins/logviewer/logviewer.h
new file mode 100644
index 0000000..4198215
--- /dev/null
+++ b/plugins/logviewer/logviewer.h
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTLOGVIEWER_H
+#define KTLOGVIEWER_H
+
+#include <ktextbrowser.h>
+#include <interfaces/logmonitorinterface.h>
+#include "logflags.h"
+
+namespace kt
+{
+ /**
+ * @author Joris Guisson
+ */
+ class LogViewer : public KTextBrowser, public LogMonitorInterface
+ {
+ Q_OBJECT
+ public:
+ LogViewer(QWidget *parent = 0, const char *name = 0);
+ virtual ~LogViewer();
+
+ virtual void message(const QString& line, unsigned int arg);
+ virtual void customEvent(QCustomEvent* ev);
+
+ void setRichText(bool val);
+
+ private:
+ bool m_useRichText;
+ };
+
+}
+
+#endif
diff --git a/plugins/logviewer/logviewerplugin.cpp b/plugins/logviewer/logviewerplugin.cpp
new file mode 100644
index 0000000..aa35d2f
--- /dev/null
+++ b/plugins/logviewer/logviewerplugin.cpp
@@ -0,0 +1,84 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <interfaces/guiinterface.h>
+#include "logviewerplugin.h"
+#include "logviewer.h"
+#include "logprefpage.h"
+#include "logflags.h"
+
+#define NAME "Log Viewer"
+#define AUTHOR "Joris Guisson"
+#define EMAIL "joris.guisson@gmail.com"
+
+using namespace bt;
+
+K_EXPORT_COMPONENT_FACTORY(ktlogviewerplugin,KGenericFactory<kt::LogViewerPlugin>("ktlogviewerplugin"))
+
+namespace kt
+{
+
+ LogViewerPlugin::LogViewerPlugin(QObject* parent, const char* qt_name, const QStringList& args)
+ : Plugin(parent, qt_name, args, NAME,i18n("Log Viewer"), AUTHOR, EMAIL,
+ i18n("Displays ktorrent logging output"),"log")
+ {
+ lv = 0;
+ }
+
+
+ LogViewerPlugin::~LogViewerPlugin()
+ {}
+
+
+ void LogViewerPlugin::load()
+ {
+ lv = new LogViewer();
+ this->getGUI()->addToolWidget(lv,"log",i18n("Log Viewer"),GUIInterface::DOCK_BOTTOM);
+ bt::Log & lg = Globals::instance().getLog(0);
+ lg.addMonitor(lv);
+ pref = new LogPrefPage();
+ this->getGUI()->addPrefPage(pref);
+ }
+
+ void LogViewerPlugin::unload()
+ {
+ this->getGUI()->removeToolWidget(lv);
+ bt::Log & lg = Globals::instance().getLog(0);
+ lg.removeMonitor(lv);
+ delete lv;
+ lv = 0;
+ this->getGUI()->removePrefPage(pref);
+ delete pref;
+ pref = 0;
+ LogFlags::finalize();
+ }
+
+ bool LogViewerPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+
+}
+#include "logviewerplugin.moc"
diff --git a/plugins/logviewer/logviewerplugin.h b/plugins/logviewer/logviewerplugin.h
new file mode 100644
index 0000000..9cd5af8
--- /dev/null
+++ b/plugins/logviewer/logviewerplugin.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTLOGVIEWERPLUGIN_H
+#define KTLOGVIEWERPLUGIN_H
+
+#include <interfaces/plugin.h>
+
+
+
+namespace kt
+{
+ class LogViewer;
+ class LogPrefPage;
+
+ /**
+ * @author Joris Guisson
+ */
+ class LogViewerPlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ LogViewerPlugin(QObject* parent, const char* qt_name, const QStringList& args);
+ virtual ~LogViewerPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+ private:
+ LogViewer* lv;
+ LogPrefPage* pref;
+ };
+
+}
+
+#endif
diff --git a/plugins/logviewer/logviewerpluginsettings.kcfgc b/plugins/logviewer/logviewerpluginsettings.kcfgc
new file mode 100644
index 0000000..c10fa1c
--- /dev/null
+++ b/plugins/logviewer/logviewerpluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktlogviewerplugin.kcfg
+ClassName=LogViewerPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables \ No newline at end of file
diff --git a/plugins/partfileimport/Makefile.am b/plugins/partfileimport/Makefile.am
new file mode 100644
index 0000000..f5aca48
--- /dev/null
+++ b/plugins/partfileimport/Makefile.am
@@ -0,0 +1,27 @@
+INCLUDES = -I$(top_builddir)/apps/ktorrent -I$(srcdir)/../../libktorrent \
+ $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktpartfileimportplugin.la
+noinst_HEADERS = partfileimportplugin.h importdialog.h
+ktpartfileimportplugin_la_SOURCES = partfileimportplugin.cpp importdlgbase.ui importdialog.cpp
+
+# Libs needed by the plugin
+ktpartfileimportplugin_la_LIBADD = $(LIB_KHTML) $(LIB_KPARTS) \
+ ../../libktorrent/libktorrent.la \
+ $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktpartfileimportplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+rcdir = $(kde_datadir)/ktorrent
+rc_DATA = ktpartfileimportpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktpartfileimportplugin.desktop
+
+# kde_kcfg_DATA = ktpartfileimportplugin.kcfg
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/partfileimport/importdialog.cpp b/plugins/partfileimport/importdialog.cpp
new file mode 100644
index 0000000..22f9a4b
--- /dev/null
+++ b/plugins/partfileimport/importdialog.cpp
@@ -0,0 +1,389 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include <klocale.h>
+#include <kprogress.h>
+#include <kurlrequester.h>
+#include <kpushbutton.h>
+#include <kmessagebox.h>
+#include <kio/job.h>
+#include <kio/jobclasses.h>
+#include <util/log.h>
+#include <util/error.h>
+#include <util/file.h>
+#include <util/fileops.h>
+#include <util/functions.h>
+#include <torrent/globals.h>
+#include <torrent/torrent.h>
+#include <torrent/chunkmanager.h>
+#include <interfaces/coreinterface.h>
+#include "importdialog.h"
+#include <datachecker/singledatachecker.h>
+#include <datachecker/multidatachecker.h>
+
+using namespace bt;
+
+namespace kt
+{
+ ImportDialog::ImportDialog(CoreInterface* core,QWidget* parent, const char* name, bool modal, WFlags fl)
+ : ImportDlgBase(parent,name, modal,fl),DataCheckerListener(false),core(core)
+ {
+ KURLRequester* r = m_torrent_url;
+ r->setMode(KFile::File|KFile::LocalOnly);
+ r->setFilter("*.torrent|" + i18n("Torrent files") + "\n*|" + i18n("All files"));
+
+ r = m_data_url;
+ r->setMode(KFile::File|KFile::Directory|KFile::LocalOnly);
+
+ connect(m_import_btn,SIGNAL(clicked()),this,SLOT(onImport()));
+ connect(m_cancel_btn,SIGNAL(clicked()),this,SLOT(reject()));
+ m_progress->setEnabled(false);
+ }
+
+ ImportDialog::~ImportDialog()
+ {}
+
+ void ImportDialog::progress(Uint32 num,Uint32 total)
+ {
+ m_progress->setTotalSteps(total);
+ m_progress->setProgress(num);
+ }
+
+ void ImportDialog::status(Uint32 ,Uint32 )
+ {
+ // don't care
+ }
+
+ void ImportDialog::finished()
+ {
+ // only used for check in separate thread, so does not apply for the import plugin
+ }
+
+ void ImportDialog::import(Torrent & tor)
+ {
+ // get the urls
+ KURL tor_url = KURL::fromPathOrURL(m_torrent_url->url());
+ KURL data_url = KURL::fromPathOrURL(m_data_url->url());
+
+ // now we need to check the data
+ DataChecker* dc = 0;
+ if (tor.isMultiFile())
+ dc = new MultiDataChecker();
+ else
+ dc = new SingleDataChecker();
+
+ try
+ {
+ dc->setListener(this);
+ dc->check(data_url.path(),tor,QString::null);
+ }
+ catch (Error & e)
+ {
+ delete dc;
+ KMessageBox::error(this,i18n("Cannot verify data : %1").arg(e.toString()),i18n("Error"));
+ reject();
+ return;
+ }
+
+ // find a new torrent dir and make it if necessary
+ QString tor_dir = core->findNewTorrentDir();
+ if (!tor_dir.endsWith(bt::DirSeparator()))
+ tor_dir += bt::DirSeparator();
+
+ try
+ {
+ if (!bt::Exists(tor_dir))
+ bt::MakeDir(tor_dir);
+
+ // write the index file
+ writeIndex(tor_dir + "index",dc->getDownloaded());
+
+ // copy the torrent file
+ bt::CopyFile(tor_url.prettyURL(),tor_dir + "torrent");
+
+ Uint64 imported = calcImportedBytes(dc->getDownloaded(),tor);
+
+ // make the cache
+ if (tor.isMultiFile())
+ {
+ QValueList<Uint32> dnd_files;
+ bool dnd = false;
+ // first make tor_dir/cache/
+ QString cache_dir = tor_dir + "cache" + bt::DirSeparator();
+ QString dnd_dir = tor_dir + "dnd" + bt::DirSeparator();
+ if (!bt::Exists(cache_dir))
+ MakeDir(cache_dir);
+ if (!bt::Exists(dnd_dir))
+ MakeDir(dnd_dir);
+
+
+ // make all sub symlinks
+ for (Uint32 i = 0;i < tor.getNumFiles();i++)
+ {
+ linkTorFile(cache_dir,dnd_dir,data_url,tor.getFile(i).getPath(),dnd);
+ if (dnd)
+ dnd_files.append(i);
+ dnd = false;
+ }
+
+ QString durl = data_url.path();
+ if (durl.endsWith(bt::DirSeparator()))
+ durl = durl.left(durl.length() - 1);
+ int ds = durl.findRev(bt::DirSeparator());
+ if (durl.mid(ds+1) == tor.getNameSuggestion())
+ {
+ durl = durl.left(ds);
+ saveStats(tor_dir + "stats",KURL::fromPathOrURL(durl),imported,false);
+ }
+ else
+ {
+ saveStats(tor_dir + "stats",KURL::fromPathOrURL(durl),imported,true);
+ }
+ saveFileInfo(tor_dir + "file_info",dnd_files);
+ }
+ else
+ {
+ // single file, just symlink the data_url to tor_dir/cache
+ bt::SymLink(data_url.path(),tor_dir + "cache");
+ QString durl = data_url.path();
+ int ds = durl.findRev(bt::DirSeparator());
+ durl = durl.left(ds);
+ saveStats(tor_dir + "stats",durl,imported,false);
+ }
+
+ // everything went OK, so load the whole shabang and start downloading
+ core->loadExistingTorrent(tor_dir);
+ }
+ catch (Error & e)
+ {
+ // delete tor_dir
+ bt::Delete(tor_dir,true);
+ delete dc;
+ KMessageBox::error(this,e.toString(),i18n("Error"));
+ reject();
+ return;
+ }
+
+ delete dc;
+ accept();
+ }
+
+ void ImportDialog::onTorrentGetReult(KIO::Job* j)
+ {
+ if (j->error())
+ {
+ j->showErrorDialog(this);
+ reject();
+ }
+ else
+ {
+ KIO::StoredTransferJob* stj = (KIO::StoredTransferJob*)j;
+ Torrent tor;
+
+ // try to load the torrent
+ try
+ {
+ tor.load(stj->data(),false);
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,i18n("Cannot load the torrent file : %1").arg(e.toString()),
+ i18n("Error"));
+ reject();
+ return;
+ }
+ import(tor);
+ }
+ }
+
+ void ImportDialog::onImport()
+ {
+ m_progress->setEnabled(true);
+ m_import_btn->setEnabled(false);
+ m_cancel_btn->setEnabled(false);
+ m_torrent_url->setEnabled(false);
+ m_data_url->setEnabled(false);
+
+ KURL tor_url = KURL::fromPathOrURL(m_torrent_url->url());
+ if (!tor_url.isLocalFile())
+ {
+ // download the torrent file
+ KIO::StoredTransferJob* j = KIO::storedGet(tor_url);
+ connect(j,SIGNAL(result(KIO::Job* )),this,SLOT(onTorrentGetReult(KIO::Job*)));
+ }
+ else
+ {
+ KURL tor_url = KURL::fromPathOrURL(m_torrent_url->url());
+ Torrent tor;
+
+ // try to load the torrent
+ try
+ {
+ tor.load(tor_url.path(),false);
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,i18n("Cannot load the torrent file : %1").arg(e.toString()),
+ i18n("Error"));
+ reject();
+ return;
+ }
+ import(tor);
+ }
+ }
+
+ void ImportDialog::writeIndex(const QString & file,const BitSet & chunks)
+ {
+ // first try to open it
+ File fptr;
+ if (!fptr.open(file,"wb"))
+ throw Error(i18n("Cannot open %1 : %2").arg(file).arg(fptr.errorString()));
+
+ // write all chunks to the file
+ for (Uint32 i = 0;i < chunks.getNumBits();i++)
+ {
+ if (!chunks.get(i))
+ continue;
+
+ // we have the chunk so write a NewChunkHeader struct to the file
+ NewChunkHeader hdr;
+ hdr.index = i;
+ hdr.deprecated = 0;
+ fptr.write(&hdr,sizeof(NewChunkHeader));
+ }
+ }
+
+ void ImportDialog::linkTorFile(const QString & cache_dir,const QString & dnd_dir,
+ const KURL & data_url,const QString & fpath,bool & dnd)
+ {
+ QStringList sl = QStringList::split(bt::DirSeparator(),fpath);
+
+ // create all necessary subdirs
+ QString ctmp = cache_dir;
+ QString otmp = data_url.path();
+ if (!otmp.endsWith(bt::DirSeparator()))
+ otmp += bt::DirSeparator();
+
+ QString dtmp = dnd_dir;
+ for (Uint32 i = 0;i < sl.count() - 1;i++)
+ {
+ otmp += sl[i];
+ ctmp += sl[i];
+ dtmp += sl[i];
+ // we need to make the same directory structure in the cache
+ // as the output dir
+ if (!bt::Exists(ctmp))
+ MakeDir(ctmp);
+ if (!bt::Exists(otmp))
+ MakeDir(otmp);
+ if (!bt::Exists(dtmp))
+ MakeDir(dtmp);
+ otmp += bt::DirSeparator();
+ ctmp += bt::DirSeparator();
+ dtmp += bt::DirSeparator();
+ }
+
+ QString dfile = otmp + sl.last();
+ if (!bt::Exists(dfile))
+ {
+ // when we start the torrent the user will be asked what to do
+ // bt::SymLink(dfile,cache_dir + fpath);
+ dnd = false;
+ }
+ else
+ {
+ // just symlink the existing file
+ bt::SymLink(dfile,cache_dir + fpath);
+ dnd = false;
+ }
+ }
+
+ void ImportDialog::saveStats(const QString & stats_file,const KURL & data_url,Uint64 imported,bool custom_output_name)
+ {
+ QFile fptr(stats_file);
+ if (!fptr.open(IO_WriteOnly))
+ {
+ Out(SYS_PFI|LOG_IMPORTANT) << "Warning : can't create stats file" << endl;
+ return;
+ }
+
+ QTextStream out(&fptr);
+ out << "OUTPUTDIR=" << data_url.path() << ::endl;
+ out << "UPLOADED=0" << ::endl;
+ out << "RUNNING_TIME_DL=0" << ::endl;
+ out << "RUNNING_TIME_UL=0" << ::endl;
+ out << "PRIORITY=0" << ::endl;
+ out << "AUTOSTART=1" << ::endl;
+ if (core->getGlobalMaxShareRatio() > 0)
+ out << QString("MAX_RATIO=%1").arg(core->getGlobalMaxShareRatio(),0,'f',2) << ::endl;
+ out << QString("IMPORTED=%1").arg(imported) << ::endl;
+ if (custom_output_name)
+ out << "CUSTOM_OUTPUT_NAME=1" << endl;
+ }
+
+ Uint64 ImportDialog::calcImportedBytes(const bt::BitSet & chunks,const Torrent & tor)
+ {
+ Uint64 nb = 0;
+ Uint64 ls = tor.getFileLength() % tor.getChunkSize();
+ if (ls == 0)
+ ls = tor.getChunkSize();
+
+ for (Uint32 i = 0;i < chunks.getNumBits();i++)
+ {
+ if (!chunks.get(i))
+ continue;
+
+ if (i == chunks.getNumBits() - 1)
+ nb += ls;
+ else
+ nb += tor.getChunkSize();
+ }
+ return nb;
+ }
+
+ void ImportDialog::saveFileInfo(const QString & file_info_file,QValueList<Uint32> & dnd)
+ {
+ // saves which TorrentFile's do not need to be downloaded
+ File fptr;
+ if (!fptr.open(file_info_file,"wb"))
+ {
+ Out(SYS_PFI|LOG_IMPORTANT) << "Warning : Can't save chunk_info file : " << fptr.errorString() << endl;
+ return;
+ }
+
+ ;
+
+ // first write the number of excluded ones
+ Uint32 tmp = dnd.count();
+ fptr.write(&tmp,sizeof(Uint32));
+ // then all the excluded ones
+ for (Uint32 i = 0;i < dnd.count();i++)
+ {
+ tmp = dnd[i];
+ fptr.write(&tmp,sizeof(Uint32));
+ }
+ fptr.flush();
+ }
+}
+
+
+
+#include "importdialog.moc"
+
diff --git a/plugins/partfileimport/importdialog.h b/plugins/partfileimport/importdialog.h
new file mode 100644
index 0000000..b7617fc
--- /dev/null
+++ b/plugins/partfileimport/importdialog.h
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 IMPORTDIALOG_H
+#define IMPORTDIALOG_H
+
+#include <util/constants.h>
+#include <datachecker/datacheckerlistener.h>
+#include "importdlgbase.h"
+
+class KURL;
+
+namespace bt
+{
+ class BitSet;
+ class Torrent;
+}
+
+namespace KIO
+{
+ class Job;
+}
+
+
+namespace kt
+{
+ class CoreInterface;
+
+ class ImportDialog : public ImportDlgBase,public bt::DataCheckerListener
+ {
+ Q_OBJECT
+
+ public:
+ ImportDialog(CoreInterface* core,QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
+ virtual ~ImportDialog();
+
+ public slots:
+ void onImport();
+ void onTorrentGetReult(KIO::Job* j);
+
+ private:
+ void writeIndex(const QString & file,const bt::BitSet & chunks);
+ void linkTorFile(const QString & cache_dir,const QString & dnd_dir,
+ const KURL & data_url,const QString & fpath,bool & dnd);
+ void saveStats(const QString & stats_file,const KURL & data_url,bt::Uint64 imported,bool custom_output_name);
+ bt::Uint64 calcImportedBytes(const bt::BitSet & chunks,const bt::Torrent & tor);
+ void saveFileInfo(const QString & file_info_file,QValueList<bt::Uint32> & dnd);
+
+ virtual void progress(bt::Uint32 num,bt::Uint32 total);
+ virtual void status(bt::Uint32 num_failed,bt::Uint32 num_downloaded);
+ virtual void finished();
+
+ void import(bt::Torrent & tor);
+
+ private:
+ CoreInterface* core;
+ };
+}
+
+#endif
+
diff --git a/plugins/partfileimport/importdlgbase.ui b/plugins/partfileimport/importdlgbase.ui
new file mode 100644
index 0000000..e1cdd64
--- /dev/null
+++ b/plugins/partfileimport/importdlgbase.ui
@@ -0,0 +1,163 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ImportDlgBase</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ImportDlgBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>473</width>
+ <height>196</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Import an existing download</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Torrent:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>60</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Data:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_torrent_url</cstring>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>m_data_url</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="KActiveLabel">
+ <property name="name">
+ <cstring>kActiveLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Please specify the torrent and the data already downloaded for that torrent.</string>
+ </property>
+ </widget>
+ <widget class="KProgress">
+ <property name="name">
+ <cstring>m_progress</cstring>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>61</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_import_btn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Import</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_cancel_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Ca&amp;ncel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kactivelabel.h</includehint>
+ <includehint>kprogress.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/partfileimport/ktpartfileimportplugin.desktop b/plugins/partfileimport/ktpartfileimportplugin.desktop
new file mode 100644
index 0000000..5b28fe0
--- /dev/null
+++ b/plugins/partfileimport/ktpartfileimportplugin.desktop
@@ -0,0 +1,25 @@
+[Desktop Entry]
+Name=PartialFileImportPlugin
+Name[bg]=Приставка за частично импортиране на файлове
+Name[de]=Teildatei-Import-Modul
+Name[el]=Πρόσθετο εισαγωγής μερικής λήψης
+Name[es]=Importación de ficheros parciales
+Name[et]=Osalise faili impordi plugin
+Name[it]=Plugin importazione file parziali
+Name[nb]=Filimportmodul
+Name[nds]=Importmoduul för Deeldateien
+Name[nl]=Import gedeeltelijke bestanden
+Name[pl]=Wtyczka importu części plików
+Name[pt]=Importação de Ficheiros Parciais
+Name[pt_BR]=Plugin de Importação Parcial de Arquivo
+Name[sk]=PartialFileImport Plugin
+Name[sr]=Прикључак за увоз недовршених фајлова
+Name[sr@Latn]=Priključak za uvoz nedovršenih fajlova
+Name[sv]=Insticksprogram för partiell filimport
+Name[tr]=Tamamlanmamış Dosya Alma Eklentisi
+Name[xx]=xxPartialFileImportPluginxx
+Name[zh_CN]=部分文件导入插件
+Name[zh_TW]=PartialFileImport外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktpartfileimportplugin
diff --git a/plugins/partfileimport/ktpartfileimportpluginui.rc b/plugins/partfileimport/ktpartfileimportpluginui.rc
new file mode 100644
index 0000000..f8867e3
--- /dev/null
+++ b/plugins/partfileimport/ktpartfileimportpluginui.rc
@@ -0,0 +1,8 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="ktorrent" version="1">
+<MenuBar>
+ <Menu name="file">
+ <Action name="partfileimport"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/plugins/partfileimport/partfileimportplugin.cpp b/plugins/partfileimport/partfileimportplugin.cpp
new file mode 100644
index 0000000..c154478
--- /dev/null
+++ b/plugins/partfileimport/partfileimportplugin.cpp
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kstdaction.h>
+#include <kpopupmenu.h>
+#include <interfaces/guiinterface.h>
+#include <interfaces/coreinterface.h>
+#include "partfileimportplugin.h"
+#include "importdialog.h"
+
+#define NAME "Import"
+#define AUTHOR "Joris Guisson"
+#define EMAIL "joris.guisson@gmail.com"
+
+
+
+K_EXPORT_COMPONENT_FACTORY(ktpartfileimportplugin,KGenericFactory<kt::PartFileImportPlugin>("ktpartfileimportplugin"))
+
+namespace kt
+{
+
+ PartFileImportPlugin::PartFileImportPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("Import"),AUTHOR,EMAIL,i18n("Imports partially or fully downloaded torrents from other clients"),"ktplugins")
+ {
+ setXMLFile("ktpartfileimportpluginui.rc");
+ import_action = 0;
+ }
+
+
+ PartFileImportPlugin::~PartFileImportPlugin()
+ {}
+
+
+ void PartFileImportPlugin::load()
+ {
+ import_action = new KAction(i18n("Import existing download" ), 0, this,
+ SLOT(onImport()), actionCollection(), "partfileimport" );
+ }
+
+ void PartFileImportPlugin::unload()
+ {
+ delete import_action;
+ import_action = 0;
+ }
+
+ void PartFileImportPlugin::onImport()
+ {
+ ImportDialog dlg(getCore(),0,0,true);
+ dlg.exec();
+ }
+
+ bool PartFileImportPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+
+}
+#include "partfileimportplugin.moc"
diff --git a/plugins/partfileimport/partfileimportplugin.h b/plugins/partfileimport/partfileimportplugin.h
new file mode 100644
index 0000000..31f2d3a
--- /dev/null
+++ b/plugins/partfileimport/partfileimportplugin.h
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTPARTFILEIMPORTPLUGIN_H
+#define KTPARTFILEIMPORTPLUGIN_H
+
+#include <interfaces/plugin.h>
+
+class KAction;
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class PartFileImportPlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ PartFileImportPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~PartFileImportPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+ public slots:
+ void onImport();
+
+ private:
+ KAction* import_action;
+ };
+
+}
+
+#endif
diff --git a/plugins/rssfeed/Makefile.am b/plugins/rssfeed/Makefile.am
new file mode 100644
index 0000000..c295db5
--- /dev/null
+++ b/plugins/rssfeed/Makefile.am
@@ -0,0 +1,30 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktrssfeedplugin.la
+
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktrssfeedplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktrssfeedplugin
+# plugins_DATA = ktrssfeedpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+
+rcdir = $(kde_datadir)/ktorrent
+
+kde_kcfg_DATA = ktrssfeedplugin.kcfg
+kde_services_DATA = ktrssfeedplugin.desktop
+
+noinst_HEADERS = rssfeedplugin.h rssfeedmanager.h rssfeed.h rssfilter.h \
+ rssarticle.h rsslinkdownloader.h
+ktrssfeedplugin_la_SOURCES = rssfeedplugin.cpp rssfeedmanager.cpp \
+ rssfeedwidget.ui rssfeed.cpp rssfilter.cpp rssarticle.cpp rsslinkdownloader.cpp
+ktrssfeedplugin_la_LIBADD = $(LIB_KIO) $(LIB_QT) rss/librsslocal.la \
+ ../../libktorrent/libktorrent.la $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KHTML) $(LIB_KPARTS)
+
+SUBDIRS = rss
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/rssfeed/ktrssfeedplugin.desktop b/plugins/rssfeed/ktrssfeedplugin.desktop
new file mode 100644
index 0000000..a26c08b
--- /dev/null
+++ b/plugins/rssfeed/ktrssfeedplugin.desktop
@@ -0,0 +1,22 @@
+[Desktop Entry]
+Name=RssFeedPlugin
+Name[bg]=Приставка за RssFeed
+Name[de]=RSS-Nachrichtenquellen-Modul
+Name[el]=Πρόσθετο ροών Rss
+Name[et]=RSS-kanali plugin
+Name[it]=Plugin Fonti notizie
+Name[nb]=RSS-modul
+Name[nds]=RSS-Moduul
+Name[pl]=Wtyczka kanały RSS
+Name[pt_BR]=Plugin de RssFeed
+Name[sk]=RssFeed Plugin
+Name[sr]=Прикључак Rss довода
+Name[sr@Latn]=Priključak Rss dovoda
+Name[sv]=RSS-kanalinsticksprogram
+Name[tr]=RSS Besleme Eklentisi
+Name[uk]=Втулок подач RSS
+Name[xx]=xxRssFeedPluginxx
+Name[zh_CN]=RSS 种子插件
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktrssfeedplugin
diff --git a/plugins/rssfeed/ktrssfeedplugin.kcfg b/plugins/rssfeed/ktrssfeedplugin.kcfg
new file mode 100644
index 0000000..86499cb
--- /dev/null
+++ b/plugins/rssfeed/ktrssfeedplugin.kcfg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktrssfeedpluginrc"/>
+ <group name="general">
+ <entry name="default" type="Int">
+ <label>default</label>
+ <default>0</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/rssfeed/rss/COPYING b/plugins/rssfeed/rss/COPYING
new file mode 100644
index 0000000..cca2a5c
--- /dev/null
+++ b/plugins/rssfeed/rss/COPYING
@@ -0,0 +1,20 @@
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/plugins/rssfeed/rss/Makefile.am b/plugins/rssfeed/rss/Makefile.am
new file mode 100644
index 0000000..75b570a
--- /dev/null
+++ b/plugins/rssfeed/rss/Makefile.am
@@ -0,0 +1,20 @@
+INCLUDES = \
+ -I$(top_srcdir)/src \
+ $(all_includes)
+
+noinst_LTLIBRARIES = \
+ librsslocal.la
+
+noinst_HEADERS = article.h document.h global.h image.h textinput.h \
+ loader.h librss.h
+
+librsslocal_la_SOURCES = article.cpp document.cpp image.cpp textinput.cpp \
+ tools_p.cpp loader.cpp
+
+librsslocal_la_METASOURCES = AUTO
+
+check_PROGRAMS = testlibrss
+testlibrss_SOURCES = testlibrss.cpp
+testlibrss_LDFLAGS = $(all_libraries)
+testlibrss_LDADD = librsslocal.la $(LIB_KIO)
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/rssfeed/rss/README b/plugins/rssfeed/rss/README
new file mode 100644
index 0000000..77d9450
--- /dev/null
+++ b/plugins/rssfeed/rss/README
@@ -0,0 +1,6 @@
+This is NOT original librss by Frerich Raabe, though based on it.
+
+This version is supposed to be called libsyndication but is not renamed to relieve packaging burden a bit
+(honestly, we just didn't yet get to it).
+
+Please DO NOT report any bugs about it to Frerich, since he most probably did not introduce the found bugs.
diff --git a/plugins/rssfeed/rss/article.cpp b/plugins/rssfeed/rss/article.cpp
new file mode 100644
index 0000000..571490e
--- /dev/null
+++ b/plugins/rssfeed/rss/article.cpp
@@ -0,0 +1,270 @@
+/*
+ * article.cpp
+ *
+ * Copyright (c) 2001, 2002, 2003, 2004 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#include "article.h"
+#include "tools_p.h"
+
+#include <kdebug.h>
+#include <krfcdate.h>
+#include <kurl.h>
+#include <kurllabel.h>
+#include <kmdcodec.h>
+
+#include <qdatetime.h>
+#include <qdom.h>
+
+using namespace RSS;
+namespace RSS
+{
+ KMD5 md5Machine;
+}
+
+struct Article::Private : public Shared
+{
+ QString title;
+ KURL link;
+ QString description;
+ QDateTime pubDate;
+ QString guid;
+ bool guidIsPermaLink;
+ MetaInfoMap meta;
+ KURL commentsLink;
+ int numComments;
+};
+
+Article::Article() : d(new Private)
+{
+}
+
+Article::Article(const Article &other) : d(0)
+{
+ *this = other;
+}
+
+Article::Article(const QDomNode &node, Format format) : d(new Private)
+{
+ QString elemText;
+
+ d->numComments=0;
+
+ if (!(elemText = extractNode(node, QString::fromLatin1("title"))).isNull())
+ d->title = elemText;
+
+
+ QDomNode n;
+ bool foundTorrentEnclosure = false;
+ for (n = node.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ const QDomElement e = n.toElement();
+ if ( (e.tagName()==QString::fromLatin1("enclosure") ) )
+ {
+ QString enclosureAttr = e.attribute(QString::fromLatin1("type"));
+ if (!enclosureAttr.isNull() )
+ {
+ if (enclosureAttr == "application/x-bittorrent")
+ {
+ enclosureAttr = e.attribute(QString::fromLatin1("url"));
+ if (!enclosureAttr.isNull() )
+ {
+ d->link=enclosureAttr;
+ foundTorrentEnclosure = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (!foundTorrentEnclosure)
+ {
+ if (format==AtomFeed)
+ {
+ QDomNode n;
+ for (n = node.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ const QDomElement e = n.toElement();
+ if ( (e.tagName()==QString::fromLatin1("link")) &&
+ (e.attribute(QString::fromLatin1("rel"))==QString::fromLatin1("alternate")))
+ {
+ d->link=n.toElement().attribute(QString::fromLatin1("href"));
+ break;
+ }
+ }
+ }
+ else
+ {
+ if (!(elemText = extractNode(node, QString::fromLatin1("link"))).isNull())
+ d->link = elemText;
+ }
+ }
+
+
+ // prefer content/content:encoded over summary/description for feeds that provide it
+ QString tagName=(format==AtomFeed)? QString::fromLatin1("content"): QString::fromLatin1("content:encoded");
+
+ if (!(elemText = extractNode(node, tagName, false)).isNull())
+ d->description = elemText;
+
+ if (d->description.isEmpty())
+ {
+ if (!(elemText = extractNode(node, QString::fromLatin1("body"), false)).isNull())
+ d->description = elemText;
+
+ if (d->description.isEmpty()) // 3rd try: see http://www.intertwingly.net/blog/1299.html
+ {
+ if (!(elemText = extractNode(node, QString::fromLatin1((format==AtomFeed)? "summary" : "description"), false)).isNull())
+ d->description = elemText;
+ }
+ }
+
+ if (!(elemText = extractNode(node, QString::fromLatin1((format==AtomFeed)? "created": "pubDate"))).isNull())
+ {
+ time_t _time;
+ if (format==AtomFeed)
+ _time = parseISO8601Date(elemText);
+ else
+ _time = KRFCDate::parseDate(elemText);
+
+ // 0 means invalid, not epoch (it returns epoch+1 when it parsed epoch, see the KRFCDate::parseDate() docs)
+ if (_time != 0)
+ d->pubDate.setTime_t(_time);
+ }
+ if (!(elemText = extractNode(node, QString::fromLatin1("dc:date"))).isNull())
+ {
+ time_t _time = parseISO8601Date(elemText);
+
+ // 0 means invalid, not epoch (it returns epoch+1 when it parsed epoch, see the KRFCDate::parseDate() docs)
+ if (_time != 0)
+ d->pubDate.setTime_t(_time);
+ }
+
+ //no luck so far - so let's set it to the current time
+ if (!d->pubDate.isValid())
+ {
+ d->pubDate = QDateTime::currentDateTime();
+ }
+
+
+ if (!(elemText = extractNode(node, QString::fromLatin1("wfw:comment"))).isNull()) {
+ d->commentsLink = elemText;
+ }
+
+ if (!(elemText = extractNode(node, QString::fromLatin1("slash:comments"))).isNull()) {
+ d->numComments = elemText.toInt();
+ }
+
+ tagName=(format==AtomFeed)? QString::fromLatin1("id"): QString::fromLatin1("guid");
+ n = node.namedItem(tagName);
+ if (!n.isNull()) {
+ d->guidIsPermaLink = (format==AtomFeed)? false : true;
+ if (n.toElement().attribute(QString::fromLatin1("isPermaLink"), "true") == "false") d->guidIsPermaLink = false;
+
+ if (!(elemText = extractNode(node, tagName)).isNull())
+ d->guid = elemText;
+ }
+
+ if(d->guid.isEmpty()) {
+ d->guidIsPermaLink = false;
+
+ md5Machine.reset();
+ QDomNode n(node);
+ md5Machine.update(d->title.utf8());
+ md5Machine.update(d->description.utf8());
+ d->guid = QString(md5Machine.hexDigest().data());
+ d->meta[QString::fromLatin1("guidIsHash")] = QString::fromLatin1("true");
+ }
+
+ for (QDomNode i = node.firstChild(); !i.isNull(); i = i.nextSibling())
+ {
+ if (i.isElement() && i.toElement().tagName() == QString::fromLatin1("metaInfo:meta"))
+ {
+ QString type = i.toElement().attribute(QString::fromLatin1("type"));
+ d->meta[type] = i.toElement().text();
+ }
+ }
+}
+
+Article::~Article()
+{
+ if (d->deref())
+ delete d;
+}
+
+QString Article::title() const
+{
+ return d->title;
+}
+
+const KURL &Article::link() const
+{
+ return d->link;
+}
+
+QString Article::description() const
+{
+ return d->description;
+}
+
+QString Article::guid() const
+{
+ return d->guid;
+}
+
+bool Article::guidIsPermaLink() const
+{
+ return d->guidIsPermaLink;
+}
+
+const QDateTime &Article::pubDate() const
+{
+ return d->pubDate;
+}
+
+const KURL &Article::commentsLink() const
+{
+ return d->commentsLink;
+}
+
+int Article::comments() const
+{
+ return d->numComments;
+}
+
+
+QString Article::meta(const QString &key) const
+{
+ return d->meta[key];
+}
+
+KURLLabel *Article::widget(QWidget *parent, const char *name) const
+{
+ KURLLabel *label = new KURLLabel(d->link.url(), d->title, parent, name);
+ label->setUseTips(true);
+ if (!d->description.isNull())
+ label->setTipText(d->description);
+
+ return label;
+}
+
+Article &Article::operator=(const Article &other)
+{
+ if (this != &other) {
+ other.d->ref();
+ if (d && d->deref())
+ delete d;
+ d = other.d;
+ }
+ return *this;
+}
+
+bool Article::operator==(const Article &other) const
+{
+ return d->guid == other.guid();
+}
+
+// vim:noet:ts=4
diff --git a/plugins/rssfeed/rss/article.h b/plugins/rssfeed/rss/article.h
new file mode 100644
index 0000000..bab7a38
--- /dev/null
+++ b/plugins/rssfeed/rss/article.h
@@ -0,0 +1,159 @@
+/*
+ * article.h
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_ARTICLE_H
+#define LIBRSS_ARTICLE_H
+
+#include <qmap.h>
+
+#include "global.h"
+
+class QDateTime;
+class QDomNode;
+template <class> class QValueList;
+class QString;
+class QWidget;
+class KURL;
+class KURLLabel;
+
+namespace RSS
+{
+ /**
+ * Represents an article as stored in a RSS file. You don't have to
+ * instantiate one of these yourself, the common way to access instances
+ * is via Document::articles().
+ * @see Document::articles()
+ */
+ class Article
+ {
+ public:
+ /**
+ * A list of articles.
+ */
+ typedef QValueList<Article> List;
+
+ /**
+ * Default constructor.
+ */
+ Article();
+
+ /**
+ * Copy constructor.
+ * @param other The Article object to copy.
+ */
+ Article(const Article &other);
+
+ /**
+ * Constructs an Article from a piece of RSS markup.
+ * @param node A QDomNode which references the DOM leaf to be used
+ * for constructing the Article.
+ */
+ Article(const QDomNode &node, Format format);
+
+ /**
+ * Assignment operator.
+ * @param other The Article object to clone.
+ * @return A reference to the cloned Article object.
+ */
+ Article &operator=(const Article &other);
+
+ /**
+ * Compares two articles. Two articles are treated to be identical
+ * if all their properties (title, link, description etc.) are
+ * equal.
+ * @param other The article this article should be compared with.
+ * @return Whether the two articles are equal.
+ */
+ bool operator==(const Article &other) const;
+
+ /**
+ * Convenience method. Simply calls !operator==().
+ * @param other The article this article should be compared with.
+ * @return Whether the two articles are unequal.
+ */
+ bool operator!=(const Article &other) const { return !operator==(other); }
+
+ /**
+ * Destructor.
+ */
+ virtual ~Article();
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The headline of this article, or QString::null if
+ * no headline was available.
+ */
+ QString title() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return A URL referencing the complete text for this article,
+ * or an empty KURL if no link was available.
+ * Note that the RSS 0.91 Specification dictates that URLs not
+ * starting with "http://" or "ftp://" are considered invalid.
+ */
+ const KURL &link() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return A story synopsis, or QString::null if no description
+ * was available.
+ */
+ QString description() const;
+
+ /**
+ * RSS 2.0 and upwards
+ * @return An article GUID (globally unique identifier).
+ */
+ QString guid() const;
+
+ /**
+ * RSS 2.0 and upwards
+ * @return If this article GUID is permalink. Has no meaning when guid() is QString::null.
+ */
+ bool guidIsPermaLink() const;
+
+ /**
+ * RSS 2.0 and upwards
+ * @return The date when the article was published.
+ */
+ const QDateTime &pubDate() const;
+
+ const KURL &commentsLink() const;
+ int comments() const;
+
+ QString meta(const QString &key) const;
+
+ /**
+ * @param parent The parent widget for the KURLLabel.
+ * @param name A name for the widget which will be used internally.
+ * @return a widget (a KURLLabel in this case) for the Article.
+ * This makes building a user-interface which contains the
+ * information in this Article object more convenient.
+ * The returned KURLLabel's caption will be the title(), clicking
+ * on it will emit the URL link(), and it has a QToolTip attached
+ * to it which displays the description() (in case it has one,
+ * if there is no description, the URL which the label links to
+ * will be used).
+ * Note that you have to delete the KURLLabel object returned by
+ * this method yourself.
+ */
+ KURLLabel *widget(QWidget *parent = 0, const char *name = 0) const;
+
+ typedef QMap<QString, QString> MetaInfoMap;
+
+ private:
+ struct Private;
+ Private *d;
+ };
+}
+
+#endif // LIBRSS_ARTICLE_H
+// vim: noet:ts=4
diff --git a/plugins/rssfeed/rss/document.cpp b/plugins/rssfeed/rss/document.cpp
new file mode 100644
index 0000000..be353e4
--- /dev/null
+++ b/plugins/rssfeed/rss/document.cpp
@@ -0,0 +1,619 @@
+/*
+ * document.cpp
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ *
+ */
+#include "document.h"
+#include "article.h"
+#include "image.h"
+#include "textinput.h"
+#include "tools_p.h"
+
+#include <krfcdate.h>
+#include <kurl.h>
+
+#include <qdatetime.h>
+#include <qdom.h>
+#include <qptrlist.h>
+
+using namespace RSS;
+
+struct Document::Private : public Shared
+{
+ Private() : version(v0_90), image(NULL), textInput(NULL), language(en)
+ {
+ format=UnknownFormat;
+ valid=false;
+ ttl=-1;
+ }
+
+ ~Private()
+ {
+ delete textInput;
+ delete image;
+ }
+
+ Version version;
+ QString title;
+ QString description;
+ KURL link;
+ Image *image;
+ TextInput *textInput;
+ Article::List articles;
+ Language language;
+ Format format;
+ QString copyright;
+ QDateTime pubDate;
+ QDateTime lastBuildDate;
+ QString rating;
+ KURL docs;
+ int ttl;
+ QString managingEditor;
+ QString webMaster;
+ HourList skipHours;
+ DayList skipDays;
+ bool valid;
+};
+
+Document::Document() : d(new Private)
+{
+}
+
+Document::Document(const Document &other) : d(0)
+{
+ *this = other;
+}
+
+Document::Document(const QDomDocument &doc) : d(new Private)
+{
+ QString elemText;
+ QDomNode rootNode = doc.documentElement();
+
+ // Determine the version of the present RSS markup.
+ QString attr;
+
+ // we should probably check that it ISN'T feed or rss, rather than check if it is xhtml
+ if (rootNode.toElement().tagName()==QString::fromLatin1("html"))
+ d->valid=false;
+ else
+ d->valid=true;
+
+ attr = rootNode.toElement().attribute(QString::fromLatin1("version"), QString::null);
+ if (!attr.isNull()) {
+ if (rootNode.toElement().tagName()=="feed")
+ {
+ d->format=AtomFeed;
+ if (attr == QString::fromLatin1("0.3"))
+ d->version = vAtom_0_3;
+ else if (attr == QString::fromLatin1("0.2")) /* smt -> review */
+ d->version = vAtom_0_2;
+ else if (attr == QString::fromLatin1("0.1")) /* smt -> review */
+ d->version = vAtom_0_1;
+ }
+ else
+ {
+ d->format=RSSFeed;
+ if (attr == QString::fromLatin1("0.91"))
+ d->version = v0_91;
+ else if (attr == QString::fromLatin1("0.92"))
+ d->version = v0_92;
+ else if (attr == QString::fromLatin1("0.93"))
+ d->version = v0_93;
+ else if (attr == QString::fromLatin1("0.94"))
+ d->version = v0_94;
+ else if (attr.startsWith("2.0") || attr == QString::fromLatin1("2")) // http://www.breuls.org/rss puts 2.00 in version (BR #0000016)
+ d->version = v2_0;
+ }
+ }
+
+ if (d->format==UnknownFormat)
+ {
+ attr = rootNode.toElement().attribute(QString::fromLatin1("xmlns"), QString::null);
+ if (!attr.isNull()) {
+ /*
+ * Hardcoding these URLs is actually a bad idea, since the DTD doesn't
+ * dictate a specific namespace. Still, most RSS files seem to use
+ * these two, so I'll go for them now. If it turns out that many
+ * mirrors of this RSS namespace are in use, I'll probably have to
+ * distinguish the RSS versions by analyzing the relationship between
+ * the nodes.
+ */
+ if (attr == QString::fromLatin1("http://my.netscape.com/rdf/simple/0.9/")) {
+ d->format=RSSFeed;
+ d->version = v0_90;
+ }
+ else if (attr == QString::fromLatin1("http://purl.org/rss/1.0/")) {
+ d->format=RSSFeed;
+ d->version = v1_0;
+ }
+ }
+ }
+
+ QDomNode channelNode;
+
+ if (d->format == AtomFeed)
+ channelNode=rootNode;
+ else
+ channelNode=rootNode.namedItem(QString::fromLatin1("channel"));
+
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("title"))).isNull())
+ d->title = elemText;
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("description"))).isNull())
+ d->description = elemText;
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("link"))).isNull())
+ d->link = elemText;
+
+
+ /* This is ugly but necessary since RSS 0.90 and 1.0 have a different parent
+ * node for <image>, <textinput> and <item> than RSS 0.91-0.94 and RSS 2.0.
+ */
+ QDomNode parentNode;
+ if (d->version == v0_90 || d->version == v1_0 || d->format == AtomFeed)
+ parentNode = rootNode;
+ else
+ {
+ // following is a HACK for broken 0.91 feeds like xanga.com's
+ if (!rootNode.namedItem(QString::fromLatin1("item")).isNull())
+ parentNode = rootNode;
+ else
+ parentNode = channelNode;
+ }
+
+ // image and textinput aren't supported by Atom.. handle in case feed provides
+ QDomNode n = parentNode.namedItem(QString::fromLatin1("image"));
+ if (!n.isNull())
+ d->image = new Image(n);
+
+ n = parentNode.namedItem(QString::fromLatin1("textinput"));
+ if (!n.isNull())
+ d->textInput = new TextInput(n);
+
+ // Our (hopefully faster) version of elementsByTagName()
+ QString tagName;
+ if (d->format == AtomFeed)
+ tagName=QString::fromLatin1("entry");
+ else
+ tagName=QString::fromLatin1("item");
+
+ for (n = parentNode.firstChild(); !n.isNull(); n = n.nextSibling()) {
+ const QDomElement e = n.toElement();
+ if (e.tagName() == tagName)
+ d->articles.append(Article(e, d->format));
+ }
+
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("copyright"))).isNull())
+ d->copyright = elemText;
+
+ if (d->format == AtomFeed)
+ elemText = rootNode.toElement().attribute(QString::fromLatin1("xml:lang"), QString::null);
+ else
+ elemText = extractNode(channelNode, QString::fromLatin1("language"));
+
+ if (!elemText.isNull()){
+ if (elemText == QString::fromLatin1("af"))
+ d->language = af;
+ else if (elemText == QString::fromLatin1("sq"))
+ d->language = sq;
+ else if (elemText == QString::fromLatin1("eu"))
+ d->language = eu;
+ else if (elemText == QString::fromLatin1("be"))
+ d->language = be;
+ else if (elemText == QString::fromLatin1("bg"))
+ d->language = bg;
+ else if (elemText == QString::fromLatin1("ca"))
+ d->language = ca;
+ else if (elemText == QString::fromLatin1("zh-cn"))
+ d->language = zh_cn;
+ else if (elemText == QString::fromLatin1("zh-tw"))
+ d->language = zh_tw;
+ else if (elemText == QString::fromLatin1("hr"))
+ d->language = hr;
+ else if (elemText == QString::fromLatin1("cs"))
+ d->language = cs;
+ else if (elemText == QString::fromLatin1("da"))
+ d->language = da;
+ else if (elemText == QString::fromLatin1("nl"))
+ d->language = nl;
+ else if (elemText == QString::fromLatin1("nl-be"))
+ d->language = nl_be;
+ else if (elemText == QString::fromLatin1("nl-nl"))
+ d->language = nl_nl;
+ else if (elemText == QString::fromLatin1("en"))
+ d->language = en;
+ else if (elemText == QString::fromLatin1("en-au"))
+ d->language = en_au;
+ else if (elemText == QString::fromLatin1("en-bz"))
+ d->language = en_bz;
+ else if (elemText == QString::fromLatin1("en-ca"))
+ d->language = en_ca;
+ else if (elemText == QString::fromLatin1("en-ie"))
+ d->language = en_ie;
+ else if (elemText == QString::fromLatin1("en-jm"))
+ d->language = en_jm;
+ else if (elemText == QString::fromLatin1("en-nz"))
+ d->language = en_nz;
+ else if (elemText == QString::fromLatin1("en-ph"))
+ d->language = en_ph;
+ else if (elemText == QString::fromLatin1("en-za"))
+ d->language = en_za;
+ else if (elemText == QString::fromLatin1("en-tt"))
+ d->language = en_tt;
+ else if (elemText == QString::fromLatin1("en-gb"))
+ d->language = en_gb;
+ else if (elemText == QString::fromLatin1("en-us"))
+ d->language = en_us;
+ else if (elemText == QString::fromLatin1("en-zw"))
+ d->language = en_zw;
+ else if (elemText == QString::fromLatin1("fo"))
+ d->language = fo;
+ else if (elemText == QString::fromLatin1("fi"))
+ d->language = fi;
+ else if (elemText == QString::fromLatin1("fr"))
+ d->language = fr;
+ else if (elemText == QString::fromLatin1("fr-be"))
+ d->language = fr_be;
+ else if (elemText == QString::fromLatin1("fr-ca"))
+ d->language = fr_ca;
+ else if (elemText == QString::fromLatin1("fr-fr"))
+ d->language = fr_fr;
+ else if (elemText == QString::fromLatin1("fr-lu"))
+ d->language = fr_lu;
+ else if (elemText == QString::fromLatin1("fr-mc"))
+ d->language = fr_mc;
+ else if (elemText == QString::fromLatin1("fr-ch"))
+ d->language = fr_ch;
+ else if (elemText == QString::fromLatin1("gl"))
+ d->language = gl;
+ else if (elemText == QString::fromLatin1("gd"))
+ d->language = gd;
+ else if (elemText == QString::fromLatin1("de"))
+ d->language = de;
+ else if (elemText == QString::fromLatin1("de-at"))
+ d->language = de_at;
+ else if (elemText == QString::fromLatin1("de-de"))
+ d->language = de_de;
+ else if (elemText == QString::fromLatin1("de-li"))
+ d->language = de_li;
+ else if (elemText == QString::fromLatin1("de-lu"))
+ d->language = de_lu;
+ else if (elemText == QString::fromLatin1("de-ch"))
+ d->language = de_ch;
+ else if (elemText == QString::fromLatin1("el"))
+ d->language = el;
+ else if (elemText == QString::fromLatin1("hu"))
+ d->language = hu;
+ else if (elemText == QString::fromLatin1("is"))
+ d->language = is;
+ else if (elemText == QString::fromLatin1("id"))
+ d->language = id;
+ else if (elemText == QString::fromLatin1("ga"))
+ d->language = ga;
+ else if (elemText == QString::fromLatin1("it"))
+ d->language = it;
+ else if (elemText == QString::fromLatin1("it-it"))
+ d->language = it_it;
+ else if (elemText == QString::fromLatin1("it-ch"))
+ d->language = it_ch;
+ else if (elemText == QString::fromLatin1("ja"))
+ d->language = ja;
+ else if (elemText == QString::fromLatin1("ko"))
+ d->language = ko;
+ else if (elemText == QString::fromLatin1("mk"))
+ d->language = mk;
+ else if (elemText == QString::fromLatin1("no"))
+ d->language = no;
+ else if (elemText == QString::fromLatin1("pl"))
+ d->language = pl;
+ else if (elemText == QString::fromLatin1("pt"))
+ d->language = pt;
+ else if (elemText == QString::fromLatin1("pt-br"))
+ d->language = pt_br;
+ else if (elemText == QString::fromLatin1("pt-pt"))
+ d->language = pt_pt;
+ else if (elemText == QString::fromLatin1("ro"))
+ d->language = ro;
+ else if (elemText == QString::fromLatin1("ro-mo"))
+ d->language = ro_mo;
+ else if (elemText == QString::fromLatin1("ro-ro"))
+ d->language = ro_ro;
+ else if (elemText == QString::fromLatin1("ru"))
+ d->language = ru;
+ else if (elemText == QString::fromLatin1("ru-mo"))
+ d->language = ru_mo;
+ else if (elemText == QString::fromLatin1("ru-ru"))
+ d->language = ru_ru;
+ else if (elemText == QString::fromLatin1("sr"))
+ d->language = sr;
+ else if (elemText == QString::fromLatin1("sk"))
+ d->language = sk;
+ else if (elemText == QString::fromLatin1("sl"))
+ d->language = sl;
+ else if (elemText == QString::fromLatin1("es"))
+ d->language = es;
+ else if (elemText == QString::fromLatin1("es-ar"))
+ d->language = es_ar;
+ else if (elemText == QString::fromLatin1("es-bo"))
+ d->language = es_bo;
+ else if (elemText == QString::fromLatin1("es-cl"))
+ d->language = es_cl;
+ else if (elemText == QString::fromLatin1("es-co"))
+ d->language = es_co;
+ else if (elemText == QString::fromLatin1("es-cr"))
+ d->language = es_cr;
+ else if (elemText == QString::fromLatin1("es-do"))
+ d->language = es_do;
+ else if (elemText == QString::fromLatin1("es-ec"))
+ d->language = es_ec;
+ else if (elemText == QString::fromLatin1("es-sv"))
+ d->language = es_sv;
+ else if (elemText == QString::fromLatin1("es-gt"))
+ d->language = es_gt;
+ else if (elemText == QString::fromLatin1("es-hn"))
+ d->language = es_hn;
+ else if (elemText == QString::fromLatin1("es-mx"))
+ d->language = es_mx;
+ else if (elemText == QString::fromLatin1("es-ni"))
+ d->language = es_ni;
+ else if (elemText == QString::fromLatin1("es-pa"))
+ d->language = es_pa;
+ else if (elemText == QString::fromLatin1("es-py"))
+ d->language = es_py;
+ else if (elemText == QString::fromLatin1("es-pe"))
+ d->language = es_pe;
+ else if (elemText == QString::fromLatin1("es-pr"))
+ d->language = es_pr;
+ else if (elemText == QString::fromLatin1("es-es"))
+ d->language = es_es;
+ else if (elemText == QString::fromLatin1("es-uy"))
+ d->language = es_uy;
+ else if (elemText == QString::fromLatin1("es-ve"))
+ d->language = es_ve;
+ else if (elemText == QString::fromLatin1("sv"))
+ d->language = sv;
+ else if (elemText == QString::fromLatin1("sv-fi"))
+ d->language = sv_fi;
+ else if (elemText == QString::fromLatin1("sv-se"))
+ d->language = sv_se;
+ else if (elemText == QString::fromLatin1("tr"))
+ d->language = tr;
+ else if (elemText == QString::fromLatin1("uk"))
+ d->language = uk;
+ else
+ d->language = UndefinedLanguage;
+ }
+
+ if (d->format == AtomFeed)
+ tagName=QString::fromLatin1("issued"); // atom doesn't specify this for feeds
+ // but some broken feeds do this
+ else
+ tagName=QString::fromLatin1("pubDate");
+
+ if (!(elemText = extractNode(channelNode, tagName)).isNull()) {
+ time_t _time;
+
+ if (d->format == AtomFeed)
+ _time=parseISO8601Date(elemText);
+ else
+ _time=KRFCDate::parseDate(elemText);
+ /* \bug This isn't really the right way since it will set the date to
+ * Jan 1 1970, 1:00:00 if the passed date was invalid; this means that
+ * we cannot distinguish between that date, and invalid values. :-/
+ */
+ d->pubDate.setTime_t(_time);
+ }
+
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("dc:date"))).isNull()) {
+ time_t _time = parseISO8601Date(elemText);
+ /* \bug This isn't really the right way since it will set the date to
+ * Jan 1 1970, 1:00:00 if the passed date was invalid; this means that
+ * we cannot distinguish between that date, and invalid values. :-/
+ */
+ d->pubDate.setTime_t(_time);
+ }
+
+ if (d->format == AtomFeed)
+ tagName=QString::fromLatin1("modified");
+ else
+ tagName=QString::fromLatin1("lastBuildDate");
+ if (!(elemText = extractNode(channelNode, tagName)).isNull()) {
+ time_t _time;
+ if (d->format == AtomFeed)
+ _time = parseISO8601Date(elemText);
+ else
+ _time = KRFCDate::parseDate(elemText);
+ d->lastBuildDate.setTime_t(_time);
+ }
+
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("rating"))).isNull())
+ d->rating = elemText;
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("docs"))).isNull())
+ d->docs = elemText;
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1((d->format == AtomFeed) ? "author" : "managingEditor"))).isNull())
+ d->managingEditor = elemText;
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("webMaster"))).isNull())
+ d->webMaster = elemText;
+
+ if (!(elemText = extractNode(channelNode, QString::fromLatin1("ttl"))).isNull())
+ d->ttl = elemText.toUInt();
+
+ n = channelNode.namedItem(QString::fromLatin1("skipHours"));
+ if (!n.isNull())
+ for (QDomElement e = n.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement())
+ if (e.tagName() == QString::fromLatin1("hour"))
+ d->skipHours.append(e.text().toUInt());
+
+ n = channelNode.namedItem(QString::fromLatin1("skipDays"));
+ if (!n.isNull()) {
+ Day day;
+ QString elemText;
+ for (QDomElement e = n.firstChild().toElement(); !e.isNull(); e = e.nextSibling().toElement())
+ if (e.tagName() == QString::fromLatin1("day")) {
+ elemText = e.text().lower();
+ if (elemText == QString::fromLatin1("monday"))
+ day = Monday;
+ else if (elemText == QString::fromLatin1("tuesday"))
+ day = Tuesday;
+ else if (elemText == QString::fromLatin1("wednesday"))
+ day = Wednesday;
+ else if (elemText == QString::fromLatin1("thursday"))
+ day = Thursday;
+ else if (elemText == QString::fromLatin1("friday"))
+ day = Friday;
+ else if (elemText == QString::fromLatin1("saturday"))
+ day = Saturday;
+ else if (elemText == QString::fromLatin1("sunday"))
+ day = Sunday;
+ else
+ day = UndefinedDay;
+ if (day != UndefinedDay)
+ d->skipDays.append(day);
+ }
+ }
+}
+
+Document::~Document()
+{
+ if (d->deref())
+ delete d;
+}
+
+bool Document::isValid() const
+{
+ return d->valid;
+}
+
+Version Document::version() const
+{
+ return d->version;
+}
+
+QString Document::verbVersion() const
+{
+ switch (d->version) {
+ case v0_90: return QString::fromLatin1("0.90");
+ case v0_91: return QString::fromLatin1("0.91");
+ case v0_92: return QString::fromLatin1("0.92");
+ case v0_93: return QString::fromLatin1("0.93");
+ case v0_94: return QString::fromLatin1("0.94");
+ case v1_0: return QString::fromLatin1("1.0");
+ case v2_0: return QString::fromLatin1("2.0");
+ case vAtom_0_3: return QString::fromLatin1("0.3");
+ case vAtom_0_2: return QString::fromLatin1("0.2");
+ case vAtom_0_1: return QString::fromLatin1("0.1");
+ }
+ return QString::null;
+}
+
+QString Document::title() const
+{
+ return d->title;
+}
+
+QString Document::description() const
+{
+ return d->description;
+}
+
+const KURL &Document::link() const
+{
+ return d->link;
+}
+
+Image *Document::image()
+{
+ return d->image;
+}
+
+const Image *Document::image() const
+{
+ return d->image;
+}
+
+TextInput *Document::textInput()
+{
+ return d->textInput;
+}
+
+const TextInput *Document::textInput() const
+{
+ return d->textInput;
+}
+
+const Article::List &Document::articles() const
+{
+ return d->articles;
+}
+
+Language Document::language() const
+{
+ return d->language;
+}
+
+QString Document::copyright() const
+{
+ return d->copyright;
+}
+
+const QDateTime &Document::pubDate() const
+{
+ return d->pubDate;
+}
+
+const QDateTime &Document::lastBuildDate() const
+{
+ return d->lastBuildDate;
+}
+
+QString Document::rating() const
+{
+ return d->rating;
+}
+
+const KURL &Document::docs() const
+{
+ return d->docs;
+}
+
+QString Document::managingEditor() const
+{
+ return d->managingEditor;
+}
+
+QString Document::webMaster() const
+{
+ return d->webMaster;
+}
+
+const HourList &Document::skipHours() const
+{
+ return d->skipHours;
+}
+
+const DayList &Document::skipDays() const
+{
+ return d->skipDays;
+}
+
+int Document::ttl() const
+{
+ return d->ttl;
+}
+
+Document &Document::operator=(const Document &other)
+{
+ if (this != &other) {
+ other.d->ref();
+ if (d && d->deref())
+ delete d;
+ d = other.d;
+ }
+ return *this;
+}
+
+// vim:noet:ts=4
diff --git a/plugins/rssfeed/rss/document.h b/plugins/rssfeed/rss/document.h
new file mode 100644
index 0000000..1ead634
--- /dev/null
+++ b/plugins/rssfeed/rss/document.h
@@ -0,0 +1,237 @@
+/*
+ * document.h
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_DOCUMENT_H
+#define LIBRSS_DOCUMENT_H
+
+#include "article.h"
+#include "global.h"
+
+class QDateTime;
+class QDomDocument;
+
+namespace RSS
+{
+ class Image;
+ class TextInput;
+
+ /**
+ * Represents a RSS document and provides all the features and properties
+ * as stored in it. You usually don't need to instantiate this one yourself
+ * but rather use Loader::loadFrom() to produce a Document object.
+ * @see Loader::loadForm()
+ */
+ class Document
+ {
+ public:
+ /**
+ * Default constructor.
+ */
+ Document();
+
+ /**
+ * Copy constructor.
+ * @param other The Document object to copy.
+ */
+ Document(const Document &other);
+
+ /**
+ * Constructs a Document from a piece of XML markup.
+ */
+ Document(const QDomDocument &doc);
+
+ /**
+ * Assignment operator.
+ * @param other The Document object to clone.
+ * @return A reference to the cloned Document object.
+ */
+ Document &operator=(const Document &other);
+
+ /**
+ * Destructor.
+ */
+ ~Document();
+
+ /**
+ * @return If document is valid
+ */
+ bool isValid() const;
+
+ /**
+ * @return The version of this document (one of the values of the
+ * enum RSS::Version). This value can be used to determine which
+ * features this RSS document provides.
+ * @see verbVersion()
+ */
+ Version version() const;
+
+ /**
+ * Convenience method. Differs from version() only in how the result
+ * is returned.
+ * @return A QString representing the verbose version of the
+ * document.
+ * @see version()
+ */
+ QString verbVersion() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The title of the RSS document, or QString::null if no
+ * title was available. This is often the name of the news source
+ * from which the RSS document was retrieved.
+ */
+ QString title() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The description of the RSS document, or QString::null
+ * if no description was available. This is usually a short slogan
+ * or description of the news source from which the RSS document
+ * was retrieved.
+ */
+ QString description() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return A link pointing to some website, or an empty KURL if no
+ * link was available. This URL mostly points to the homepage of
+ * the news site from which the RSS document was retrieved.
+ * Note that the RSS 0.91 Specification dictates that URLs not
+ * starting with "http://" or "ftp://" are considered invalid.
+ */
+ const KURL &link() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return An Image object as stored in the RSS document, or a
+ * null pointer if there was no image available.
+ * @see Image
+ */
+ Image *image();
+
+ /**
+ * A version of the method above, with stricter const-ness.
+ */
+ const Image *image() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return A TextInput object as stored in the RSS document, or a
+ * null pointer if there was no text input available.
+ * @see TextInput
+ */
+ TextInput *textInput();
+
+ /**
+ * A version of the method above, with stricter const-ness.
+ */
+ const TextInput *textInput() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return A list of Article objects as stored in the RSS document,
+ * or a null pointer if there were no articles available. Every RSS
+ * DTD requires that there is at least one article defined, so a
+ * null pointer indicates an invalid RSS file!
+ * @see Article
+ */
+ const Article::List &articles() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return The language used in the RSS document (for the article
+ * headlines etc.). This was originally introduced to assist with
+ * determining the correct page encoding but acts as a solely
+ * optional information in this library since you don't have to care
+ * about the encoding as Unicode is used in the whole library.
+ * @see RSS::Language
+ */
+ Language language() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return A copyright of the information contained in the RSS
+ * document, or QString::null if no copyright is available.
+ */
+ QString copyright() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return The date when the RSS document was published.
+ */
+ const QDateTime &pubDate() const;
+
+ /**
+ * RSS 0.91 and upwards.
+ * @return The last time the channel was modified.
+ */
+ const QDateTime &lastBuildDate() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return A <a href="http://www.w3.org/PICS/#Specs">PICS</a>
+ * rating for this page.
+ */
+ QString rating() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return This tag should contain either a URL that references a
+ * description of the channel, or a pointer to the documentation
+ * for the format used in the RSS file.
+ */
+ const KURL &docs() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return The email address of the managing editor of the site,
+ * the person to contact for editorial inquiries. The suggested
+ * format for email addresses in RSS documents is
+ * bull@mancuso.com (Bull Mancuso).
+ * @see webMaster()
+ */
+ QString managingEditor() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return The email address of the webmaster for the site, the
+ * person to contact if there are technical problems with the
+ * channel, or QString::null if this information isn't available.
+ * @see managingEditor()
+ */
+ QString webMaster() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return A list of hours indicating the hours in the day, GMT,
+ * when the channel is unlikely to be updated. If this item is
+ * omitted, the channel is assumed to be updated hourly. Each
+ * hour should be an integer value between 0 and 23.
+ * @see skipDays()
+ */
+ const HourList &skipHours() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return A list of <day>s of the week, in English, indicating
+ * the days of the week when the RSS document will not be updated.
+ * @see skipHours(), DayList, Day
+ */
+ const DayList &skipDays() const;
+ int ttl() const;
+
+ private:
+ struct Private;
+ Private *d;
+ };
+}
+
+#endif // LIBRSS_DOCUMENT_H
+// vim: noet:ts=4
diff --git a/plugins/rssfeed/rss/global.h b/plugins/rssfeed/rss/global.h
new file mode 100644
index 0000000..3a954e6
--- /dev/null
+++ b/plugins/rssfeed/rss/global.h
@@ -0,0 +1,145 @@
+/*
+ * global.h
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_GLOBAL_H
+#define LIBRSS_GLOBAL_H
+
+template <class>
+class QValueList;
+
+namespace RSS
+{
+ /**
+ * Versions currently supported by this library. This enumeration is
+ * subject to be extended in the future and used by Document::version() to
+ * provide an interface to the client using which he can find out what
+ * version the loaded RSS file actually is.
+ */
+ enum Version {
+ v0_90, /// RSS v0.90
+ v0_91, /// RSS v0.91
+ v0_92, /// RSS v0.92
+ v0_93, /// RSS v0.93
+ v0_94, /// RSS v0.94
+ v1_0, /// RSS v1.0
+ v2_0, /// RSS v2.0
+ vAtom_0_1, /// Atom v0.1
+ vAtom_0_2, /// Atom v0.2
+ vAtom_0_3 /// Atom v0.3
+ };
+
+ /**
+ * Possible status values returned by the signal
+ * Loader::loadingComplete().
+ */
+ enum Status {
+ Success, /**
+ * Nothing went wrong so far, but you still have to check
+ * what values are returned by the classes since it's not
+ * guaranteed that the retrieved RSS markup actually
+ * complies to one of the RSS DTDs.*/
+ Aborted, /** the loader was aborted manually
+ */
+ RetrieveError, /**
+ * Something went wrong while retrieving the RSS data,
+ * this could be a problem while resolving the host name
+ * (assuming the source file loader was used) or a
+ * problem with the program to be executed (in case the
+ * program loader was used.).*/
+ ParseError /**
+ * The overall format of the RSS markup wasn't XML
+ * conform. This only indicates that the data wasn't
+ * valid (for example, if the data returned by a
+ * DataRetriever isn't well-formed XML).
+ * @see DataRetriever */
+ };
+
+ /**
+ * Possible languages which are returned by Document::language().
+ */
+ enum Language {
+ UndefinedLanguage, /** Unknown / undefined language */
+
+ af, /** Afrikaans */ sq, /** Albanian */
+ eu, /** Basque */ be, /** Belarusian */
+ bg, /** Bulgarian */ ca, /** Catalan */
+ zh_cn, /** Chinese (Simplified) */ zh_tw, /** Chinese (Traditional */
+ hr, /** Croatian */ cs, /** Czech */
+ da, /** Danish */ nl, /** Dutch */
+ nl_be, /** Dutch (Belgium) */ nl_nl, /** Dutch (Netherlands) */
+ en, /** English */ en_au, /** English (Australia) */
+ en_bz, /** English (Belize) */ en_ca, /** English (Canada) */
+ en_ie, /** English (Ireland) */ en_jm, /** English (Jamaica) */
+ en_nz, /** English (New Zealand) */ en_ph, /** English (Phillipines) */
+ en_za, /** English (South Africa) */ en_tt, /** English (Trinidad) */
+ en_gb, /** English (Great Britain) */en_us, /** English (United States) */
+ en_zw, /** English (Zimbabwe) */ fo, /** Faeroese */
+ fi, /** Finnish */ fr, /** French */
+ fr_be, /** French (Belgium) */ fr_ca, /** French (Canada) */
+ fr_fr, /** French (France) */ fr_lu, /** French (Luxembourg) */
+ fr_mc, /** French (Monaco) */ fr_ch, /** French (Switzerland) */
+ gl, /** Galician */ gd, /** Gaelic */
+ de, /** German */ de_at, /** German (Austria) */
+ de_de, /** German (Germany) */ de_li, /** German (Liechtenstein) */
+ de_lu, /** German (Luxembourg) */ de_ch, /** German (Switzerland) */
+ el, /** Greek */ hu, /** Hungarian */
+ is, /** Icelandic */ id, /** Indonesian */
+ ga, /** Irish */ it, /** Italian */
+ it_it, /** Italian (Italy) */ it_ch, /** Italian (Switzerland) */
+ ja, /** Japanese */ ko, /** Korean */
+ mk, /** Macedonian */ no, /** Norwegian */
+ pl, /** Polish */ pt, /** Portuguese */
+ pt_br, /** Portuguese (Brazil) */ pt_pt, /** Portuguese (Portugal) */
+ ro, /** Romanian */ ro_mo, /** Romanian (Moldova) */
+ ro_ro, /** Romanian (Romania) */ ru, /** Russian */
+ ru_mo, /** Russian (Moldova) */ ru_ru, /** Russian (Russia) */
+ sr, /** Serbian */ sk, /** Slovak */
+ sl, /** Slovenian */ es, /** Spanish */
+ es_ar, /** Spanish (Argentina) */ es_bo, /** Spanish (Bolivia) */
+ es_cl, /** Spanish (Chile) */ es_co, /** Spanish (Colombia) */
+ es_cr, /** Spanish (Costa Rica) */ es_do, /** Spanish (Dominican Rep.) */
+ es_ec, /** Spanish (Ecuador) */ es_sv, /** Spanish (El Salvador) */
+ es_gt, /** Spanish (Guatemala) */ es_hn, /** Spanish (Honduras) */
+ es_mx, /** Spanish (Mexico) */ es_ni, /** Spanish (Nicaragua) */
+ es_pa, /** Spanish (Panama) */ es_py, /** Spanish (Paraguay) */
+ es_pe, /** Spanish (Peru) */ es_pr, /** Spanish (Puerto Rico) */
+ es_es, /** Spanish (Spain) */ es_uy, /** Spanish (Uruguay) */
+ es_ve, /** Spanish (Venezuela) */ sv, /** Swedish */
+ sv_fi, /** Swedish (Finland) */ sv_se, /** Swedish (Sweden) */
+ tr, /** Turkish */ uk /** Ukranian */
+ };
+
+ /**
+ * Possible values contained in a DayList.
+ */
+ enum Day {
+ UndefinedDay,
+ Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
+ };
+
+ enum Format {
+ UnknownFormat,
+ AtomFeed,
+ RSSFeed
+ };
+
+ /**
+ * This type is used by Document::skipDays().
+ */
+ typedef QValueList<Day> DayList;
+
+ /**
+ * This type is used by Document::skipHours().
+ */
+ typedef QValueList<unsigned short> HourList;
+}
+
+#endif // LIBRSS_GLOBAL_H
+// vim: noet:ts=4
diff --git a/plugins/rssfeed/rss/image.cpp b/plugins/rssfeed/rss/image.cpp
new file mode 100644
index 0000000..33e1544
--- /dev/null
+++ b/plugins/rssfeed/rss/image.cpp
@@ -0,0 +1,167 @@
+/*
+ * image.cpp
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#include "image.h"
+#include "tools_p.h"
+
+#include <kio/job.h>
+#include <kurl.h>
+
+#include <qbuffer.h>
+#include <qdom.h>
+#include <qpixmap.h>
+
+using namespace RSS;
+
+struct Image::Private : public Shared
+{
+ Private() : height(31), width(88), pixmapBuffer(NULL), job(NULL)
+ { }
+
+ QString title;
+ KURL url;
+ KURL link;
+ QString description;
+ unsigned int height;
+ unsigned int width;
+ QBuffer *pixmapBuffer;
+ KIO::Job *job;
+};
+
+Image::Image() : QObject(), d(new Private)
+{
+}
+
+Image::Image(const Image &other) : QObject(), d(0)
+{
+ *this = other;
+}
+
+Image::Image(const QDomNode &node) : QObject(), d(new Private)
+{
+ QString elemText;
+
+ if (!(elemText = extractNode(node, QString::fromLatin1("title"))).isNull())
+ d->title = elemText;
+ if (!(elemText = extractNode(node, QString::fromLatin1("url"))).isNull())
+ d->url = elemText;
+ if (!(elemText = extractNode(node, QString::fromLatin1("link"))).isNull())
+ d->link = elemText;
+ if (!(elemText = extractNode(node, QString::fromLatin1("description"))).isNull())
+ d->description = elemText;
+ if (!(elemText = extractNode(node, QString::fromLatin1("height"))).isNull())
+ d->height = elemText.toUInt();
+ if (!(elemText = extractNode(node, QString::fromLatin1("width"))).isNull())
+ d->width = elemText.toUInt();
+}
+
+Image::~Image()
+{
+ if (d->deref())
+ {
+ delete d->pixmapBuffer;
+ d->pixmapBuffer=0L;
+ delete d;
+ }
+}
+
+QString Image::title() const
+{
+ return d->title;
+}
+
+const KURL &Image::url() const
+{
+ return d->url;
+}
+
+const KURL &Image::link() const
+{
+ return d->link;
+}
+
+QString Image::description() const
+{
+ return d->description;
+}
+
+unsigned int Image::height() const
+{
+ return d->height;
+}
+
+unsigned int Image::width() const
+{
+ return d->width;
+}
+
+void Image::getPixmap()
+{
+ // Ignore subsequent calls if we didn't finish the previous download.
+ if (d->pixmapBuffer)
+ return;
+
+ d->pixmapBuffer = new QBuffer;
+ d->pixmapBuffer->open(IO_WriteOnly);
+
+ d->job = KIO::get(d->url, false, false);
+ connect(d->job, SIGNAL(data(KIO::Job *, const QByteArray &)),
+ this, SLOT(slotData(KIO::Job *, const QByteArray &)));
+ connect(d->job, SIGNAL(result(KIO::Job *)), this, SLOT(slotResult(KIO::Job *)));
+}
+
+void Image::slotData(KIO::Job *, const QByteArray &data)
+{
+ d->pixmapBuffer->writeBlock(data.data(), data.size());
+}
+
+void Image::slotResult(KIO::Job *job)
+{
+ QPixmap pixmap;
+ if (!job->error())
+ pixmap = QPixmap(d->pixmapBuffer->buffer());
+ emit gotPixmap(pixmap);
+
+ delete d->pixmapBuffer;
+ d->pixmapBuffer = NULL;
+}
+
+void Image::abort()
+{
+ if (d->job)
+ {
+ d->job->kill(true);
+ d->job = NULL;
+ }
+}
+
+Image &Image::operator=(const Image &other)
+{
+ if (this != &other) {
+ other.d->ref();
+ if (d && d->deref())
+ delete d;
+ d = other.d;
+ }
+ return *this;
+}
+
+bool Image::operator==(const Image &other) const
+{
+ return d->title == other.title() &&
+ d->url == other.url() &&
+ d->description == other.description() &&
+ d->height == other.height() &&
+ d->width == other.width() &&
+ d->link == other.link();
+}
+
+#include "image.moc"
+// vim:noet:ts=4
diff --git a/plugins/rssfeed/rss/image.h b/plugins/rssfeed/rss/image.h
new file mode 100644
index 0000000..e9e65b1
--- /dev/null
+++ b/plugins/rssfeed/rss/image.h
@@ -0,0 +1,173 @@
+/*
+ * image.h
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_IMAGE_H
+#define LIBRSS_IMAGE_H
+
+#include "global.h"
+
+#include <qobject.h>
+
+class QDomNode;
+
+namespace KIO
+{
+ class Job;
+}
+class KURL;
+
+namespace RSS
+{
+ /**
+ * Represents an image as stored in a RSS file. You don't have to
+ * instantiate one of these yourself, the common way to access instances
+ * is via Document::image().
+ * @see Document::image()
+ */
+ class Image : public QObject
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Default constructor.
+ */
+ Image();
+
+ /**
+ * Copy constructor.
+ * @param other The Image object to copy.
+ */
+ Image(const Image &other);
+
+ /**
+ * Constructs an Image from a piece of RSS markup.
+ * @param node A QDomNode which references the DOM leaf to be used
+ * for constructing the Image.
+ */
+ Image(const QDomNode &node);
+
+ /**
+ * Assignment operator.
+ * @param other The Image object to clone.
+ * @return A reference to the cloned Image object.
+ */
+ Image &operator=(const Image &other);
+
+ /**
+ * Compares two images. Two images are considered identical if
+ * their properties (title, description, link etc.) are identical.
+ * Note that this does not include the actual pixmap data!
+ * @param other The image to compare with.
+ * @return Whether the two images are equal.
+ */
+ bool operator==(const Image &other) const;
+
+ /**
+ * Convenience method. Simply calls !operator==().
+ * @param other The image to compared with.
+ * @return Whether the two images are unequal.
+ */
+ bool operator!=(const Image &other) const { return !operator==(other); }
+
+ /**
+ * Destructor.
+ */
+ virtual ~Image();
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The 'caption' of this image, or QString::null if no
+ * caption is available.
+ */
+ QString title() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The URL pointing to the file containing the graphic
+ * data (GIF, JPEG or PNG format), or an empty KURL if no URL
+ * is available. You can use getPixmap() and gotPixmap() to have
+ * the Image download the pixmap data itself.
+ * Note that the RSS 0.91 Specification dictates that URLs not
+ * starting with "http://" or "ftp://" are considered invalid.
+ */
+ const KURL &url() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return A link to some resource, or an empty KURL of no link is
+ * available. Clicking on the image should lead the user to the
+ * resource referenced by this URL.
+ * Note that the RSS 0.91 Specification dictates that URLs not
+ * starting with "http://" or "ftp://" are considered invalid.
+ */
+ const KURL &link() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return A description of what this picture shows, or
+ * QString::null if no description is available. Useful for
+ * people who deactivated images but want or need to know what is
+ * shown.
+ */
+ QString description() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return The height in pixels as reported by the news site, the
+ * default value is 31 pixels. The RSS 0.91 Specification requires
+ * this value to be between 1 and 400.
+ * '0' if this information isn't available. This is merely provided
+ * for completeness, you should not rely on this value but rather
+ * check what height the QPixmap as returned by gotPixmap()
+ * reports.
+ */
+ unsigned int height() const;
+
+ /**
+ * RSS 0.91 and upwards
+ * @return The width in pixels as reported by the news site, the
+ * default value is 88 pixels. The RSS 0.91 Specification requires
+ * this value to be between 1 and 144.
+ * This is merely provided for completeness, you should not rely
+ * on this value but rather check what width the QPixmap as
+ * returned by gotPixmap() reports.
+ */
+ unsigned int width() const;
+
+ /**
+ * Makes the image download the image data as referenced by the
+ * URL returned by url(). You have to connect to the signal
+ * gotPixmap() first and then call getPixmap().
+ */
+ void getPixmap();
+ void abort();
+
+ signals:
+ /**
+ * Emitted when this Image is done downloading the actual graphics
+ * data as referenced by the URL returned by url(). You can trigger
+ * this download by calling getPixmap().
+ * @param pixmap The pixmap as constructed from the data referenced
+ * by the URL returned by link().
+ */
+ void gotPixmap(const QPixmap &pixmap);
+
+ private slots:
+ void slotData(KIO::Job *job, const QByteArray &data);
+ void slotResult(KIO::Job *job);
+
+ private:
+ struct Private;
+ Private *d;
+ };
+}
+
+#endif // LIBRSS_IMAGE_H
+// vim: noet:ts=4
diff --git a/plugins/rssfeed/rss/librss.doxyfile b/plugins/rssfeed/rss/librss.doxyfile
new file mode 100644
index 0000000..c81ac16
--- /dev/null
+++ b/plugins/rssfeed/rss/librss.doxyfile
@@ -0,0 +1,921 @@
+# Doxyfile 1.2.14
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = librss
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 0.1
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = doc/
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
+# German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish,
+# Portuguese, Romanian, Russian, Slovak, Slovene, Spanish and Swedish.
+
+OUTPUT_LANGUAGE = English
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these class will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
+# members of a class in the documentation of that class as if those members were
+# ordinary class members. Constructors, destructors and assignment operators of
+# the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. It is allowed to use relative paths in the argument list.
+
+STRIP_FROM_PATH =
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower case letters. If set to YES upper case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# users are adviced to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explict @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# reimplements.
+
+INHERIT_DOCS = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 4
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consist of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C.
+# For instance some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = .
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
+# *.h++ *.idl *.odl
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
+# that are symbolic links (a Unix filesystem feature) are excluded from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+
+INPUT_FILTER =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse.
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the Html help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript and frames is required (for instance Mozilla, Netscape 4.0+,
+# or Internet explorer 4.0+). Note that for large projects the tree generation
+# can take a very long time. In such cases it is better to disable this feature.
+# Windows users are probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimised for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assigments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_XML = NO
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_PREDEFINED tags.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line and do not end with a semicolon. Such function macros are typically
+# used for boiler-plate code, and will confuse the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tagfiles.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or
+# super classes. Setting the tag to NO turns the diagrams off. Note that this
+# option is superceded by the HAVE_DOT option below. This is only a fallback. It is
+# recommended to install and use dot, since it yield more powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are gif, jpg, and png
+# If left blank gif will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found on the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermedate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
+
+# The CGI_NAME tag should be the name of the CGI script that
+# starts the search engine (doxysearch) with the correct parameters.
+# A script with this name will be generated by doxygen.
+
+CGI_NAME = search.cgi
+
+# The CGI_URL tag should be the absolute URL to the directory where the
+# cgi binaries are located. See the documentation of your http daemon for
+# details.
+
+CGI_URL =
+
+# The DOC_URL tag should be the absolute URL to the directory where the
+# documentation is located. If left blank the absolute path to the
+# documentation, with file:// prepended to it, will be used.
+
+DOC_URL =
+
+# The DOC_ABSPATH tag should be the absolute path to the directory where the
+# documentation is located. If left blank the directory on the local machine
+# will be used.
+
+DOC_ABSPATH =
+
+# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
+# is installed.
+
+BIN_ABSPATH = /usr/local/bin/
+
+# The EXT_DOC_PATHS tag can be used to specify one or more paths to
+# documentation generated for other projects. This allows doxysearch to search
+# the documentation for these projects as well.
+
+EXT_DOC_PATHS =
diff --git a/plugins/rssfeed/rss/librss.h b/plugins/rssfeed/rss/librss.h
new file mode 100644
index 0000000..c9637d0
--- /dev/null
+++ b/plugins/rssfeed/rss/librss.h
@@ -0,0 +1,22 @@
+/*
+ * librss.h
+ *
+ * Copyright (c) 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_LIBRSS_H
+#define LIBRSS_LIBRSS_H
+
+#include "article.h"
+#include "document.h"
+#include "global.h"
+#include "image.h"
+#include "loader.h"
+#include "textinput.h"
+
+#endif // LIBRSS_LIBRSS_H
+// vim: noet:ts=4
diff --git a/plugins/rssfeed/rss/loader.cpp b/plugins/rssfeed/rss/loader.cpp
new file mode 100644
index 0000000..9dfb50a
--- /dev/null
+++ b/plugins/rssfeed/rss/loader.cpp
@@ -0,0 +1,425 @@
+/*
+ * loader.cpp
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#include "loader.h"
+#include "document.h"
+
+#include <kio/job.h>
+#include <kprocess.h>
+#include <kurl.h>
+#include <kdebug.h>
+
+#include <qdom.h>
+#include <qbuffer.h>
+#include <qregexp.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+
+using namespace RSS;
+
+DataRetriever::DataRetriever()
+{
+}
+
+DataRetriever::~DataRetriever()
+{
+}
+
+struct FileRetriever::Private
+{
+ Private()
+ : buffer(NULL),
+ lastError(0), job(NULL)
+ {
+ }
+
+ ~Private()
+ {
+ delete buffer;
+ }
+
+ QBuffer *buffer;
+ int lastError;
+ KIO::Job *job;
+};
+
+FileRetriever::FileRetriever()
+ : d(new Private)
+{
+}
+
+FileRetriever::~FileRetriever()
+{
+ delete d;
+}
+
+bool FileRetriever::m_useCache = true;
+
+void FileRetriever::setUseCache(bool enabled)
+{
+ m_useCache = enabled;
+}
+
+void FileRetriever::retrieveData(const KURL &url)
+{
+ if (d->buffer)
+ return;
+
+ d->buffer = new QBuffer;
+ d->buffer->open(IO_WriteOnly);
+
+ KURL u=url;
+
+ if (u.protocol()=="feed")
+ u.setProtocol("http");
+
+ d->job = KIO::get(u, !m_useCache, false);
+
+
+ QTimer::singleShot(1000*90, this, SLOT(slotTimeout()));
+
+ connect(d->job, SIGNAL(data(KIO::Job *, const QByteArray &)),
+ SLOT(slotData(KIO::Job *, const QByteArray &)));
+ connect(d->job, SIGNAL(result(KIO::Job *)), SLOT(slotResult(KIO::Job *)));
+ connect(d->job, SIGNAL(permanentRedirection(KIO::Job *, const KURL &, const KURL &)),
+ SLOT(slotPermanentRedirection(KIO::Job *, const KURL &, const KURL &)));
+}
+
+void FileRetriever::slotTimeout()
+{
+ abort();
+
+ delete d->buffer;
+ d->buffer = NULL;
+
+ d->lastError = KIO::ERR_SERVER_TIMEOUT;
+
+ emit dataRetrieved(QByteArray(), false);
+}
+
+int FileRetriever::errorCode() const
+{
+ return d->lastError;
+}
+
+void FileRetriever::slotData(KIO::Job *, const QByteArray &data)
+{
+ d->buffer->writeBlock(data.data(), data.size());
+}
+
+void FileRetriever::slotResult(KIO::Job *job)
+{
+ QByteArray data = d->buffer->buffer();
+ data.detach();
+
+ delete d->buffer;
+ d->buffer = NULL;
+
+ d->lastError = job->error();
+ emit dataRetrieved(data, d->lastError == 0);
+}
+
+void FileRetriever::slotPermanentRedirection(KIO::Job *, const KURL &, const KURL &newUrl)
+{
+ emit permanentRedirection(newUrl);
+}
+
+void FileRetriever::abort()
+{
+ if (d->job)
+ {
+ d->job->kill(true);
+ d->job = NULL;
+ }
+}
+
+struct OutputRetriever::Private
+{
+ Private() : process(NULL),
+ buffer(NULL),
+ lastError(0)
+ {
+ }
+
+ ~Private()
+ {
+ delete process;
+ delete buffer;
+ }
+
+ KShellProcess *process;
+ QBuffer *buffer;
+ int lastError;
+};
+
+OutputRetriever::OutputRetriever() :
+ d(new Private)
+{
+}
+
+OutputRetriever::~OutputRetriever()
+{
+ delete d;
+}
+
+void OutputRetriever::retrieveData(const KURL &url)
+{
+ // Ignore subsequent calls if we didn't finish the previous job yet.
+ if (d->buffer || d->process)
+ return;
+
+ d->buffer = new QBuffer;
+ d->buffer->open(IO_WriteOnly);
+
+ d->process = new KShellProcess();
+ connect(d->process, SIGNAL(processExited(KProcess *)),
+ SLOT(slotExited(KProcess *)));
+ connect(d->process, SIGNAL(receivedStdout(KProcess *, char *, int)),
+ SLOT(slotOutput(KProcess *, char *, int)));
+ *d->process << url.path();
+ d->process->start(KProcess::NotifyOnExit, KProcess::Stdout);
+}
+
+int OutputRetriever::errorCode() const
+{
+ return d->lastError;
+}
+
+void OutputRetriever::slotOutput(KProcess *, char *data, int length)
+{
+ d->buffer->writeBlock(data, length);
+}
+
+void OutputRetriever::slotExited(KProcess *p)
+{
+ if (!p->normalExit())
+ d->lastError = p->exitStatus();
+
+ QByteArray data = d->buffer->buffer();
+ data.detach();
+
+ delete d->buffer;
+ d->buffer = NULL;
+
+ delete d->process;
+ d->process = NULL;
+
+ emit dataRetrieved(data, p->normalExit() && p->exitStatus() == 0);
+}
+
+struct Loader::Private
+{
+ Private() : retriever(NULL),
+ lastError(0)
+ {
+ }
+
+ ~Private()
+ {
+ delete retriever;
+ }
+
+ DataRetriever *retriever;
+ int lastError;
+ KURL discoveredFeedURL;
+ KURL url;
+};
+
+Loader *Loader::create()
+{
+ return new Loader;
+}
+
+Loader *Loader::create(QObject *object, const char *slot)
+{
+ Loader *loader = create();
+ connect(loader, SIGNAL(loadingComplete(Loader *, Document, Status)),
+ object, slot);
+ return loader;
+}
+
+Loader::Loader() : d(new Private)
+{
+}
+
+Loader::~Loader()
+{
+ delete d;
+}
+
+void Loader::loadFrom(const KURL &url, DataRetriever *retriever)
+{
+ if (d->retriever != NULL)
+ return;
+
+ d->url=url;
+ d->retriever = retriever;
+
+ connect(d->retriever, SIGNAL(dataRetrieved(const QByteArray &, bool)),
+ this, SLOT(slotRetrieverDone(const QByteArray &, bool)));
+
+ d->retriever->retrieveData(url);
+}
+
+int Loader::errorCode() const
+{
+ return d->lastError;
+}
+
+void Loader::abort()
+{
+ if (d && d->retriever)
+ {
+ d->retriever->abort();
+ delete d->retriever;
+ d->retriever=NULL;
+ }
+ emit loadingComplete(this, QDomDocument(), Aborted);
+ delete this;
+}
+
+const KURL &Loader::discoveredFeedURL() const
+{
+ return d->discoveredFeedURL;
+}
+
+#include <kdebug.h>
+
+void Loader::slotRetrieverDone(const QByteArray &data, bool success)
+{
+ d->lastError = d->retriever->errorCode();
+
+ delete d->retriever;
+ d->retriever = NULL;
+
+ Document rssDoc;
+ Status status = Success;
+
+ if (success) {
+ QDomDocument doc;
+
+ /* Some servers insert whitespace before the <?xml...?> declaration.
+ * QDom doesn't tolerate that (and it's right, that's invalid XML),
+ * so we strip that.
+ */
+
+ const char *charData = data.data();
+ int len = data.count();
+
+ while (len && QChar(*charData).isSpace()) {
+ --len;
+ ++charData;
+ }
+
+ if ( len > 3 && QChar(*charData) == QChar(0357) ) { // 0357 0273 0277
+ len -= 3;
+ charData += 3;
+ }
+ QByteArray tmpData;
+ tmpData.setRawData(charData, len);
+
+ if (doc.setContent(tmpData))
+ {
+ rssDoc = Document(doc);
+ if (!rssDoc.isValid())
+ {
+ discoverFeeds(tmpData);
+ status = ParseError;
+ }
+ }
+ else
+ {
+ discoverFeeds(tmpData);
+ status = ParseError;
+ }
+
+ tmpData.resetRawData(charData, len);
+ } else
+ status = RetrieveError;
+
+ emit loadingComplete(this, rssDoc, status);
+
+ delete this;
+}
+
+void Loader::discoverFeeds(const QByteArray &data)
+{
+ QString str = QString(data).simplifyWhiteSpace();
+ QString s2;
+ //QTextStream ts( &str, IO_WriteOnly );
+ //ts << data.data();
+
+ // "<[\\s]link[^>]*rel[\\s]=[\\s]\\\"[\\s]alternate[\\s]\\\"[^>]*>"
+ // "type[\\s]=[\\s]\\\"application/rss+xml\\\""
+ // "href[\\s]=[\\s]\\\"application/rss+xml\\\""
+ QRegExp rx( "(?:REL)[^=]*=[^sAa]*(?:service.feed|ALTERNATE)[\\s]*[^s][^s](?:[^>]*)(?:HREF)[^=]*=[^A-Z0-9-_~,./$]*([^'\">\\s]*)", false);
+ if (rx.search(str)!=-1)
+ s2=rx.cap(1);
+ else{
+ // does not support Atom/RSS autodiscovery.. try finding feeds by brute force....
+ int pos=0;
+ QStringList feeds;
+ QString host=d->url.host();
+ rx.setPattern("(?:<A )[^H]*(?:HREF)[^=]*=[^A-Z0-9-_~,./]*([^'\">\\s]*)");
+ while ( pos >= 0 ) {
+ pos = rx.search( str, pos );
+ s2=rx.cap(1);
+ if (s2.endsWith(".rdf")|s2.endsWith(".rss")|s2.endsWith(".xml"))
+ feeds.append(s2);
+ if ( pos >= 0 ) {
+ pos += rx.matchedLength();
+ }
+ }
+
+ s2=feeds.first();
+ KURL testURL;
+ // loop through, prefer feeds on same host
+ for ( QStringList::Iterator it = feeds.begin(); it != feeds.end(); ++it ) {
+ testURL=*it;
+ if (testURL.host()==host)
+ {
+ s2=*it;
+ break;
+ }
+ }
+ }
+
+ if (s2.isNull()) {
+ kdDebug() << "No feed found for a site" << endl;
+ return;
+ }
+
+ if (KURL::isRelativeURL(s2))
+ {
+ if (s2.startsWith("//"))
+ {
+ s2=s2.prepend(d->url.protocol()+":");
+ d->discoveredFeedURL=s2;
+ }
+ else if (s2.startsWith("/"))
+ {
+ d->discoveredFeedURL=d->url;
+ d->discoveredFeedURL.setPath(s2);
+ }
+ else
+ {
+ d->discoveredFeedURL=d->url;
+ d->discoveredFeedURL.addPath(s2);
+ }
+ d->discoveredFeedURL.cleanPath();
+ }
+ else
+ d->discoveredFeedURL=s2;
+
+ d->discoveredFeedURL.cleanPath();
+}
+
+#include "loader.moc"
+// vim:noet:ts=4
diff --git a/plugins/rssfeed/rss/loader.h b/plugins/rssfeed/rss/loader.h
new file mode 100644
index 0000000..fb06634
--- /dev/null
+++ b/plugins/rssfeed/rss/loader.h
@@ -0,0 +1,339 @@
+/*
+ * loader.h
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_LOADER_H
+#define LIBRSS_LOADER_H
+
+#include "global.h"
+
+class KURL;
+
+#include <qobject.h>
+
+namespace KIO
+{
+ class Job;
+}
+class KProcess;
+
+namespace RSS
+{
+ class Document;
+
+ /**
+ * Abstract baseclass for all data retriever classes. Subclass this to add
+ * a new retrieval algorithm which can then be plugged into the RSS loader.
+ * @see Loader, FileRetriever, OutputRetriever
+ */
+ class DataRetriever : public QObject
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Default constructor.
+ */
+ DataRetriever();
+
+ /**
+ * Destructor.
+ */
+ virtual ~DataRetriever();
+
+ /**
+ * Retrieve data from the given URL. This method is supposed to get
+ * reimplemented by subclasses. It will be called by the Loader
+ * class in case it needs to retrieve the data.
+ * @see Loader::loadFrom()
+ */
+ virtual void retrieveData(const KURL &url) = 0;
+
+ /**
+ * @return An error code which might give a more precise information
+ * about what went wrong in case the 'success' flag returned with
+ * the dataRetrieved() signal was 'false'. Note that the meaning of
+ * the returned integer depends on the actual data retriever.
+ */
+ virtual int errorCode() const = 0;
+
+ virtual void abort() = 0;
+ signals:
+ /**
+ * Emit this signal to tell the Loader class that the retrieval
+ * process was finished.
+ * @param data Should contain the retrieved data and will get
+ * parsed by the Loader class.
+ * @param success Indicates whether there were any problems during
+ * the retrieval process. Pass 'true' to indicate that everything
+ * went seamlessy, 'false' to tell the Loader that something went
+ * wrong and that the data parameter might contain no or invalid
+ * data.
+ */
+ void dataRetrieved(const QByteArray &data, bool success);
+
+ private:
+ DataRetriever(const DataRetriever &other);
+ DataRetriever &operator=(const DataRetriever &other);
+ };
+
+ /**
+ * Implements a file retriever, to be used with Loader::loadFrom().
+ * @see DataRetriever, Loader::loadFrom()
+ */
+ class FileRetriever : public DataRetriever
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Default constructor.
+ */
+ FileRetriever();
+
+ /**
+ * Destructor.
+ */
+ virtual ~FileRetriever();
+
+ /**
+ * Downloads the file referenced by the given URL and passes it's
+ * contents on to the Loader.
+ * @param url An URL referencing a file which is assumed to
+ * reference valid XML.
+ * @see Loader::loadFrom()
+ */
+ virtual void retrieveData(const KURL &url);
+
+ /**
+ * @return The error code for the last process of retrieving data.
+ * The returned numbers correspond directly to the error codes
+ * <a href="http://developer.kde.org/documentation/library/cvs-api/classref/kio/KIO.html#Error">as
+ * defined by KIO</a>.
+ */
+ virtual int errorCode() const;
+
+ virtual void abort();
+
+ static void setUseCache(bool enabled);
+
+ signals:
+ /**
+ * Signals a permanent redirection. The redirection itself is
+ * handled internally, so you don't need to call Loader::loadFrom()
+ * with the new URL. This signal is useful in case you want to
+ * notify the user, or adjust a database entry.
+ * @see Loader::loadFrom()
+ */
+ void permanentRedirection(const KURL &url);
+
+ protected slots:
+ void slotTimeout();
+
+ private slots:
+ void slotData(KIO::Job *job, const QByteArray &data);
+ void slotResult(KIO::Job *job);
+ void slotPermanentRedirection(KIO::Job *job, const KURL &fromUrl,
+ const KURL &toUrl);
+
+ private:
+ static bool m_useCache;
+
+ FileRetriever(const FileRetriever &other);
+ FileRetriever &operator=(const FileRetriever &other);
+
+ struct Private;
+ Private *d;
+ };
+
+ /**
+ * Implements a data retriever which executes a program and stores returned
+ * by the program on stdout. To be used with Loader::loadFrom().
+ * @see DataRetriever, Loader::loadFrom()
+ */
+ class OutputRetriever : public DataRetriever
+ {
+ Q_OBJECT
+ public:
+ /**
+ * Default constructor.
+ */
+ OutputRetriever();
+
+ /**
+ * Destructor.
+ */
+ virtual ~OutputRetriever();
+
+ /**
+ * Executes the program referenced by the given URL and retrieves
+ * the data which the program prints to stdout.
+ * @param url An URL which is supposed to reference an executable
+ * file.
+ * @see Loader::loadFrom()
+ */
+ virtual void retrieveData(const KURL &url);
+
+ /**
+ * @return The error code for the last process of retrieving data.
+ * 0 is returned in case there was no error, otherwise an error
+ * code which depends on the particular program which was run is
+ * returned.
+ */
+ virtual int errorCode() const;
+
+ virtual void abort() {}
+
+ private slots:
+ void slotOutput(KProcess *process, char *data, int length);
+ void slotExited(KProcess *process);
+
+ private:
+ OutputRetriever(const OutputRetriever &other);
+ OutputRetriever &operator=(const OutputRetriever &other);
+
+ struct Private;
+ Private *d;
+ };
+
+ /**
+ * This class is the preferred way of loading RSS files. Usage is very
+ * straightforward:
+ *
+ * \code
+ * Loader *loader = Loader::create();
+ * connect(loader, SIGNAL(loadingComplete(Loader *, Document, Status)),
+ * this, SLOT(slotLoadingComplete(Loader *, Document, Status)));
+ * loader->loadFrom("http://www.blah.org/foobar.rdf", new FileRetriever);
+ * \endcode
+ *
+ * This creates a Loader object, connects it's loadingComplete() signal to
+ * your custom slot and then makes it load the file
+ * 'http://www.blah.org/foobar.rdf' using the FileRetriever. You could've
+ * done something like this as well:
+ *
+ * \code
+ * // create the Loader, connect it's signal...
+ * loader->loadFrom("/home/myself/some-script.py", new OutputRetriever);
+ * \endcode
+ *
+ * That'd make the Loader use another algorithm for retrieving the RSS data;
+ * 'OutputRetriever' will make it execute the script
+ * '/home/myself/some-script.py' and assume whatever that script prints to
+ * stdout is RSS markup. This is e.g. handy for conversion scripts, which
+ * download a HTML file and convert it's contents into RSS markup.
+ *
+ * No matter what kind of retrieval algorithm you employ, your
+ * 'slotLoadingComplete' method might look like this:
+ *
+ * \code
+ * void MyClass::slotLoadingComplete(Loader *loader, Document doc, Status status)
+ * {
+ * // Note that Loader::~Loader() is private, so you cannot delete Loader instances.
+ * // You don't need to do that anyway since Loader instances delete themselves.
+ *
+ * if (status != RSS::Success)
+ * return;
+ *
+ * QString title = doc.title();
+ * // do whatever you want with the information.
+ * }
+ * \endcode
+ *
+ * \note You have to create a copy of the passed Document instance in
+ * case you want/need to use it after the slot attached to the
+ * loadingComplete signal goes out of scope. This is e.g. the case if you
+ * intend to call getPixmap() on Document::image()!
+ */
+ class Loader : public QObject
+ {
+ Q_OBJECT
+ friend class someClassWhichDoesNotExist;
+ public:
+ /**
+ * Constructs a Loader instance. This is pretty much what the
+ * default constructor would do, except that it ensures that all
+ * Loader instances have been allocated on the heap (this is
+ * required so that Loader's can delete themselves safely after they
+ * emitted the loadingComplete() signal.).
+ * @return A pointer to a new Loader instance.
+ */
+ static Loader *create();
+
+ /**
+ * Convenience method. Does the same as the above method except that
+ * it also does the job of connecting the loadingComplete() signal
+ * to the given slot for you.
+ * @param object A QObject which features the specified slot
+ * @param slot Which slot to connect to.
+ */
+ static Loader *create(QObject *object, const char *slot);
+
+ /**
+ * Loads the RSS file referenced by the given URL using the
+ * specified retrieval algorithm. Make sure that you connected
+ * to the loadingComplete() signal before calling this method so
+ * that you're guaranteed to get notified when the loading finished.
+ * \note A Loader object cannot load from multiple URLs simultaneously;
+ * consequently, subsequent calls to loadFrom will be discarded
+ * silently, only the first loadFrom request will be executed.
+ * @param url An URL referencing the input file.
+ * @param retriever A subclass of DataRetriever which implements a
+ * specialized retrieval behaviour. Note that the ownership of the
+ * retriever is transferred to the Loader, i.e. the Loader will
+ * delete it when it doesn't need it anymore.
+ * @see DataRetriever, Loader::loadingComplete()
+ */
+ void loadFrom(const KURL &url, DataRetriever *retriever);
+
+ /**
+ * Retrieves the error code of the last loading process (if any),
+ * as reported by the employed data retrever.
+ */
+ int errorCode() const;
+
+ const KURL &discoveredFeedURL() const;
+
+ void abort();
+
+ signals:
+ /**
+ * This signal gets emitted when the loading process triggered by
+ * calling loadFrom() finished.
+ * @param loader A pointer pointing to the loader object which
+ * emitted this signal; this is handy in case you connect multiple
+ * loaders to a single slot.
+ * @param doc In case status is Success, this parameter holds the
+ * parsed RSS file. In case it's RetrieveError, you should query
+ * loader->errorCode() for the actual error code.
+ * Note that you have to create a copy of the passed Document
+ * instance in case you want/need to use it after the slot attached
+ * to the loadingComplete signal goes out of scope. This is e.g.
+ * the case if you intend to call getPixmap() on Document::image()!
+ * @param status A status byte telling whether there were any problems
+ * while retrieving or parsing the data.
+ * @see Document, Status
+ */
+ void loadingComplete(Loader *loader, Document doc, Status status);
+
+ private slots:
+ void slotRetrieverDone(const QByteArray &data, bool success);
+
+ private:
+ Loader();
+ Loader(const Loader &other);
+ Loader &operator=(const Loader &other);
+ ~Loader();
+ void discoverFeeds(const QByteArray &data);
+
+ struct Private;
+ Private *d;
+ };
+}
+
+#endif // LIBRSS_LOADER_H
+// vim: noet:ts=4
diff --git a/plugins/rssfeed/rss/rss-faq.html b/plugins/rssfeed/rss/rss-faq.html
new file mode 100644
index 0000000..480b19f
--- /dev/null
+++ b/plugins/rssfeed/rss/rss-faq.html
@@ -0,0 +1,396 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<title>RSS Headline Syndication - Frequently Asked Questions for Content Providers</title>
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252" />
+<meta name="description" content="RSS Headline Syndication - Frequently Asked Questions for Content Providers" />
+<meta name="keywords" content="rss faq, rss, faq, rich site summary, rdf site summary, really simple syndication, headline syndication, syndication" />
+<meta name="robots" content="index,follow" />
+<style type="text/css">
+<!--
+td.content
+{
+font-family: Verdana, Arial, Helvetica, sans-serif;
+color: #000000;
+font-size: 10pt;
+font-weight: normal;
+}
+td.contentbold
+{
+font-family: Verdana, Arial, Helvetica, sans-serif;
+color: #000000;
+font-size: 10pt;
+font-weight: bold;
+}
+td.contentsmall
+{
+font-family: Verdana, Arial, Helvetica, sans-serif;
+color: #000000;
+font-size: 8pt;
+font-weight: normal;
+}
+-->
+</style>
+</head>
+<body bgcolor="#ffffff">
+<p align="right">
+<i>
+ This document was taken from <a href="http://www.purplepages.ie/rss/">http://www.purplepages.ie/rss/</a>.<br/>
+ <tt><a href="mailto:raabe@kde.org">Frerich Raabe</a></tt>
+</i>
+</p>
+<table border="0" width="620" cellpadding="1" cellspacing="0">
+ <tr>
+ <td width="620" class="contentbold" colspan="2">RSS Headline Syndication<br /><br />
+ <a name="top">Frequently Asked Questions for Content Providers</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2">
+ <br /><a href="#whatishs">1. What is headline syndication?</a><br />
+ <a href="#rss">2. What is RSS?</a><br />
+ <a href="#whyrss">3. Why syndicate your headlines with RSS?</a><br />
+ <a href="#howrss">4. How can I create an RSS file?</a><br />
+ <a href="#promoterss">5. How can I promote my RSS file?</a><br />
+ <a href="#morerss">6. Where can I find more information about RSS?</a><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="whatishs">1. What is headline syndication?</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ Websites that publish new content regularly usually provide a list of news headline style links to their latest content. In addition to displaying these headlines on their own websites, it is very common for publishers to make them available for syndication, so that other websites or applications can also include their headlines.<br /><br />
+ Headline syndication does not deal with the full text of articles, it is simply about syndicating an automatically updating list of headlines, with each headline being a link to the item that it refers to on the publishers website.
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="rss">2. What is RSS?</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <a href="#top">top</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ RSS is the name given to a simple and well-established XML format used to syndicate headlines. Once a website creates an RSS file they have created a means to allow others to syndicate their headlines.<br /><br />
+ The first version of RSS (RSS 0.9) was released by <a href="http://www.netscape.com/">Netscape</a> in March 1999 as a format for adding news channels to their <a href="http://my.netscape.com/">My.Netscape.Com</a> portal. Then in July 1999 Netscape released RSS 0.91, incorporating most of the features of a format called &lt;scriptingNews&gt;, which was created by <a href="http://www.userland.com/">UserLand</a>. Shortly thereafter Netscape discontinued developing the RSS format, however UserLand persisted and RSS continued to grow in strength. In December 2000, the separate RSS-DEV Working Group released RSS 1.0 and Userland announced RSS 0.92. As of April 2001, Userland is now planning RSS 0.93. Although RSS is not clearly an acronym of anything, different people have called it Rich Site Summary, RDF Site Summary and Really Simple Syndication at different times.<br /><br />
+ The lack of clarity in what RSS stands for or which version is the correct one to use can seem confusing to beginners. However these issues don't need to addressed by a website wanting to create an RSS file. RSS is a very well recognised format, in fact it is often referred to as the most successful XML format to date. Some websites have a preference for one version, others create more than one RSS file and support multiple versions and a recent survey suggests that the first two versions of RSS (0.9 and 0.91) are still by far the most popular.
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <a href="#top">top</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="whyrss">3. Why syndicate your headlines with RSS?</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ Syndicating headlines is an excellent and cost-effective way of driving traffic to, and increasing brand awareness of, any website that publishes new content regularly.<br /><br />
+ Once a website produces an RSS file they are enabling others to syndicate their headlines, without any further work on their part.<br /><br />
+ The main benefits of creating an RSS file:<br />&nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content">RSS content can be included in customisable online news portals that aggregate RSS headlines like <a href="http://my.userland.com/">My.Userland.Com</a>.
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content">Websites that display news headlines can use an RSS file to incorporate another websites headlines into their own.
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content">RSS content can be added to personal desktop news reading applications like <a href="http://www.headlineviewer.com/">Headline Viewer</a> or <a href="http://radio.userland.com/">Radio Userland</a>.
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content">Email newsletter providers could allow users to subscribe to RSS channels. <a href="http://www.xml.com/">XML.com</a> and <a href="http://www.xmltree.com/">XMLTree.com</a> previously offered such a service called Newsboy.
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ One positive side effect of producing an RSS file is that it can also be used by headline aggregation services like <a href="http://www.moreover.com/">Moreover.com</a>, who power news portals, specialist news search engines, business intelligence services or provide newsfeeds to websites. Most such companies use crawler-based technologies to aggregate and do not insist upon content being available in RSS, however they do have some requirements which having an RSS file addresses, sparing the need for any work on the part of a website that already publishes its headlines in RSS.
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <a href="#top">top</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="howrss">4. How can I create an RSS file?</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ RSS is a simple XML format and anyone who has experience in a mark-up language like HTML or XML should find it very easy to create and maintain an RSS file by hand.
+ <br /><br />Many websites prefer to generate their RSS file using a programming language, which involves a little more work to begin with but means that maintenance is no longer an issue.
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ In this section:
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2">
+ <a href="#specifications">RSS Specifications</a><br />
+ <a href="#validators">RSS Validators</a><br />
+ <a href="#tutorials">RSS Tutorials - The Basics</a><br />
+ <a href="#tutorialsgen">RSS Tutorials - Generating RSS</a><br />
+ <a href="#examples">RSS Examples</a><br />
+ <a href="#tools">RSS Tools &amp; Utilities</a><br />
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="specifications">RSS Specifications:</a><br />&nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" valign="top"><strong>RSS 0.93</strong> (Planning stage, April 2001)<br /><a href="http://backend.userland.com/rss093">http://backend.userland.com/rss093</a> (Userland)
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" valign="top"><strong>RSS 0.92</strong> (December 2000)<br /><a href="http://backend.userland.com/rss092">http://backend.userland.com/rss092</a> (Userland)<br />
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" valign="top"><strong>RSS 1.0</strong> (December 2000)<br /><a href="http://groups.yahoo.com/group/rss-dev/files/specification.html">http://groups.yahoo.com/group/rss-dev/files/specification.html</a> (RSS-DEV Working Group)<br />
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" valign="top"><strong>RSS 0.91</strong> (July 1999)<br /><a href="http://backend.userland.com/rss091">http://backend.userland.com/rss091</a> (Userland)<br />
+ <a href="http://www.purplepages.ie/RSS/netscape/rss0.91.html">http://www.purplepages.ie/RSS/netscape/rss0.91.html</a> (Netscape)<br />
+ <a href="http://my.netscape.com/publish/formats/rss-spec-0.91.html">http://my.netscape.com/publish/formats/rss-spec-0.91.html</a> (Netscape, Revision 3)<br />
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" valign="top"><strong>RSS 0.90</strong> (March 1999)<br /><a href="http://www.purplepages.ie/RSS/netscape/rss0.90.html">http://www.purplepages.ie/RSS/netscape/rss0.90.html</a> (Netscape)<br />
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="validators">RSS Validators</a>:<br />&nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content"><a href="http://aggregator.userland.com/validator">http://aggregator.userland.com/validator</a> (RSS 0.91, RSS 0.92)</td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content"><a href="http://www.bath.ac.uk/~ccslrd/rss_validator/1.0/">http://www.bath.ac.uk/~ccslrd/rss_validator/1.0/</a> (RSS 1.0)</td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content"><a href="http://www.bath.ac.uk/~ccslrd/rss_validator/">http://www.bath.ac.uk/~ccslrd/rss_validator/</a> (RSS 0.9)</td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <strong><a name="tutorials">RSS Tutorials - The Basics:</a></strong> (See also <a href="#specifications">RSS Specifications</a>, <a href="#websites">Websites</a>)<br />&nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"> - <a href="http://www.oreillynet.com/pub/a/network/4000/08/25/magazine/rss_tut.html">A step-by-step guide to building an RSS 1.0 document from the O'Reilly Network.</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"> - <a href="http://publishing.about.com/arts/publishing/library/blrss.htm">An easy to understand introduction to RSS 0.91 from About.com.</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"> - <a href="http://webreference.com/xml/column13/index.html">A comprehensive guide to creating RSS 0.91 files from Webreference.</a></td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="tutorialsgen">RSS Tutorials - Generating RSS</a>:<br />&nbsp;
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content">Active Server Pages (ASP)<br />
+ <a href="http://www.purplepages.ie/site/articles/article.asp?faq=6&amp;fldAuto=76">An article explaining how RSS files can be generated using ASP.</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content">Perl<br />
+ <a href="http://www.webtechniques.com/archives/2000/02/eisenzopf/">Jonathan Eisenzopf explains how his XML::RSS module can be used to create an RSS file.</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content">PHP<br />
+ <a href="http://linux.gelrevision.nl/php/">phpChannel, a set of two PHP class files to write rss files.</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="tools">RSS Tools &amp; Utilities</a>:
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ Aaron Swartz provides a useful online utility called <a href="http://logicerror.com/blogifyYourPage">BlogifyYourPage</a>, that makes it easy to produce an RSS 1.0 file for any page.<br /><br />
+ The <a href="http://www.webreference.com/perl/tools/">RSS Channel Editor</a> is a simple Perl CGI script that makes it easy to maintain an RSS channel. It can be used online at Webreference and you can also download the source.
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <a href="#top">top</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="examples">RSS Examples</a>:
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <a href="http://newsfeeds.manilasites.com/">Newsfeeds</a> reviews sources of RSS files, good examples and ideas you can use in putting together your own feed.<br /><br />
+ <a href="http://www.ourfavoritesongs.com/">OurFavoriteSongs.Com</a> is a source of popular syndicated files, the top picks of <a href="http://radio.userland.com/">Radio Userland</a> users.
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <a name="promoterss"><strong>5. How can I promote my RSS file?</strong></a>
+ <br /><br />There are a couple of important places to register RSS files, firstly <a href="http://www.xmltree.com/">XMLTree.com</a>, a specialist directory of XML content, and secondly <a href="http://my.userland.com/">My.Userland.Com</a>. Once an RSS file has been included in these sources it is likely to be found by websites, online news portals or news reading applications seeking RSS content.<br /><br />
+ Websites should also create an information page, about syndicating their headlines. This will make existing users aware that the website has an RSS file so they can add it to their news reading applications or even include it on their own websites.<br /><br />
+ This information page will be indexed by regular search engines and can also be submitted to various niche directories:
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.4freecontent.com/">4FreeContent</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.findsticky.com/">FindSticky</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.freesticky.com/">FreeSticky</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://newsfeeds.manilasites.com/">Newsfeeds</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.purplepages.ie/site/content/">Purple Pages</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.woodoggy.com/">WooDoggy</a></td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ Websites that are interested in having their headlines picked up by organisations that aggregate headline content may also wish to visit:
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.linkyournews.com/">LinkYourNews.com</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.magportal.com/">MagPortal.com</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.moreover.com/">Moreover.com</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.newsnow.co.uk/">NewsNow.co.uk</a></td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.newsisfree.com/">NewsIsFree.com</a></td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ <a name="morerss">6. Where can I find more information about RSS?</a><br /><br />
+ <a name="websites">Websites</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.oreillynet.com/rss/">O'Reilly DevCenter RSS</a> - Articles about RSS from the O'Reilly Network.</td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://blogspace.com/rss/">RSS Info</a> - News and information on the RSS format</td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://rsswhys.weblogger.com/">RSS Why?s</a> - A site that aims to objectively and concisely explore all the points surrounding the creation, maintenance, and history of RSS.</td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.webreference.com/authoring/languages/xml/rss/">WebReference RSS Articles</a> - A collection of RSS articles and resources from Webreference.</td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ Discussion Lists
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://groups.yahoo.com/group/reallySimpleSyndication">ReallySimpleSyndication</a> - RSS 0.93.</td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://groups.yahoo.com/group/rss-dev">RSS-DEV</a> - RSS 1.0.</td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://groups.yahoo.com/group/syndication">Syndication</a> - XML syndication, mainly RSS 0.91.</td>
+ </tr>
+ <tr>
+ <td width="620" class="contentbold" colspan="2"><br />
+ More RSS FAQs
+ </td>
+ </tr>
+ <tr>
+ <td width="15" class="content" align="center" valign="top">&bull;</td>
+ <td width="605" class="content" colspan="2"><a href="http://www.voidstar.com/rssfaq">RSS FAQ</a> - A detailed RSS FAQ from Julian Bond, readers can also contribute.</td>
+ </tr>
+ <tr>
+ <td width="620" class="content" colspan="2"><br />
+ <a href="#top">top</a>
+ </td>
+ </tr>
+ <tr>
+ <td width="620" class="contentsmall" colspan="2"><br /><br /><a href="http://www.rssfaq.com/">RSSFAQ</a> Copyright &copy; 2001 Members of the Syndication, RSS-DEV and ReallySimpleSyndication Groups.</td>
+ </tr>
+ <tr>
+ <td width="620" class="contentsmall" colspan="2">You may freely copy and distribute this document. Please give acknowledgements if you do.</td>
+ </tr>
+ <tr>
+ <td width="620" class="contentsmall" colspan="2">Last Updated: 24-August-2001 <a href="mailto:alis@purplepages.ie">Alis Marsden</a>.</td>
+ </tr>
+</table>
+</body>
+</html>
diff --git a/plugins/rssfeed/rss/testlibrss.cpp b/plugins/rssfeed/rss/testlibrss.cpp
new file mode 100644
index 0000000..5d98bba
--- /dev/null
+++ b/plugins/rssfeed/rss/testlibrss.cpp
@@ -0,0 +1,75 @@
+#include "testlibrss.h"
+
+#include "image.h"
+
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <kapplication.h>
+#include <kdebug.h>
+
+using namespace RSS;
+
+static const KCmdLineOptions options[] =
+{
+ { "+url", I18N_NOOP("URL of feed"), 0 },
+ KCmdLineLastOption
+};
+
+
+void Tester::test( const QString &url )
+{
+ Loader *loader = Loader::create();
+ connect( loader, SIGNAL( loadingComplete( Loader *, Document, Status ) ),
+ this, SLOT( slotLoadingComplete( Loader *, Document, Status ) ) );
+ loader->loadFrom( url, new FileRetriever );
+}
+
+void Tester::slotLoadingComplete( Loader *loader, Document doc, Status status )
+{
+ if ( status == Success )
+ {
+ kdDebug() << "Successfully retrieved '" << doc.title() << "'" << endl;
+ kdDebug() << doc.description() << endl;
+
+ if ( doc.image() ) {
+ kdDebug() << "Image: ";
+ kdDebug() << " Title: " << doc.image()->title() << endl;
+ kdDebug() << " URL: " << doc.image()->url() << endl;
+ kdDebug() << " Link: " << doc.image()->link() << endl;
+ }
+
+ kdDebug() << "Articles:" << endl;
+
+ Article::List list = doc.articles();
+ Article::List::ConstIterator it;
+ Article::List::ConstIterator en=list.end();
+ for (it = list.begin(); it != en; ++it)
+ {
+ kdDebug() << "\tTitle: " << (*it).title() << endl;
+ kdDebug() << "\tText: " << (*it).description() << endl;
+ }
+ }
+
+ if ( status != Success )
+ kdDebug() << "ERROR " << loader->errorCode() << endl;
+
+ kapp->quit();
+}
+
+int main( int argc, char **argv )
+{
+ KAboutData aboutData( "testlibrss", "testlibrss", "0.1" );
+ KCmdLineArgs::init( argc, argv, &aboutData );
+ KCmdLineArgs::addCmdLineOptions( options );
+ KApplication app;
+
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+ if ( args->count() != 1 ) args->usage();
+
+ Tester tester;
+ tester.test( args->arg( 0 ) );
+
+ return app.exec();
+}
+
+#include "testlibrss.moc"
diff --git a/plugins/rssfeed/rss/testlibrss.h b/plugins/rssfeed/rss/testlibrss.h
new file mode 100644
index 0000000..c65fa3b
--- /dev/null
+++ b/plugins/rssfeed/rss/testlibrss.h
@@ -0,0 +1,25 @@
+#ifndef TESTLIBRSS_H
+#define TESTLIBRSS_H
+
+#include <qobject.h>
+
+#include "loader.h"
+#include "document.h"
+#include "article.h"
+#include "global.h"
+
+using RSS::Loader;
+using RSS::Document;
+using RSS::Status;
+
+class Tester : public QObject
+{
+ Q_OBJECT
+ public:
+ void test( const QString &url );
+
+ private slots:
+ void slotLoadingComplete( Loader *loader, Document doc, Status status );
+};
+
+#endif
diff --git a/plugins/rssfeed/rss/textinput.cpp b/plugins/rssfeed/rss/textinput.cpp
new file mode 100644
index 0000000..432b773
--- /dev/null
+++ b/plugins/rssfeed/rss/textinput.cpp
@@ -0,0 +1,96 @@
+/*
+ * textinput.cpp
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#include "textinput.h"
+#include "tools_p.h"
+
+#include <kurl.h>
+
+#include <qdom.h>
+
+using namespace RSS;
+
+struct TextInput::Private : public Shared
+{
+ QString title;
+ QString description;
+ QString name;
+ KURL link;
+};
+
+TextInput::TextInput() : d(new Private)
+{
+}
+
+TextInput::TextInput(const TextInput &other) : d(0)
+{
+ *this = other;
+}
+
+TextInput::TextInput(const QDomNode &node) : d(new Private)
+{
+ QString elemText;
+
+ if (!(elemText = extractNode(node, QString::fromLatin1("title"))).isNull())
+ d->title = elemText;
+ if (!(elemText = extractNode(node, QString::fromLatin1("description"))).isNull())
+ d->description = elemText;
+ if (!(elemText = extractNode(node, QString::fromLatin1("name"))))
+ d->name = elemText;
+ if (!(elemText = extractNode(node, QString::fromLatin1("link"))).isNull())
+ d->link = elemText;
+}
+
+TextInput::~TextInput()
+{
+ if (d->deref())
+ delete d;
+}
+
+QString TextInput::title() const
+{
+ return d->title;
+}
+
+QString TextInput::description() const
+{
+ return d->description;
+}
+
+QString TextInput::name() const
+{
+ return d->name;
+}
+
+const KURL &TextInput::link() const
+{
+ return d->link;
+}
+
+TextInput &TextInput::operator=(const TextInput &other)
+{
+ if (this != &other) {
+ other.d->ref();
+ if (d && d->deref())
+ delete d;
+ d = other.d;
+ }
+ return *this;
+}
+
+bool TextInput::operator==(const TextInput &other) const
+{
+ return d->title == other.title() &&
+ d->description == other.description() &&
+ d->name == other.name() &&
+ d->link == other.link();
+}
+
+// vim:noet:ts=4
diff --git a/plugins/rssfeed/rss/textinput.h b/plugins/rssfeed/rss/textinput.h
new file mode 100644
index 0000000..dd13c42
--- /dev/null
+++ b/plugins/rssfeed/rss/textinput.h
@@ -0,0 +1,121 @@
+/*
+ * textinput.h
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_TEXTINPUT_H
+#define LIBRSS_TEXTINPUT_H
+
+#include "global.h"
+
+class KURL;
+
+class QDomNode;
+class QString;
+
+namespace RSS
+{
+ /**
+ * Represents a text input facility as stored in a RSS file for the purpose
+ * of allowing users to submit queries back to the publisher's site. You
+ * don't have to instantiate one of these yourself, the common way to access
+ * instances is via Document::textInput().
+ * @see Document::textInput()
+ */
+ class TextInput
+ {
+ public:
+ /**
+ * Default constructor.
+ */
+ TextInput();
+
+ /**
+ * Copy constructor.
+ * @param other The TextInput object to copy.
+ */
+ TextInput(const TextInput &other);
+
+ /**
+ * Constructs a TextInput from a piece of RSS markup.
+ * @param node A QDomNode which references the DOM leaf to be used
+ * for constructing the TextInput.
+ */
+ TextInput(const QDomNode &node);
+
+ /**
+ * Assignment operator.
+ * @param other The TextInput object to clone.
+ * @return A reference to the cloned TextInput object.
+ */
+ TextInput &operator=(const TextInput &other);
+
+ /**
+ * Compares two text inputs. Two text inputs are considered
+ * identical if their properties (title, description, link etc.)
+ * are identical.
+ * @param other The text input to compare with.
+ * @return Whether the two text inputs are equal.
+ */
+ bool operator==(const TextInput &other) const;
+
+ /**
+ * Convenience method. Simply calls !operator==().
+ * @param other The text input to compared with.
+ * @return Whether the two text inputs are unequal.
+ */
+ bool operator!=(const TextInput &other) const { return !operator==(other); }
+
+ /**
+ * Destructor.
+ */
+ virtual ~TextInput();
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The title (often a label to be used for the input field)
+ * of the text input, or QString::null if no title is available.
+ */
+ QString title() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The description (usually used as a tooltip which appears
+ * if the mouse hovers above the input field for a short time) of
+ * the text input, or QString::null if no description is
+ * available.
+ */
+ QString description() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return The name of the text input (what's this for?) of the
+ * text input, or QString::null, if no name is available.
+ */
+ QString name() const;
+
+ /**
+ * RSS 0.90 and upwards
+ * @return A link to which the contents of the input field should
+ * be sent after the user specified them. This is often a CGI
+ * program on a remote server which evaluates the entered
+ * information. An empty KURL is returned in case no link is
+ * available.
+ * Note that the RSS 0.91 Specification dictates that URLs not
+ * starting with "http://" or "ftp://" are considered invalid.
+ */
+ const KURL &link() const;
+
+ private:
+ struct Private;
+ Private *d;
+ };
+}
+
+#endif // LIBRSS_TEXTINPUT_H
+// vim: noet:ts=4
diff --git a/plugins/rssfeed/rss/tools_p.cpp b/plugins/rssfeed/rss/tools_p.cpp
new file mode 100644
index 0000000..c1ebbc9
--- /dev/null
+++ b/plugins/rssfeed/rss/tools_p.cpp
@@ -0,0 +1,51 @@
+/*
+ * tools_p.cpp
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#include "tools_p.h"
+
+#include <krfcdate.h>
+#include <qdom.h>
+
+time_t RSS::parseISO8601Date(const QString &s)
+{
+ // do some sanity check: 26-12-2004T00:00+00:00 is parsed to epoch+1 in the KRFCDate, which is wrong. So let's check if the date begins with YYYY -fo
+ if (s.stripWhiteSpace().left(4).toInt() < 1000)
+ return 0; // error
+
+ // FIXME: imho this is done in KRFCDate::parseDateISO8601() automatically, so we could omit it? -fo
+ if (s.find('T') != -1)
+ return KRFCDate::parseDateISO8601(s);
+ else
+ return KRFCDate::parseDateISO8601(s + "T12:00:00");
+}
+
+
+QString RSS::extractNode(const QDomNode &parent, const QString &elemName, bool isInlined)
+{
+ QDomNode node = parent.namedItem(elemName);
+ if (node.isNull())
+ return QString::null;
+
+ QString result = node.toElement().text();
+
+ bool hasPre = result.contains("<pre>",false);
+ bool hasHtml = hasPre || result.contains("<"); // FIXME: test if we have html, should be more clever -> regexp
+ if(!isInlined && !hasHtml) // perform nl2br if not a inline elt and it has no html elts
+ result = result = result.replace(QChar('\n'), "<br />");
+ if(!hasPre) // strip white spaces if no <pre>
+ result = result.simplifyWhiteSpace();
+
+ if (result.isEmpty())
+ return QString::null;
+
+ return result;
+}
+
+// vim:noet:ts=4
diff --git a/plugins/rssfeed/rss/tools_p.h b/plugins/rssfeed/rss/tools_p.h
new file mode 100644
index 0000000..5076004
--- /dev/null
+++ b/plugins/rssfeed/rss/tools_p.h
@@ -0,0 +1,34 @@
+/*
+ * tools_p.h
+ *
+ * Copyright (c) 2001, 2002, 2003 Frerich Raabe <raabe@kde.org>
+ *
+ * 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. For licensing and distribution details, check the
+ * accompanying file 'COPYING'.
+ */
+#ifndef LIBRSS_TOOLS_P_H
+#define LIBRSS_TOOLS_P_H
+
+#include <time.h>
+
+class QDomNode;
+class QString;
+
+namespace RSS
+{
+ struct Shared
+ {
+ Shared() : count(1) { }
+ void ref() { count++; }
+ bool deref() { return !--count; }
+ unsigned int count;
+ };
+
+ QString extractNode(const QDomNode &parent, const QString &elemName, bool isInlined=true);
+ time_t parseISO8601Date(const QString &s);
+}
+
+#endif // LIBRSS_TOOLS_P_H
+// vim:noet:ts=4
diff --git a/plugins/rssfeed/rssarticle.cpp b/plugins/rssfeed/rssarticle.cpp
new file mode 100644
index 0000000..afc932d
--- /dev/null
+++ b/plugins/rssfeed/rssarticle.cpp
@@ -0,0 +1,103 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 "rssarticle.h"
+
+namespace kt
+{
+
+ RssArticle::RssArticle( )
+ {
+
+ }
+
+ RssArticle::RssArticle(RSS::Article article)
+ {
+ //these lines generate errors when compiling
+ m_title = article.title();
+ m_link = article.link();
+ m_description = article.description();
+ m_pubDate = article.pubDate();
+ m_guid = article.guid();
+ m_downloaded = 0;
+ }
+
+ RssArticle::RssArticle(const RssArticle &other)
+ {
+ *this = other;
+ }
+
+ RssArticle::RssArticle(QString title, KURL link, QString description, QDateTime pubDate, QString guid, int downloaded)
+ {
+ m_title = title;
+ m_link = link;
+ m_description = description;
+ m_pubDate = pubDate;
+ m_guid = guid;
+ m_downloaded = downloaded;
+ }
+
+ RssArticle &RssArticle::operator=(const RssArticle &other)
+ {
+ if (&other != this)
+ {
+ m_title = other.title();
+ m_link = other.link();
+ m_description = other.description();
+ m_pubDate = other.pubDate();
+ m_guid = other.guid();
+ m_downloaded = other.downloaded();
+ }
+ return *this;
+ }
+
+ bool RssArticle::operator==(const RssArticle &other) const
+ {
+ //let's try just using the guid for now as it should be sufficient
+ //return m_title==other.title() && m_link==other.link() && m_description==other.description() && m_pubDate==other.pubDate();
+ return m_guid==other.guid();
+ }
+
+ QDataStream &operator<<( QDataStream &out, const RssArticle &article )
+ {
+ out << article.title() << article.link() << article.description() << article.pubDate() << article.guid() << article.downloaded();
+
+ return out;
+ }
+
+ QDataStream &operator>>( QDataStream &in, RssArticle &article )
+ {
+ KURL link;
+ QString title;
+ QString description;
+ QDateTime pubDate;
+ QString guid;
+ int downloaded;
+ in >> title >> link >> description >> pubDate >> guid >> downloaded;
+ article = RssArticle(title, link, description, pubDate, guid, downloaded);
+
+ return in;
+ }
+
+ RssArticle::~RssArticle()
+ {
+
+ }
+
+}
diff --git a/plugins/rssfeed/rssarticle.h b/plugins/rssfeed/rssarticle.h
new file mode 100644
index 0000000..4d8c536
--- /dev/null
+++ b/plugins/rssfeed/rssarticle.h
@@ -0,0 +1,82 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 RSSARTICLE_H
+#define RSSARTICLE_H
+
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qdatastream.h>
+
+#include <kurl.h>
+
+#include "rss/article.h"
+
+namespace kt
+{
+ /**
+ * @brief RssFeed Manager Class
+ * @author Alan Jones <skyphyr@gmail.com>
+ *
+ *
+ */
+
+ class RssArticle
+ {
+ public:
+
+ typedef QValueList<RssArticle> List;
+
+ /**
+ * Default constructor.
+ */
+ RssArticle();
+ RssArticle(RSS::Article article);
+ RssArticle(const RssArticle &other);
+ RssArticle &operator=(const RssArticle &other);
+ bool operator==(const RssArticle &other) const;
+ RssArticle(QString title, KURL link, QString description, QDateTime pubDate, QString guid, int downloaded = 0);
+
+ void setTitle(const QString& title) { m_title=title; }
+ void setDownloaded(const int downloaded) { m_downloaded=downloaded; }
+
+ QString title() const { return m_title; }
+ KURL link() const { return m_link; }
+ QString description() const { return m_description; }
+ QDateTime pubDate() const { return m_pubDate; }
+ QString guid() const { return m_guid; }
+ int downloaded() const { return m_downloaded; }
+
+ ~RssArticle();
+
+ private:
+ KURL m_link;
+ QString m_title;
+ QString m_description;
+ QDateTime m_pubDate;
+ QString m_guid;
+ int m_downloaded;
+ };
+
+ QDataStream &operator<<( QDataStream &out, const RssArticle &article );
+ QDataStream &operator>>( QDataStream &in, RssArticle &article );
+
+}
+
+#endif
diff --git a/plugins/rssfeed/rssfeed.cpp b/plugins/rssfeed/rssfeed.cpp
new file mode 100644
index 0000000..0d1244b
--- /dev/null
+++ b/plugins/rssfeed/rssfeed.cpp
@@ -0,0 +1,359 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 "rssfeed.h"
+
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <krfcdate.h>
+#include <kio/netaccess.h>
+#include <qfile.h>
+#include <qapplication.h>
+#include <qdir.h>
+
+namespace kt
+{
+
+ void RssFeed::startFeed()
+ {
+ if (m_active)
+ {
+ refreshFeed();
+ refreshTimer.start(QTime().msecsTo(m_autoRefresh));
+ }
+ else
+ {
+ refreshTimer.stop();
+ }
+ }
+
+ void RssFeed::initialize()
+ {
+ feedLoading = false;
+ loadArticles();
+
+ connect(&refreshTimer, SIGNAL(timeout()), this, SLOT( refreshFeed() ) );
+ connect(this, SIGNAL(articlesChanged(const RssArticle::List&)), this, SLOT( saveArticles() ) );
+
+ startFeed();
+ }
+
+ RssFeed::RssFeed(QObject * parent) : QObject(parent)
+ {
+ m_active = false;
+ m_articleAge = 365;
+ m_ignoreTTL = false;
+ m_title = "New";
+
+ initialize();
+ }
+
+ RssFeed::RssFeed(KURL feedUrl, QString title, bool active, int articleAge, bool ignoreTTL, QTime autoRefresh )
+ {
+ m_feedUrl = feedUrl;
+ m_title = title;
+ m_active = active;
+ m_articleAge = articleAge;
+ m_ignoreTTL = ignoreTTL;
+ m_autoRefresh = autoRefresh;
+
+ initialize();
+ }
+
+ RssFeed::RssFeed(const RssFeed &other) : QObject()
+ {
+ *this = other;
+ }
+
+ RssFeed &RssFeed::operator=(const RssFeed &other)
+ {
+ if (&other != this)
+ {
+ m_feedUrl = other.feedUrl();
+ m_title = other.title();
+ m_active = other.active();
+ m_articleAge = other.articleAge();
+ m_ignoreTTL = other.ignoreTTL();
+ m_autoRefresh = other.autoRefresh();
+ }
+
+ initialize();
+
+ return *this;
+ }
+
+ void RssFeed::setFeedUrl( const KURL& url )
+ {
+ if (m_feedUrl != url)
+ {
+ m_feedUrl = url;
+ loadArticles();
+ startFeed();
+ emit feedUrlChanged(url);
+ }
+ }
+
+ void RssFeed::setFeedUrl( const QString& url )
+ {
+ if (m_feedUrl != url)
+ {
+ m_feedUrl = url;
+ loadArticles();
+ startFeed();
+ emit feedUrlChanged(url);
+ }
+ }
+
+ void RssFeed::setActive( bool active )
+ {
+ if (m_active != active)
+ {
+ m_active = active;
+
+ startFeed();
+
+ emit activeChanged(active);
+ }
+ }
+
+ void RssFeed::setArticleAge( int articleAge )
+ {
+ if (m_articleAge != articleAge)
+ {
+ if (articleAge < m_articleAge)
+ {
+ cleanArticles();
+ }
+
+ m_articleAge = articleAge;
+ emit articleAgeChanged(articleAge);
+ }
+ }
+
+ void RssFeed::setTitle( const QString& title )
+ {
+ if (m_title != title)
+ {
+ m_title = title;
+ emit titleChanged(title);
+ }
+ }
+
+ void RssFeed::setAutoRefresh( const QTime& autoRefresh )
+ {
+ if (m_autoRefresh != autoRefresh)
+ {
+ m_autoRefresh = autoRefresh;
+ if (m_active)
+ {
+ refreshTimer.changeInterval(QTime().msecsTo(m_autoRefresh));
+ }
+
+ emit autoRefreshChanged(autoRefresh);
+ }
+ }
+
+ void RssFeed::setIgnoreTTL( bool ignoreTTL )
+ {
+ if (m_ignoreTTL != ignoreTTL)
+ {
+ m_ignoreTTL = ignoreTTL;
+ emit ignoreTTLChanged(ignoreTTL);
+ }
+ }
+
+ QString RssFeed::getFilename()
+ {
+ QDir directory;
+ directory.mkdir(KGlobal::dirs()->saveLocation("data","ktorrent") + "rssfeeds");
+ return KGlobal::dirs()->saveLocation("data","ktorrent") + "rssfeeds/" + m_feedUrl.prettyURL(-1).replace("/", "_").replace(":", "_") + ".ktr";
+
+ }
+
+ void RssFeed::loadArticles()
+ {
+ QString filename = getFilename();
+
+ //load articles from disk
+ QFile file(filename);
+
+ if (file.exists())
+ {
+ file.open( IO_ReadOnly );
+ QDataStream in(&file);
+
+ in >> m_articles;
+ emit articlesChanged( m_articles );
+ }
+ }
+
+ void RssFeed::saveArticles()
+ {
+ QString filename = getFilename();
+
+ //load articles from disk
+ QFile file(filename);
+
+ file.open( IO_WriteOnly );
+ QDataStream out(&file);
+
+ out << m_articles;
+ }
+
+ void RssFeed::cleanArticles()
+ {
+ bool removed = false;
+
+ RssArticle::List::iterator it;
+ for ( it = m_articles.begin(); it != m_articles.end(); )
+ {
+ if ((*it).pubDate().daysTo(QDateTime::currentDateTime()) > m_articleAge)
+ {
+ it = m_articles.erase(it);
+ removed = true;
+ }
+ else
+ {
+ it++;
+ }
+ }
+
+ if (removed)
+ {
+ emit articlesChanged(m_articles);
+ }
+
+ }
+
+ void RssFeed::clearArticles()
+ {
+ m_articles.clear();
+ }
+
+ void RssFeed::refreshFeed()
+ {
+ if (feedLoading)
+ return;
+
+ feedLoading = true;
+ cleanArticles();
+ Loader * feedLoader = Loader::create();
+ connect( feedLoader, SIGNAL( loadingComplete( Loader *, Document, Status ) ),
+ this, SLOT( feedLoaded( Loader *, Document, Status ) ) );
+ feedLoader->loadFrom( m_feedUrl, new FileRetriever );
+ }
+
+ void RssFeed::feedLoaded(Loader *feedLoader, Document doc, Status status)
+ {
+ feedLoading = false;
+
+ if ( status == Success )
+ {
+ bool added = false;
+
+ if (m_title.isEmpty() || m_title == QString("New"))
+ {
+ setTitle(doc.title());
+ emit updateTitle(doc.title());
+ }
+
+ if (!m_ignoreTTL)
+ {
+ if (doc.ttl() < 0)
+ {
+ setAutoRefresh(QTime().addSecs(3600));
+ }
+ else
+ {
+ setAutoRefresh(QTime().addSecs(doc.ttl() * 60));
+ }
+ }
+
+ RssArticle curArticle;
+
+ for (int i=doc.articles().count()-1; i>=0; i--)
+ {
+ curArticle = doc.articles()[i];
+ if (curArticle.pubDate().daysTo(QDateTime::currentDateTime()) < m_articleAge && !m_articles.contains(curArticle))
+ {
+ m_articles.prepend(curArticle);
+ emit scanRssArticle(curArticle);
+ added = true;
+ }
+ }
+
+ if (added)
+ {
+ emit articlesChanged(m_articles);
+ }
+ } else {
+ qDebug( "There was and error loading the feed\n");
+ }
+
+ disconnect( feedLoader, SIGNAL( loadingComplete( Loader *, Document, Status ) ),
+ this, SLOT( feedLoaded( Loader *, Document, Status ) ) );
+ feedLoader->deleteLater();
+
+ }
+
+ void RssFeed::setDownloaded(QString link, int downloaded)
+ {
+ bool changed = false;
+
+ RssArticle::List::iterator it;
+ for ( it = m_articles.begin(); it != m_articles.end(); it++ )
+ {
+ if ((*it).link().prettyURL() == link)
+ {
+ (*it).setDownloaded( downloaded );
+ changed = true;
+ }
+ }
+
+ if (changed)
+ {
+ emit articlesChanged(m_articles);
+ }
+ }
+
+ QDataStream &operator<<( QDataStream &out, const RssFeed &feed )
+ {
+ out << feed.feedUrl() << feed.title() << int(feed.active()) << feed.articleAge() << int(feed.ignoreTTL()) << feed.autoRefresh();
+
+ return out;
+ }
+
+ QDataStream &operator>>( QDataStream &in, RssFeed &feed )
+ {
+ KURL feedUrl;
+ QString title;
+ int active;
+ int articleAge;
+ int ignoreTTL;
+ QTime autoRefresh;
+ in >> feedUrl >> title >> active >> articleAge >> ignoreTTL >> autoRefresh;
+ feed = RssFeed(feedUrl, title, active, articleAge, ignoreTTL, autoRefresh);
+
+ return in;
+ }
+
+ RssFeed::~RssFeed()
+ {
+ }
+}
diff --git a/plugins/rssfeed/rssfeed.h b/plugins/rssfeed/rssfeed.h
new file mode 100644
index 0000000..9bcd2f7
--- /dev/null
+++ b/plugins/rssfeed/rssfeed.h
@@ -0,0 +1,127 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 RSSFEED_H
+#define RSSFEED_H
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qdatetime.h>
+#include <qvaluelist.h>
+#include <qtimer.h>
+#include <qdatastream.h>
+
+#include <kurl.h>
+
+#include "rss/loader.h"
+#include "rss/document.h"
+
+#include "rssarticle.h"
+
+using namespace RSS;
+
+namespace kt
+{
+ /**
+ * @brief RssFeed Class
+ * @author Alan Jones <skyphyr@gmail.com>
+ *
+ *
+ */
+
+ class RssFeed : public QObject
+ {
+ Q_OBJECT
+ public:
+
+ /**
+ * Default constructor.
+ */
+ RssFeed(QObject * parent = 0);
+ RssFeed(KURL feedUrl, QString title = "", bool active = false, int articleAge = 3, bool ignoreTTL = false, QTime autoRefresh = QTime());
+ RssFeed(const RssFeed &other);
+ RssFeed &operator=(const RssFeed &other);
+ ~RssFeed();
+
+ KURL feedUrl() const { return m_feedUrl; }
+ bool active() const { return m_active; }
+ int articleAge() const { return m_articleAge; }
+ QString title() const { return m_title; }
+ QTime autoRefresh() const { return m_autoRefresh; }
+ bool ignoreTTL() const { return m_ignoreTTL; }
+
+
+ RssArticle::List articles() const { return m_articles; }
+
+
+ public slots:
+ void refreshFeed();
+ void feedLoaded(Loader *feedLoader, Document doc, Status status);
+
+ void clearArticles();
+
+ void setFeedUrl( const KURL& url );
+ void setFeedUrl( const QString& url );
+ void setActive( bool active );
+ void setArticleAge( int articleAge );
+ void setTitle( const QString& title );
+ void setAutoRefresh( const QTime& autoRefresh );
+ void setIgnoreTTL( bool ignoreTTL );
+ void saveArticles();
+
+ void setDownloaded(QString link, int downloaded);
+
+ signals:
+ void feedUrlChanged( const KURL& url );
+ void activeChanged( bool active );
+ void articleAgeChanged( int articleAge );
+ void titleChanged( const QString& title );
+ void updateTitle( const QString& title );
+ void autoRefreshChanged( const QTime& autoRefresh );
+ void ignoreTTLChanged( bool ignoreTTL );
+
+ void articlesChanged( const RssArticle::List& articles );
+
+ void scanRssArticle( RssArticle article );
+
+ private:
+ KURL m_feedUrl;
+ bool m_active;
+ int m_articleAge;
+ QString m_title;
+ QTime m_autoRefresh;
+ bool m_ignoreTTL;
+ RssArticle::List m_articles;
+ QTimer refreshTimer;
+
+ bool feedLoading;
+
+ QString getFilename();
+ void initialize();
+ void startFeed();
+ void cleanArticles();
+ void loadArticles();
+ };
+
+ QDataStream &operator<<( QDataStream &out, const RssFeed &feed );
+ QDataStream &operator>>( QDataStream &in, RssFeed &feed );
+
+}
+
+#endif
diff --git a/plugins/rssfeed/rssfeedmanager.cpp b/plugins/rssfeed/rssfeedmanager.cpp
new file mode 100644
index 0000000..106ca0f
--- /dev/null
+++ b/plugins/rssfeed/rssfeedmanager.cpp
@@ -0,0 +1,1318 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 "rssfeedmanager.h"
+
+#include <kdirlister.h>
+#include <kfileitem.h>
+#include <klocale.h>
+#include <kio/netaccess.h>
+#include <kstandarddirs.h>
+#include <keditlistbox.h>
+// #include <kmimetype.h>
+#include <kmessagebox.h>
+
+#include <qstring.h>
+#include <qobject.h>
+#include <qfile.h>
+#include <qdatetime.h>
+
+#include <qlineedit.h>
+#include <kurlrequester.h>
+#include <qspinbox.h>
+#include <qcheckbox.h>
+#include <qdatetimeedit.h>
+#include <qtable.h>
+#include <qregexp.h>
+#include <qlayout.h>
+
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/constants.h>
+
+#include <interfaces/coreinterface.h>
+
+#include <qapplication.h>
+
+#include "../../libktorrent/torrent/bdecoder.h"
+#include "../../libktorrent/torrent/bnode.h"
+
+#include "rsslinkdownloader.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ RssFeedManager::RssFeedManager(CoreInterface* core, QWidget * parent) : RssFeedWidget(parent)
+ {
+ //Construct the manager
+ m_core = core;
+ currentFeed = -1;
+ currentAcceptFilter = -1;
+ currentRejectFilter = -1;
+
+ feedListSaving = false;
+ filterListSaving = false;
+
+ //get the articles list setup
+ feedArticles->setLeftMargin(0);
+ feedArticles->verticalHeader()->hide();
+ feedArticles->setNumCols(3);
+ feedArticles->setColumnLabels(QStringList() << i18n("Title") << i18n("Description") << i18n("Link"));
+ feedArticles->horizontalHeader()->setStretchEnabled(true, 0);
+ feedArticles->hideColumn(1);
+ feedArticles->hideColumn(2);
+
+ //get the matches list setup
+ filterMatches->setLeftMargin(0);
+ filterMatches->verticalHeader()->hide();
+ filterMatches->setNumCols(4);
+ filterMatches->setColumnLabels(QStringList() << i18n("Season") << i18n("Episode") << i18n("Time") << i18n("Link"));
+ filterMatches->setColumnWidth(0, 60);
+ filterMatches->setColumnWidth(1, 60);
+ filterMatches->setColumnWidth(2, 180);
+ filterMatches->horizontalHeader()->setStretchEnabled(true, 3);
+
+ loadFeedList();
+ loadFilterList();
+
+ //connect the buttons
+ connect(newFeed, SIGNAL(clicked()), this, SLOT(addNewFeed() ) );
+ connect(deleteFeed, SIGNAL(clicked()), this, SLOT(deleteSelectedFeed() ) );
+
+ connect(newAcceptFilter, SIGNAL(clicked()), this, SLOT(addNewAcceptFilter() ) );
+ connect(deleteAcceptFilter, SIGNAL(clicked()), this, SLOT(deleteSelectedAcceptFilter() ) );
+
+ connect(newRejectFilter, SIGNAL(clicked()), this, SLOT(addNewRejectFilter() ) );
+ connect(deleteRejectFilter, SIGNAL(clicked()), this, SLOT(deleteSelectedRejectFilter() ) );
+
+ //connect the changing of the active feed
+ connect(feedlist, SIGNAL(selectionChanged()), this, SLOT(changedActiveFeed()) );
+
+ //connect the changing of the url to enable the refresh button
+ connect(feedUrl, SIGNAL(textChanged(const QString &)), this, SLOT(changedFeedUrl()) );
+
+ //connect the changing of the filters
+ connect(acceptFilterList, SIGNAL(selectionChanged()), this, SLOT(changedActiveAcceptFilter()) );
+ connect(rejectFilterList, SIGNAL(selectionChanged()), this, SLOT(changedActiveRejectFilter()) );
+
+ //connect the selection and downloading of articles
+ connect(feedArticles, SIGNAL(selectionChanged()), this, SLOT(changedArticleSelection()) );
+ connect(downloadArticle, SIGNAL(clicked()), this, SLOT(downloadSelectedArticles()) );
+
+ //connect the selection, downloading and deletion of matches
+ connect(filterMatches, SIGNAL(selectionChanged()), this, SLOT(changedMatchSelection()) );
+ connect(downloadFilterMatch, SIGNAL(clicked()), this, SLOT(downloadSelectedMatches()) );
+ connect(deleteFilterMatch, SIGNAL(clicked()), this, SLOT(deleteSelectedMatches()) );
+
+ //connect the test text update to the slot
+ connect(testText, SIGNAL(textChanged(const QString &)), this, SLOT(testTextChanged()) );
+ connect(testTestText, SIGNAL(clicked()), this, SLOT(testFilter()) );
+
+ changedActiveFeed();
+ changedActiveAcceptFilter();
+
+ }
+
+ RssFeedManager::~RssFeedManager()
+ {
+ //Destruct the manager
+ }
+
+ void RssFeedManager::clearArticles()
+ {
+ int pos = feeds.find((RssFeed *)sender());
+
+ if (pos >= 0)
+ {
+ feeds.at(pos)->clearArticles();
+ if (feedlist->isSelected(pos))
+ {
+ //this feed is active so we should update the display
+ feedArticles->setNumRows(0);
+ }
+ }
+ }
+
+ void RssFeedManager::changedFeedUrl()
+ {
+ refreshFeed->setEnabled(!feedUrl->url().isEmpty());
+ }
+
+ void RssFeedManager::connectFeed(int index)
+ {
+
+ connect(feedTitle, SIGNAL(textChanged(const QString &)), feeds.at(index), SLOT(setTitle(const QString &) ) );
+ connect(feeds.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(setFeedTitle(const QString &) ) );
+
+ //url
+ connect(feedUrl, SIGNAL(textChanged(const QString &)), feeds.at(index), SLOT(setFeedUrl(const QString&) ) );
+ connect(feeds.at(index), SIGNAL(feedUrlChanged(const KURL&)), feedUrl, SLOT(setKURL(const KURL&) ) );
+
+ //articleAge
+ connect(feedArticleAge, SIGNAL(valueChanged(int)), feeds.at(index), SLOT(setArticleAge(int) ) );
+ connect(feeds.at(index), SIGNAL(articleAgeChanged(int)), feedArticleAge, SLOT(setValue(int) ) );
+
+ //active
+ connect(feedActive, SIGNAL(toggled(bool)), feeds.at(index), SLOT(setActive(bool) ) );
+ connect(feeds.at(index), SIGNAL(activeChanged(bool)), feedActive, SLOT(setChecked(bool) ) );
+
+ //autoRefresh
+ connect(feedAutoRefresh, SIGNAL(valueChanged(const QTime&)), feeds.at(index), SLOT(setAutoRefresh(const QTime&) ) );
+ connect(feeds.at(index), SIGNAL(autoRefreshChanged(const QTime&)), feedAutoRefresh, SLOT(setTime(const QTime&) ) );
+
+ //ignoreTTL
+ connect(feedIgnoreTTL, SIGNAL(toggled(bool)), feeds.at(index), SLOT(setIgnoreTTL(bool) ) );
+ connect(feeds.at(index), SIGNAL(ignoreTTLChanged(bool)), feedIgnoreTTL, SLOT(setChecked(bool) ) );
+
+ //articles
+ connect(feeds.at(index), SIGNAL(articlesChanged(const RssArticle::List&)), this, SLOT(updateArticles(const RssArticle::List&) ) );
+
+ //connect the refresh button
+ connect(refreshFeed, SIGNAL(clicked()), feeds.at(index), SLOT(refreshFeed()) );
+ }
+
+ void RssFeedManager::disconnectFeed(int index)
+ {
+ disconnect(feedTitle, SIGNAL(textChanged(const QString &)), feeds.at(index), SLOT(setTitle(const QString &) ) );
+ disconnect(feeds.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(setFeedTitle(const QString &) ) );
+
+ //url
+ disconnect(feedUrl, SIGNAL(textChanged(const QString &)), feeds.at(index), SLOT(setFeedUrl(const QString&) ) );
+ disconnect(feeds.at(index), SIGNAL(feedUrlChanged(const KURL&)), feedUrl, SLOT(setKURL(const KURL&) ) );
+
+ //articleAge
+ disconnect(feedArticleAge, SIGNAL(valueChanged(int)), feeds.at(index), SLOT(setArticleAge(int) ) );
+ disconnect(feeds.at(index), SIGNAL(articleAgeChanged(int)), feedArticleAge, SLOT(setValue(int) ) );
+
+ //active
+ disconnect(feedActive, SIGNAL(toggled(bool)), feeds.at(index), SLOT(setActive(bool) ) );
+ disconnect(feeds.at(index), SIGNAL(activeChanged(bool)), feedActive, SLOT(setChecked(bool) ) );
+
+ //autoRefresh
+ disconnect(feedAutoRefresh, SIGNAL(valueChanged(const QTime&)), feeds.at(index), SLOT(setAutoRefresh(const QTime&) ) );
+ disconnect(feeds.at(index), SIGNAL(autoRefreshChanged(const QTime&)), feedAutoRefresh, SLOT(setTime(const QTime&) ) );
+
+ //ignoreTTL
+ disconnect(feedIgnoreTTL, SIGNAL(toggled(bool)), feeds.at(index), SLOT(setIgnoreTTL(bool) ) );
+ disconnect(feeds.at(index), SIGNAL(ignoreTTLChanged(bool)), feedIgnoreTTL, SLOT(setChecked(bool) ) );
+
+ //articles
+ disconnect(feeds.at(index), SIGNAL(articlesChanged(const RssArticle::List&)), this, SLOT(updateArticles(const RssArticle::List&) ) );
+
+ disconnect(refreshFeed, SIGNAL(clicked()), feeds.at(index), SLOT(refreshFeed()) );
+ }
+
+ void RssFeedManager::connectFilter(int index, bool acceptFilter)
+ {
+ if (acceptFilter)
+ {
+ //title
+ connect(filterTitle, SIGNAL(textChanged(const QString &)), acceptFilters.at(index), SLOT(setTitle(const QString &) ) );
+ connect(acceptFilters.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(setFilterTitle(const QString &) ) );
+ //active
+ connect(filterActive, SIGNAL(toggled(bool)), acceptFilters.at(index), SLOT(setActive(bool) ) );
+ connect(acceptFilters.at(index), SIGNAL(activeChanged(bool)), filterActive, SLOT(setChecked(bool) ) );
+ //regExps
+ connect(filterRegExps, SIGNAL(changed()), this, SLOT(updateRegExps()) );
+ //series
+ connect(filterSeries, SIGNAL(toggled(bool)), acceptFilters.at(index), SLOT(setSeries(bool) ) );
+ connect(acceptFilters.at(index), SIGNAL(seriesChanged(bool)), filterSeries, SLOT(setChecked(bool) ) );
+ //sansEpisode
+ connect(filterSansEpisode, SIGNAL(toggled(bool)), acceptFilters.at(index), SLOT(setSansEpisode(bool) ) );
+ connect(acceptFilters.at(index), SIGNAL(sansEpisodeChanged(bool)), filterSansEpisode, SLOT(setChecked(bool) ) );
+ //minSeason
+ connect(filterMinSeason, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMinSeason(int) ) );
+ connect(acceptFilters.at(index), SIGNAL(minSeasonChanged(int)), filterMinSeason, SLOT(setValue(int) ) );
+ //minEpisode
+ connect(filterMinEpisode, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMinEpisode(int) ) );
+ connect(acceptFilters.at(index), SIGNAL(minEpisodeChanged(int)), filterMinEpisode, SLOT(setValue(int) ) );
+ //maxSeason
+ connect(filterMaxSeason, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMaxSeason(int) ) );
+ connect(acceptFilters.at(index), SIGNAL(maxSeasonChanged(int)), filterMaxSeason, SLOT(setValue(int) ) );
+ //maxEpisode
+ connect(filterMaxEpisode, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMaxEpisode(int) ) );
+ connect(acceptFilters.at(index), SIGNAL(maxEpisodeChanged(int)), filterMaxEpisode, SLOT(setValue(int) ) );
+ //matches
+ connect(acceptFilters.at(index), SIGNAL(matchesChanged(const QValueList<FilterMatch>&)), this, SLOT(updateMatches(const QValueList<FilterMatch>&) ) );
+
+ connect(processFilter, SIGNAL(clicked()), acceptFilters.at(index), SIGNAL(rescanFilter()) );
+
+ }
+ else
+ {
+ //title
+ connect(filterTitle, SIGNAL(textChanged(const QString &)), rejectFilters.at(index), SLOT(setTitle(const QString &) ) );
+ connect(rejectFilters.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(setFilterTitle(const QString &) ) );
+ //active
+ connect(filterActive, SIGNAL(toggled(bool)), rejectFilters.at(index), SLOT(setActive(bool) ) );
+ connect(rejectFilters.at(index), SIGNAL(activeChanged(bool)), filterActive, SLOT(setChecked(bool) ) );
+ //regExps
+ connect(filterRegExps, SIGNAL(changed()), this, SLOT(updateRegExps()) );
+ //series
+ connect(filterSeries, SIGNAL(toggled(bool)), rejectFilters.at(index), SLOT(setSeries(bool) ) );
+ connect(rejectFilters.at(index), SIGNAL(seriesChanged(bool)), filterSeries, SLOT(setChecked(bool) ) );
+ //sansEpisode
+ connect(filterSansEpisode, SIGNAL(toggled(bool)), rejectFilters.at(index), SLOT(setSansEpisode(bool) ) );
+ connect(rejectFilters.at(index), SIGNAL(sansEpisodeChanged(bool)), filterSansEpisode, SLOT(setChecked(bool) ) );
+ //minSeason
+ connect(filterMinSeason, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMinSeason(int) ) );
+ connect(rejectFilters.at(index), SIGNAL(minSeasonChanged(int)), filterMinSeason, SLOT(setValue(int) ) );
+ //minEpisode
+ connect(filterMinEpisode, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMinEpisode(int) ) );
+ connect(rejectFilters.at(index), SIGNAL(minEpisodeChanged(int)), filterMinEpisode, SLOT(setValue(int) ) );
+ //maxSeason
+ connect(filterMaxSeason, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMaxSeason(int) ) );
+ connect(rejectFilters.at(index), SIGNAL(maxSeasonChanged(int)), filterMaxSeason, SLOT(setValue(int) ) );
+ //maxEpisode
+ connect(filterMaxEpisode, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMaxEpisode(int) ) );
+ connect(rejectFilters.at(index), SIGNAL(maxEpisodeChanged(int)), filterMaxEpisode, SLOT(setValue(int) ) );
+ //matches
+ connect(rejectFilters.at(index), SIGNAL(matchesChanged(const QValueList<FilterMatch>&)), this, SLOT(updateMatches(const QValueList<FilterMatch>&) ) );
+
+ connect(processFilter, SIGNAL(clicked()), rejectFilters.at(index), SIGNAL(rescanFilter()) );
+
+ }
+ }
+
+ void RssFeedManager::disconnectFilter(int index, bool acceptFilter)
+ {
+ if (acceptFilter)
+ {
+ //title
+ disconnect(filterTitle, SIGNAL(textChanged(const QString &)), acceptFilters.at(index), SLOT(setTitle(const QString &) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(setFilterTitle(const QString &) ) );
+ //active
+ disconnect(filterActive, SIGNAL(toggled(bool)), acceptFilters.at(index), SLOT(setActive(bool) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(activeChanged(bool)), filterActive, SLOT(setChecked(bool) ) );
+ //regExps
+ disconnect(filterRegExps, SIGNAL(changed()), this, SLOT(updateRegExps()) );
+ //series
+ disconnect(filterSeries, SIGNAL(toggled(bool)), acceptFilters.at(index), SLOT(setSeries(bool) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(seriesChanged(bool)), filterSeries, SLOT(setChecked(bool) ) );
+ //sansEpisode
+ disconnect(filterSansEpisode, SIGNAL(toggled(bool)), acceptFilters.at(index), SLOT(setSansEpisode(bool) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(sansEpisodeChanged(bool)), filterSansEpisode, SLOT(setChecked(bool) ) );
+ //minSeason
+ disconnect(filterMinSeason, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMinSeason(int) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(minSeasonChanged(int)), filterMinSeason, SLOT(setValue(int) ) );
+ //minEpisode
+ disconnect(filterMinEpisode, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMinEpisode(int) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(minEpisodeChanged(int)), filterMinEpisode, SLOT(setValue(int) ) );
+ //maxSeason
+ disconnect(filterMaxSeason, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMaxSeason(int) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(maxSeasonChanged(int)), filterMaxSeason, SLOT(setValue(int) ) );
+ //maxEpisode
+ disconnect(filterMaxEpisode, SIGNAL(valueChanged(int)), acceptFilters.at(index), SLOT(setMaxEpisode(int) ) );
+ disconnect(acceptFilters.at(index), SIGNAL(maxEpisodeChanged(int)), filterMaxEpisode, SLOT(setValue(int) ) );
+ //matches
+ disconnect(acceptFilters.at(index), SIGNAL(matchesChanged(const QValueList<FilterMatch>&)), this, SLOT(updateMatches(const QValueList<FilterMatch>&) ) );
+
+ disconnect(processFilter, SIGNAL(clicked()), acceptFilters.at(index), SIGNAL(rescanFilter()) );
+ }
+ else
+ {
+ //title
+ disconnect(filterTitle, SIGNAL(textChanged(const QString &)), rejectFilters.at(index), SLOT(setTitle(const QString &) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(setFilterTitle(const QString &) ) );
+ //active
+ disconnect(filterActive, SIGNAL(toggled(bool)), rejectFilters.at(index), SLOT(setActive(bool) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(activeChanged(bool)), filterActive, SLOT(setChecked(bool) ) );
+ //regExps
+ disconnect(filterRegExps, SIGNAL(changed()), this, SLOT(updateRegExps()) );
+ //series
+ disconnect(filterSeries, SIGNAL(toggled(bool)), rejectFilters.at(index), SLOT(setSeries(bool) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(seriesChanged(bool)), filterSeries, SLOT(setChecked(bool) ) );
+ //sansEpisode
+ disconnect(filterSansEpisode, SIGNAL(toggled(bool)), rejectFilters.at(index), SLOT(setSansEpisode(bool) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(sansEpisodeChanged(bool)), filterSansEpisode, SLOT(setChecked(bool) ) );
+ //minSeason
+ disconnect(filterMinSeason, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMinSeason(int) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(minSeasonChanged(int)), filterMinSeason, SLOT(setValue(int) ) );
+ //minEpisode
+ disconnect(filterMinEpisode, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMinEpisode(int) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(minEpisodeChanged(int)), filterMinEpisode, SLOT(setValue(int) ) );
+ //maxSeason
+ disconnect(filterMaxSeason, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMaxSeason(int) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(maxSeasonChanged(int)), filterMaxSeason, SLOT(setValue(int) ) );
+ //maxEpisode
+ disconnect(filterMaxEpisode, SIGNAL(valueChanged(int)), rejectFilters.at(index), SLOT(setMaxEpisode(int) ) );
+ disconnect(rejectFilters.at(index), SIGNAL(maxEpisodeChanged(int)), filterMaxEpisode, SLOT(setValue(int) ) );
+ //matches
+ disconnect(rejectFilters.at(index), SIGNAL(matchesChanged(const QValueList<FilterMatch>&)), this, SLOT(updateMatches(const QValueList<FilterMatch>&) ) );
+
+ disconnect(processFilter, SIGNAL(clicked()), rejectFilters.at(index), SIGNAL(rescanFilter()) );
+
+ }
+ }
+
+ void RssFeedManager::addNewFeed(RssFeed feed)
+ {
+ if (feeds.isEmpty())
+ deleteFeed->setEnabled(true);
+
+ feeds.append(new RssFeed(feed));
+
+ int index = feeds.count()-1;
+ feedlist->insertItem(feeds.at(index)->title());
+ feedlist->setCurrentItem(index);
+
+ //update the feed list
+ connect(feeds.at(index), SIGNAL(titleChanged(const QString&)), this, SLOT(updateFeedList()) );
+
+ //clear the articles list when the url is changed
+ connect(feeds.at(index), SIGNAL(feedUrlChanged(const KURL&)), this, SLOT(clearArticles() ) );
+
+ //connect the scanArticle signal to the scanArticle slot
+ connect(feeds.at(index), SIGNAL(scanRssArticle(RssArticle)), this, SLOT(scanArticle(RssArticle) ) );
+
+ //connect all the fields to the save slot
+ //title
+ connect(feeds.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(saveFeedList() ) );
+ //url
+ connect(feeds.at(index), SIGNAL(feedUrlChanged(const KURL&)), this, SLOT(saveFeedList() ) );
+ //articleAge
+ connect(feeds.at(index), SIGNAL(articleAgeChanged(int)), this, SLOT(saveFeedList() ) );
+ //active
+ connect(feeds.at(index), SIGNAL(activeChanged(bool)), this, SLOT(saveFeedList() ) );
+ //autoRefresh
+ connect(feeds.at(index), SIGNAL(autoRefreshChanged(const QTime&)), this, SLOT(saveFeedList() ) );
+ //ignoreTTL
+ connect(feeds.at(index), SIGNAL(ignoreTTLChanged(bool)), this, SLOT(saveFeedList() ) );
+
+ }
+
+ void RssFeedManager::addNewAcceptFilter(RssFilter filter)
+ {
+ if (acceptFilters.isEmpty())
+ deleteAcceptFilter->setEnabled(true);
+
+ acceptFilters.append(new RssFilter(filter));
+
+ int index = acceptFilters.count()-1;
+ acceptFilterList->insertItem(acceptFilters.at(index)->title());
+ acceptFilterList->setCurrentItem(index);
+
+ connect(acceptFilters.at(index), SIGNAL(titleChanged(const QString&)), this, SLOT(updateAcceptFilterList()) );
+
+ //connect all the fields to the save slot
+ //title
+ connect(acceptFilters.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(saveFilterList() ) );
+ //active
+ connect(acceptFilters.at(index), SIGNAL(activeChanged( bool )), this, SLOT(saveFilterList() ) );
+ //regexps
+ connect(acceptFilters.at(index), SIGNAL(regExpsChanged( const QStringList& )), this, SLOT(saveFilterList() ) );
+ //series
+ connect(acceptFilters.at(index), SIGNAL(seriesChanged( bool )), this, SLOT(saveFilterList() ) );
+ //sansEpisode
+ connect(acceptFilters.at(index), SIGNAL(sansEpisodeChanged( bool )), this, SLOT(saveFilterList() ) );
+ //minSeason
+ connect(acceptFilters.at(index), SIGNAL(minSeasonChanged (int )), this, SLOT(saveFilterList() ) );
+ //minEpisode
+ connect(acceptFilters.at(index), SIGNAL(minEpisodeChanged (int )), this, SLOT(saveFilterList() ) );
+ //maxSeason
+ connect(acceptFilters.at(index), SIGNAL(maxSeasonChanged (int )), this, SLOT(saveFilterList() ) );
+ //maxEpiosde
+ connect(acceptFilters.at(index), SIGNAL(maxEpisodeChanged (int )), this, SLOT(saveFilterList() ) );
+ //matches
+ connect(acceptFilters.at(index), SIGNAL(matchesChanged( const QValueList<FilterMatch>& )), this, SLOT(saveFilterList() ) );
+
+ //connect the rescan signal to the rescan slot
+ connect(acceptFilters.at(index), SIGNAL(rescanFilter()), this, SLOT(rescanFilter()) );
+
+// //connect all except the matchesChanged to the rescanFilter slot
+// //title
+// connect(acceptFilters.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(rescanFilter() ) );
+// //active
+// connect(acceptFilters.at(index), SIGNAL(activeChanged( bool )), this, SLOT(rescanFilter() ) );
+// //regexps
+// connect(acceptFilters.at(index), SIGNAL(regExpsChanged( const QStringList& )), this, SLOT(rescanFilter() ) );
+// //series
+// connect(acceptFilters.at(index), SIGNAL(seriesChanged( bool )), this, SLOT(rescanFilter() ) );
+// //sansEpisode
+// connect(acceptFilters.at(index), SIGNAL(sansEpisodeChanged( bool )), this, SLOT(rescanFilter() ) );
+// //minSeason
+// connect(acceptFilters.at(index), SIGNAL(minSeasonChanged (int )), this, SLOT(rescanFilter() ) );
+// //minEpisode
+// connect(acceptFilters.at(index), SIGNAL(minEpisodeChanged (int )), this, SLOT(rescanFilter() ) );
+// //maxSeason
+// connect(acceptFilters.at(index), SIGNAL(maxSeasonChanged (int )), this, SLOT(rescanFilter() ) );
+// //maxEpiosde
+// connect(acceptFilters.at(index), SIGNAL(maxEpisodeChanged (int )), this, SLOT(rescanFilter() ) );
+
+ }
+
+ void RssFeedManager::addNewRejectFilter(RssFilter filter)
+ {
+ if (rejectFilters.isEmpty())
+ deleteRejectFilter->setEnabled(true);
+
+ rejectFilters.append(new RssFilter(filter));
+
+ int index = rejectFilters.count()-1;
+ rejectFilterList->insertItem(rejectFilters.at(index)->title());
+ rejectFilterList->setCurrentItem(index);
+
+ connect(rejectFilters.at(index), SIGNAL(titleChanged(const QString&)), this, SLOT(updateRejectFilterList()) );
+
+ //connect all the fields to the save slot
+ //title
+ connect(rejectFilters.at(index), SIGNAL(titleChanged(const QString &)), this, SLOT(saveFilterList() ) );
+ //active
+ connect(rejectFilters.at(index), SIGNAL(activeChanged( bool )), this, SLOT(saveFilterList() ) );
+ //regexps
+ connect(rejectFilters.at(index), SIGNAL(regExpsChanged( const QStringList& )), this, SLOT(saveFilterList() ) );
+ //series
+ connect(rejectFilters.at(index), SIGNAL(seriesChanged( bool )), this, SLOT(saveFilterList() ) );
+ //sansEpisode
+ connect(rejectFilters.at(index), SIGNAL(sansEpisodeChanged( bool )), this, SLOT(saveFilterList() ) );
+ //minSeason
+ connect(rejectFilters.at(index), SIGNAL(minSeasonChanged (int )), this, SLOT(saveFilterList() ) );
+ //minEpisode
+ connect(rejectFilters.at(index), SIGNAL(minEpisodeChanged (int )), this, SLOT(saveFilterList() ) );
+ //maxSeason
+ connect(rejectFilters.at(index), SIGNAL(maxSeasonChanged (int )), this, SLOT(saveFilterList() ) );
+ //maxEpiosde
+ connect(rejectFilters.at(index), SIGNAL(maxEpisodeChanged (int )), this, SLOT(saveFilterList() ) );
+ //matches
+ connect(rejectFilters.at(index), SIGNAL(matchesChanged( const QValueList<FilterMatch>& )), this, SLOT(saveFilterList() ) );
+
+ }
+
+ void RssFeedManager::deleteSelectedFeed()
+ {
+ int currentItem = feedlist->currentItem();
+
+ if (currentItem < 0)
+ return;
+
+ int newItem=currentItem-1;
+
+ if (currentItem == -1 && feeds.count())
+ newItem = 0;
+
+ disconnectFeed(currentItem);
+ currentFeed = -1;
+
+ delete feeds.at(currentItem);
+ feeds.remove(currentItem);
+ feedlist->removeItem(currentItem);
+
+ if (feeds.isEmpty())
+ deleteFeed->setEnabled(false);
+
+ if (newItem >= 0)
+ {
+ feedlist->setSelected(newItem, true);
+ }
+
+ saveFeedList();
+ }
+
+ void RssFeedManager::deleteSelectedAcceptFilter()
+ {
+ int currentItem = acceptFilterList->currentItem();
+
+ if (currentItem < 0)
+ return;
+
+ int newItem=currentItem-1;
+
+ if (currentItem == -1 && acceptFilters.count())
+ newItem = 0;
+
+ disconnectFilter(currentItem, true);
+ currentAcceptFilter = -1;
+
+ delete acceptFilters.at(currentItem);
+ acceptFilters.remove(currentItem);
+ acceptFilterList->removeItem(currentItem);
+
+ if (acceptFilters.isEmpty())
+ deleteAcceptFilter->setEnabled(false);
+
+ if (newItem >= 0)
+ {
+ acceptFilterList->setSelected(newItem, true);
+ }
+
+ saveFilterList();
+ }
+
+ void RssFeedManager::deleteSelectedRejectFilter()
+ {
+ int currentItem = rejectFilterList->currentItem();
+
+ if (currentItem < 0)
+ return;
+
+ int newItem=currentItem-1;
+
+ if (currentItem == -1 && rejectFilters.count())
+ newItem = 0;
+
+ disconnectFilter(currentItem, false);
+ currentRejectFilter = -1;
+
+ delete rejectFilters.at(currentItem);
+ rejectFilters.remove(currentItem);
+ rejectFilterList->removeItem(currentItem);
+
+ if (rejectFilters.isEmpty())
+ deleteRejectFilter->setEnabled(false);
+
+ if (newItem >= 0)
+ {
+ rejectFilterList->setSelected(newItem, true);
+ }
+
+ saveFilterList();
+ }
+
+ void RssFeedManager::updateRegExps()
+ {
+ if (currentRejectFilter < 0)
+ {
+ //accept filter is active
+ acceptFilters.at(currentAcceptFilter)->setRegExps(filterRegExps->items());
+ }
+ else
+ {
+ //reject filter is active
+ rejectFilters.at(currentRejectFilter)->setRegExps(filterRegExps->items());
+ }
+ }
+
+ void RssFeedManager::updateFeedList(int item)
+ {
+ int cursorPos = feedTitle->cursorPosition();
+ if (item < 0)
+ {
+ //let's check which one sent the signal - if we can't figure it all then update them all
+ int pos = feeds.find((RssFeed *)sender());
+
+ if (pos < 0)
+ {
+ for (int i=0; i<feedlist->count(); i++)
+ {
+ feedlist->changeItem(feeds.at(i)->title(), i);
+ }
+ }
+ else
+ {
+ //just change the feed sending the signal
+ feedlist->changeItem(feeds.at(pos)->title(), pos);
+ if (feedlist->isSelected(pos))
+ {
+ feedTitle->setFocus();
+ }
+ }
+ }
+ else
+ {
+ //just update item
+ feedlist->changeItem(feeds.at(item)->title(), item);
+ }
+ feedTitle->setCursorPosition(cursorPos);
+ }
+
+ void RssFeedManager::updateAcceptFilterList(int item)
+ {
+ int cursorPos = filterTitle->cursorPosition();
+ if (item < 0)
+ {
+ //let's check which one sent the signal - if we can't figure it all then update them all
+ int pos = acceptFilters.find((RssFilter *)sender());
+
+ if (pos < 0)
+ {
+ for (int i=0; i<feedlist->count(); i++)
+ {
+ acceptFilterList->changeItem(acceptFilters.at(i)->title(), i);
+ }
+ }
+ else
+ {
+ //just change the feed sending the signal
+ acceptFilterList->changeItem(acceptFilters.at(pos)->title(), pos);
+ if (acceptFilterList->isSelected(pos))
+ {
+ filterTitle->setFocus();
+ }
+ }
+ }
+ else
+ {
+ //just update item
+ acceptFilterList->changeItem(acceptFilters.at(item)->title(), item);
+ }
+ filterTitle->setCursorPosition(cursorPos);
+ }
+
+ void RssFeedManager::updateRejectFilterList(int item)
+ {
+ int cursorPos = filterTitle->cursorPosition();
+ if (item < 0)
+ {
+ //let's check which one sent the signal - if we can't figure it all then update them all
+ int pos = rejectFilters.find((RssFilter *)sender());
+
+ if (pos < 0)
+ {
+ for (int i=0; i<feedlist->count(); i++)
+ {
+ rejectFilterList->changeItem(rejectFilters.at(i)->title(), i);
+ }
+ }
+ else
+ {
+ //just change the feed sending the signal
+ rejectFilterList->changeItem(rejectFilters.at(pos)->title(), pos);
+ if (rejectFilterList->isSelected(pos))
+ {
+ filterTitle->setFocus();
+ }
+ }
+ }
+ else
+ {
+ //just update item
+ rejectFilterList->changeItem(rejectFilters.at(item)->title(), item);
+ }
+ filterTitle->setCursorPosition(cursorPos);
+ }
+
+ void RssFeedManager::updateArticles(const RssArticle::List& articles)
+ {
+ feedArticles->setNumRows(articles.count());
+ for (int i=0; i<articles.count(); i++)
+ {
+ QString info;
+ if (articles[i].downloaded()==1)
+ {
+ info = ": Manually downloaded";
+ }
+ else if (articles[i].downloaded()==3)
+ {
+ info = ": Automatically downloaded";
+ }
+ feedArticles->setText(i, 0, articles[i].title() + info);
+ feedArticles->setText(i, 1, articles[i].description());
+ feedArticles->setText(i, 2, articles[i].link().prettyURL());
+ }
+ }
+
+ void RssFeedManager::updateMatches(const QValueList<FilterMatch>& matches)
+ {
+ filterMatches->setNumRows(matches.count());
+ for (int i=0; i<matches.count(); i++)
+ {
+ filterMatches->setText(i, 0, QString::number(matches[i].season()));
+ filterMatches->setText(i, 1, QString::number(matches[i].episode()));
+ filterMatches->setText(i, 2, matches[i].time());
+ filterMatches->setText(i, 3, matches[i].link());
+ }
+
+ changedMatchSelection();
+ }
+
+ void RssFeedManager::changedArticleSelection()
+ {
+ bool downloadEnabled = false;
+ for (int i=0; i<feedArticles->numSelections(); i++)
+ {
+ if (feedArticles->selection(i).numRows())
+ {
+ downloadEnabled = true;
+ break;
+ }
+ }
+ downloadArticle->setEnabled(downloadEnabled);
+ }
+
+ void RssFeedManager::changedMatchSelection()
+ {
+ bool downloadEnabled = false;
+ for (int i=0; i<filterMatches->numSelections(); i++)
+ {
+ if (filterMatches->selection(i).numRows())
+ {
+ downloadEnabled = true;
+ break;
+ }
+ }
+ downloadFilterMatch->setEnabled(downloadEnabled);
+ deleteFilterMatch->setEnabled(downloadEnabled);
+ }
+
+ void RssFeedManager::downloadSelectedArticles()
+ {
+ for (int i=0; i<feedArticles->numSelections(); i++)
+ {
+ int endRow = feedArticles->selection(i).topRow() + feedArticles->selection(i).numRows();
+ RssLinkDownloader * curDownload;
+ for (int j=feedArticles->selection(i).topRow(); j<endRow; j++)
+ {
+ curDownload = new RssLinkDownloader(m_core, feedArticles->text(j, 2));
+ for (int i=0; i<feeds.count(); i++)
+ {
+ connect(curDownload, SIGNAL(linkDownloaded( QString, int )), feeds.at(i), SLOT(setDownloaded(QString, int)) );
+ }
+ }
+ }
+ }
+
+ void RssFeedManager::downloadSelectedMatches()
+ {
+ for (int i=0; i<filterMatches->numSelections(); i++)
+ {
+ int endRow = filterMatches->selection(i).topRow() + filterMatches->selection(i).numRows();
+ for (int j=filterMatches->selection(i).topRow(); j<endRow; j++)
+ {
+ new RssLinkDownloader(m_core, filterMatches->text(j, 3));
+ }
+ }
+ }
+
+ void RssFeedManager::deleteSelectedMatches()
+ {
+ QStringList selectedLinks;
+ for (int i=0; i<filterMatches->numSelections(); i++)
+ {
+ int endRow = filterMatches->selection(i).topRow() + filterMatches->selection(i).numRows();
+ for (int j=filterMatches->selection(i).topRow(); j<endRow; j++)
+ {
+ //add a match to the list of selected matches
+ selectedLinks.append(filterMatches->text(j, 3));
+ }
+ }
+
+ RssFilter * curFilter;
+ if (currentRejectFilter<0)
+ {
+ //we're currently testing an acceptFilter
+ curFilter = acceptFilters.at(currentAcceptFilter);
+ }
+ else
+ {
+ //it's a reject filter
+ curFilter = rejectFilters.at(currentRejectFilter);
+ }
+
+ for (int i=0; i<selectedLinks.count(); i++)
+ {
+ curFilter->deleteMatch( selectedLinks[i] );
+ }
+
+ updateMatches(curFilter->matches());
+ }
+
+ void RssFeedManager::changedActiveFeed()
+ {
+ if (currentFeed != feedlist->currentItem() || currentFeed < 0)
+ {
+ //the selection has indeed changed
+ if (currentFeed >= 0)
+ {
+ //disconnect the gui signals from the old feed
+ disconnectFeed(currentFeed);
+ }
+
+ //update the currentFeed
+ currentFeed = feedlist->currentItem();
+ if (currentFeed >= 0)
+ {
+ //set the values
+ //title
+ feedTitle->setText(feeds.at(currentFeed)->title());
+ //url
+ feedUrl->setKURL(feeds.at(currentFeed)->feedUrl());
+ refreshFeed->setEnabled(!feeds.at(currentFeed)->feedUrl().url().isEmpty());
+ //articleAge
+ feedArticleAge->setValue(feeds.at(currentFeed)->articleAge());
+ //active
+ feedActive->setChecked(feeds.at(currentFeed)->active());
+ //autoRefresh
+ feedAutoRefresh->setTime(feeds.at(currentFeed)->autoRefresh());
+ //ignoreTTL
+ feedIgnoreTTL->setChecked(feeds.at(currentFeed)->ignoreTTL());
+ feedAutoRefresh->setEnabled(feeds.at(currentFeed)->ignoreTTL());
+ //articles
+ updateArticles(feeds.at(currentFeed)->articles());
+
+ //title
+ feedTitle->setEnabled(true);
+ //url
+ feedUrl->setEnabled(true);
+ //articleAge
+ feedArticleAge->setEnabled(true);
+ //active
+ feedActive->setEnabled(true);
+ //ignoreTTL
+ feedIgnoreTTL->setEnabled(true);
+
+ //connect all the signals
+ connectFeed(currentFeed);
+ }
+ else
+ {
+ //clear the items
+ //title
+ feedTitle->clear();
+ //url
+ feedUrl->clear();
+ //articleAge
+ feedArticleAge->setValue(0);
+ //active
+ feedActive->setChecked(false);
+ //autoRefresh
+ feedAutoRefresh->setTime(QTime());
+ //ignoreTTL
+ feedIgnoreTTL->setChecked(false);
+ //articles
+ feedArticles->setNumRows(0);
+
+ //title
+ feedTitle->setEnabled(false);
+ //url
+ feedUrl->setEnabled(false);
+ //articleAge
+ feedArticleAge->setEnabled(false);
+ //active
+ feedActive->setEnabled(false);
+ //autoRefresh
+ feedAutoRefresh->setEnabled(false);
+ //ignoreTTL
+ feedIgnoreTTL->setEnabled(false);
+ }
+ }
+ }
+
+ void RssFeedManager::changedActiveAcceptFilter()
+ {
+ if (currentRejectFilter >= 0)
+ {
+ rejectFilterList->setSelected(currentRejectFilter, false);
+ disconnectFilter(currentRejectFilter, false);
+ currentRejectFilter = -1;
+ }
+
+ if (currentAcceptFilter != acceptFilterList->currentItem() || currentAcceptFilter < 0)
+ {
+ //the selection has indeed changed
+
+ if (currentAcceptFilter >= 0)
+ {
+ //disconnect the gui signals from the old feed
+ disconnectFilter(currentAcceptFilter, true);
+
+ }
+
+ //update the currentFeed
+ currentAcceptFilter = acceptFilterList->currentItem();
+
+ if (currentAcceptFilter >= 0)
+ {
+ //set the values
+ filterTitle->setText(acceptFilters.at(currentAcceptFilter)->title());
+ filterActive->setChecked(acceptFilters.at(currentAcceptFilter)->active());
+ filterRegExps->setItems(acceptFilters.at(currentAcceptFilter)->regExps());
+ filterSeries->setChecked(acceptFilters.at(currentAcceptFilter)->series());
+ filterSansEpisode->setChecked(acceptFilters.at(currentAcceptFilter)->sansEpisode());
+ filterMinSeason->setValue(acceptFilters.at(currentAcceptFilter)->minSeason());
+ filterMinEpisode->setValue(acceptFilters.at(currentAcceptFilter)->minEpisode());
+ filterMaxSeason->setValue(acceptFilters.at(currentAcceptFilter)->maxSeason());
+ filterMaxEpisode->setValue(acceptFilters.at(currentAcceptFilter)->maxEpisode());
+
+ updateMatches(acceptFilters.at(currentAcceptFilter)->matches());
+
+ filterTitle->setEnabled(true);
+ filterActive->setEnabled(true);
+ filterRegExps->setEnabled(true);
+ filterSeries->setEnabled(true);
+ filterSansEpisode->setEnabled(true);
+ filterMinSeason->setEnabled(true);
+ filterMinEpisode->setEnabled(true);
+ filterMaxSeason->setEnabled(true);
+ filterMaxEpisode->setEnabled(true);
+
+ processFilter->setEnabled(true);
+ testText->setEnabled(true);
+
+ //connect all the signals
+ connectFilter(currentAcceptFilter, true);
+ }
+ else
+ {
+ if (currentRejectFilter < 0)
+ {
+ //clear the items
+ filterTitle->clear();
+ filterActive->setChecked(false);
+ filterRegExps->clear();
+ filterSeries->setChecked(false);
+ filterSansEpisode->setChecked(false);
+ filterMinSeason->setValue(0);
+ filterMinEpisode->setValue(0);
+ filterMaxSeason->setValue(0);
+ filterMaxEpisode->setValue(0);
+ filterMatches->setNumRows(0);
+
+ filterTitle->setEnabled(false);
+ filterActive->setEnabled(false);
+ filterRegExps->setEnabled(false);
+ filterSeries->setEnabled(false);
+ filterSansEpisode->setEnabled(false);
+ filterMinSeason->setEnabled(false);
+ filterMinEpisode->setEnabled(false);
+ filterMaxSeason->setEnabled(false);
+ filterMaxEpisode->setEnabled(false);
+
+ processFilter->setEnabled(false);
+ testText->setEnabled(false);
+
+ }
+ }
+ }
+ }
+
+ void RssFeedManager::changedActiveRejectFilter()
+ {
+ if (currentAcceptFilter >= 0)
+ {
+ acceptFilterList->setSelected(currentAcceptFilter, false);
+ disconnectFilter(currentAcceptFilter, true);
+ currentAcceptFilter = -1;
+ }
+
+ if (currentRejectFilter != rejectFilterList->currentItem() || currentRejectFilter < 0)
+ {
+ //the selection has indeed changed
+
+ if (currentRejectFilter >= 0)
+ {
+ //disconnect the gui signals from the old feed
+ disconnectFilter(currentRejectFilter, false);
+ }
+
+ //update the currentFeed
+ currentRejectFilter = rejectFilterList->currentItem();
+
+ if (currentRejectFilter >= 0)
+ {
+ //set the values
+ //title
+ filterTitle->setText(rejectFilters.at(currentRejectFilter)->title());
+ filterActive->setChecked(rejectFilters.at(currentRejectFilter)->active());
+ filterRegExps->setItems(rejectFilters.at(currentRejectFilter)->regExps());
+ filterSeries->setChecked(rejectFilters.at(currentRejectFilter)->series());
+ filterSansEpisode->setChecked(rejectFilters.at(currentRejectFilter)->sansEpisode());
+ filterMinSeason->setValue(rejectFilters.at(currentRejectFilter)->minSeason());
+ filterMinEpisode->setValue(rejectFilters.at(currentRejectFilter)->minEpisode());
+ filterMaxSeason->setValue(rejectFilters.at(currentRejectFilter)->maxSeason());
+ filterMaxEpisode->setValue(rejectFilters.at(currentRejectFilter)->maxEpisode());
+
+ updateMatches(rejectFilters.at(currentRejectFilter)->matches());
+
+ filterTitle->setEnabled(true);
+ filterActive->setEnabled(true);
+ filterRegExps->setEnabled(true);
+ filterSeries->setEnabled(true);
+ filterSansEpisode->setEnabled(true);
+ filterMinSeason->setEnabled(true);
+ filterMinEpisode->setEnabled(true);
+ filterMaxSeason->setEnabled(true);
+ filterMaxEpisode->setEnabled(true);
+
+ processFilter->setEnabled(true);
+ testText->setEnabled(true);
+
+ //connect all the signals
+ connectFilter(currentRejectFilter, false);
+ }
+ else
+ {
+ if (currentRejectFilter < 0)
+ {
+ //clear the items
+ filterTitle->clear();
+ filterActive->setChecked(false);
+ filterRegExps->clear();
+ filterSeries->setChecked(false);
+ filterSansEpisode->setChecked(false);
+ filterMinSeason->setValue(0);
+ filterMinEpisode->setValue(0);
+ filterMaxSeason->setValue(0);
+ filterMaxEpisode->setValue(0);
+ filterMatches->setNumRows(0);
+
+ filterTitle->setEnabled(false);
+ filterActive->setEnabled(false);
+ filterRegExps->setEnabled(false);
+ filterSeries->setEnabled(false);
+ filterSansEpisode->setEnabled(false);
+ filterMinSeason->setEnabled(false);
+ filterMinEpisode->setEnabled(false);
+ filterMaxSeason->setEnabled(false);
+ filterMaxEpisode->setEnabled(false);
+
+ processFilter->setEnabled(false);
+ testText->setEnabled(false);
+ }
+ }
+ }
+ }
+
+ QString RssFeedManager::getFeedListFilename()
+ {
+ return KGlobal::dirs()->saveLocation("data","ktorrent") + "rssfeeds.ktr";
+ }
+
+ QString RssFeedManager::getFilterListFilename()
+ {
+ return KGlobal::dirs()->saveLocation("data","ktorrent") + "rssfilters.ktr";
+ }
+
+ void RssFeedManager::saveFeedList()
+ {
+ if (feedListSaving)
+ return;
+
+ feedListSaving = true;
+
+ QString filename = getFeedListFilename();
+
+ //save feeds to disk
+ QFile file(filename);
+
+ file.open( IO_WriteOnly );
+ QDataStream out(&file);
+
+ out << feeds.count();
+
+ for (int i=0; i<feeds.count(); i++)
+ {
+ out << *(feeds.at(i));
+ }
+
+ feedListSaving = false;
+ }
+
+ void RssFeedManager::loadFeedList()
+ {
+ QString filename = getFeedListFilename();
+
+ //load feeds from disk
+ QFile file(filename);
+
+ if (file.exists())
+ {
+ file.open( IO_ReadOnly );
+ QDataStream in(&file);
+
+ int numFeeds;
+
+ in >> numFeeds;
+
+ RssFeed curFeed;
+
+ for (int i=0; i<numFeeds; i++)
+ {
+ in >> curFeed;
+ addNewFeed(curFeed);
+ }
+
+ changedActiveFeed();
+ }
+ }
+
+ void RssFeedManager::saveFilterList()
+ {
+ if (filterListSaving)
+ return;
+
+ filterListSaving = true;
+
+ QString filename = getFilterListFilename();
+
+ //save feeds to disk
+ QFile file(filename);
+
+ file.open( IO_WriteOnly );
+ QDataStream out(&file);
+
+ out << acceptFilters.count();
+
+ for (int i=0; i<acceptFilters.count(); i++)
+ {
+ out << *(acceptFilters.at(i));
+ }
+
+ out << rejectFilters.count();
+
+ for (int i=0; i<rejectFilters.count(); i++)
+ {
+ out << *(rejectFilters.at(i));
+ }
+
+ filterListSaving = false;
+ }
+
+ void RssFeedManager::loadFilterList()
+ {
+ QString filename = getFilterListFilename();
+
+ //load feeds from disk
+ QFile file(filename);
+
+ if (file.exists())
+ {
+ file.open( IO_ReadOnly );
+ QDataStream in(&file);
+
+ int numFilters;
+
+ in >> numFilters;
+
+ RssFilter curFilter;
+
+ for (int i=0; i<numFilters; i++)
+ {
+ in >> curFilter;
+ addNewAcceptFilter(curFilter);
+ }
+
+ in >> numFilters;
+
+ for (int i=0; i<numFilters; i++)
+ {
+ in >> curFilter;
+ addNewRejectFilter(curFilter);
+ }
+
+ //go through and grab the reject filters
+ changedActiveRejectFilter();
+ changedActiveAcceptFilter();
+ }
+ }
+
+ void RssFeedManager::scanArticle(RssArticle article, RssFilter * filter)
+ {
+ //first run it through the reject filters - if any match go no further
+ for (int i=0; i<rejectFilters.count(); i++)
+ {
+ if (rejectFilters.at(i)->scanArticle(article, false))
+ {
+ return;
+ }
+ }
+
+ if (filter)
+ {
+ //we were passed a filter - so just scan it with that one
+ if (filter->scanArticle(article))
+ {
+ RssLinkDownloader * curDownload = new RssLinkDownloader(m_core, article.link().prettyURL(), filter);
+ for (int i=0; i<feeds.count(); i++)
+ {
+ connect(curDownload, SIGNAL(linkDownloaded( QString, int )), feeds.at(i), SLOT(setDownloaded(QString, int)) );
+ }
+ }
+ }
+ else
+ {
+ for (int i=0; i<acceptFilters.count(); i++)
+ {
+ if (acceptFilters.at(i)->scanArticle(article))
+ {
+ RssLinkDownloader * curDownload = new RssLinkDownloader(m_core, article.link().prettyURL(), acceptFilters.at(i));
+ for (int i=0; i<feeds.count(); i++)
+ {
+ connect(curDownload, SIGNAL(linkDownloaded( QString, int )), feeds.at(i), SLOT(setDownloaded(QString, int)) );
+ }
+ }
+ }
+ }
+ }
+
+ void RssFeedManager::rescanFilter()
+ {
+ int pos = acceptFilters.find((RssFilter *)sender());
+
+ if (pos >= 0)
+ {
+ for (int i=0; i<feeds.count(); i++)
+ {
+ for (int j=0; j<feeds.at(i)->articles().count(); j++)
+ {
+ scanArticle(feeds.at(i)->articles()[j], (RssFilter *)sender());
+ }
+ }
+ }
+ }
+
+ void RssFeedManager::testTextChanged()
+ {
+ testText->setPaletteBackgroundColor(QColor(255, 255, 255));
+ testTestText->setEnabled(!testText->text().isEmpty());
+ }
+
+ void RssFeedManager::testFilter()
+ {
+ RssFilter * curFilter;
+ if (currentRejectFilter<0)
+ {
+ //we're currently testing an acceptFilter
+ curFilter = acceptFilters.at(currentAcceptFilter);
+ }
+ else
+ {
+ //it's a reject filter
+ curFilter = rejectFilters.at(currentRejectFilter);
+ }
+
+ RssArticle testArticle;
+ testArticle.setTitle(testText->text());
+
+ if (curFilter->scanArticle(testArticle, false, false))
+ {
+ testText->setPaletteBackgroundColor(QColor(0, 255, 0));
+ }
+ else
+ {
+ testText->setPaletteBackgroundColor(QColor(255, 0, 0));
+ }
+ }
+
+ void RssFeedManager::setFilterTitle(const QString& title)
+ {
+ int cursorPos = filterTitle->cursorPosition();
+ filterTitle->setText(title);
+ filterTitle->setCursorPosition(cursorPos);
+ }
+
+ void RssFeedManager::setFeedTitle(const QString& title)
+ {
+ int cursorPos = feedTitle->cursorPosition();
+ feedTitle->setText(title);
+ feedTitle->setCursorPosition(cursorPos);
+ }
+
+}
diff --git a/plugins/rssfeed/rssfeedmanager.h b/plugins/rssfeed/rssfeedmanager.h
new file mode 100644
index 0000000..1afc766
--- /dev/null
+++ b/plugins/rssfeed/rssfeedmanager.h
@@ -0,0 +1,130 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 RSSFEEDMANAGER_H
+#define RSSFEEDMANAGER_H
+
+#include <kdirlister.h>
+#include <kfileitem.h>
+#include <qstring.h>
+#include <qobject.h>
+#include <qdir.h>
+
+#include <qptrlist.h>
+#include <qwidget.h>
+#include "rssfeedwidget.h"
+
+#include "rssfeed.h"
+#include "rssfilter.h"
+
+namespace kt
+{
+
+ class CoreInterface;
+
+ /**
+ * @brief RssFeed Manager Class
+ * @author Alan Jones <skyphyr@gmail.com>
+ *
+ *
+ */
+ class RssFeedManager : public RssFeedWidget
+ {
+ Q_OBJECT
+ public:
+
+ /**
+ * Default constructor.
+ * @param core Pointer to core interface
+ * @param openSilently Wheather to open torrent silently or nor.
+ */
+ RssFeedManager(CoreInterface* core, QWidget * parent = 0);
+ ~RssFeedManager();
+
+ public slots:
+ void changedActiveFeed();
+ void changedArticleSelection();
+ void changedFeedUrl();
+ void changedMatchSelection();
+ void updateArticles(const RssArticle::List& articles);
+ void downloadSelectedArticles();
+ void downloadSelectedMatches();
+ void deleteSelectedMatches();
+
+ void changedActiveAcceptFilter();
+ void changedActiveRejectFilter();
+
+ void clearArticles();
+
+ void updateFeedList(int item=-1);
+ void addNewFeed(RssFeed feed = RssFeed());
+ void deleteSelectedFeed();
+
+ void updateAcceptFilterList(int item=-1);
+ void addNewAcceptFilter(RssFilter filter = RssFilter());
+ void deleteSelectedAcceptFilter();
+
+ void updateRejectFilterList(int item=-1);
+ void addNewRejectFilter(RssFilter filter = RssFilter());
+ void deleteSelectedRejectFilter();
+
+ void updateRegExps();
+ void updateMatches(const QValueList<FilterMatch>& matches);
+
+ void saveFeedList();
+ void saveFilterList();
+
+ void disconnectFeed(int index);
+ void connectFeed(int index);
+
+ void disconnectFilter(int index, bool acceptFilter);
+ void connectFilter(int index, bool acceptFilter);
+
+ void scanArticle(RssArticle article, RssFilter * filter = NULL);
+ void rescanFilter();
+
+ void testTextChanged();
+ void testFilter();
+
+ void setFilterTitle(const QString& title);
+ void setFeedTitle(const QString& title);
+
+ private:
+ CoreInterface* m_core;
+
+ QPtrList<RssFeed> feeds;
+ int currentFeed;
+
+ QPtrList<RssFilter> acceptFilters;
+ int currentAcceptFilter;
+ QPtrList<RssFilter> rejectFilters;
+ int currentRejectFilter;
+
+ QString getFeedListFilename();
+ void loadFeedList();
+
+ QString getFilterListFilename();
+ void loadFilterList();
+
+ bool feedListSaving;
+ bool filterListSaving;
+
+ };
+}
+#endif
diff --git a/plugins/rssfeed/rssfeedplugin.cpp b/plugins/rssfeed/rssfeedplugin.cpp
new file mode 100644
index 0000000..0d845b7
--- /dev/null
+++ b/plugins/rssfeed/rssfeedplugin.cpp
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+#include <kiconloader.h>
+
+#include <interfaces/coreinterface.h>
+#include <interfaces/guiinterface.h>
+#include <interfaces/plugin.h>
+#include <util/constants.h>
+#include <util/log.h>
+
+#include <qstring.h>
+#include <qfile.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kglobal.h>
+
+#include "rssfeedmanager.h"
+#include "rssfeedplugin.h"
+
+using namespace bt;
+
+K_EXPORT_COMPONENT_FACTORY(ktrssfeedplugin,KGenericFactory<kt::RssFeedPlugin>("rssfeedplugin"))
+
+namespace kt
+{
+ const QString NAME = "RSS Feeds";
+ const QString AUTHOR = "Alan Jones";
+ const QString EMAIL = "skyphyr@gmail.com";
+ const QString DESCRIPTION = i18n("Automatically scans RSS feeds for torrent matching regular expressions and loads them.");
+
+ RssFeedPlugin::RssFeedPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("RSS Feeds"),AUTHOR,EMAIL,DESCRIPTION,"player_playlist")
+ {
+ m_rssFeedManager = 0;
+ }
+
+
+ RssFeedPlugin::~RssFeedPlugin()
+ {
+ }
+
+ void RssFeedPlugin::load()
+ {
+ //add the new tab to the gui
+ KIconLoader* iload = KGlobal::iconLoader();
+ m_rssFeedManager = new RssFeedManager(getCore());
+ getGUI()->addTabPage(
+ m_rssFeedManager,iload->loadIconSet("player_playlist", KIcon::Small),
+ i18n("RSS Feeds"));
+
+ }
+
+ void RssFeedPlugin::unload()
+ {
+ // be sure to remove the page's tab before deleting the widget
+ getGUI()->removeTabPage(m_rssFeedManager);
+ delete m_rssFeedManager;
+ m_rssFeedManager = 0;
+ }
+
+ bool RssFeedPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+
+}
+
diff --git a/plugins/rssfeed/rssfeedplugin.h b/plugins/rssfeed/rssfeedplugin.h
new file mode 100644
index 0000000..4ecc6af
--- /dev/null
+++ b/plugins/rssfeed/rssfeedplugin.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 KTRSSFEEDPLUGIN_H
+#define KTRSSFEEDPLUGIN_H
+
+#include <interfaces/plugin.h>
+
+class QString;
+
+
+namespace kt
+{
+ class RssFeedManager;
+
+ /**
+ * @author Alan Jones <skyphyr@gmail.com>
+ * @brief KTorrent RssFeed plugin
+ * Automatically scans rssfeeds for torrent matching regular expressions and loads them.
+ */
+ class RssFeedPlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ RssFeedPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~RssFeedPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+
+ private:
+ RssFeedManager * m_rssFeedManager;
+
+ };
+
+}
+
+#endif
diff --git a/plugins/rssfeed/rssfeedwidget.ui b/plugins/rssfeed/rssfeedwidget.ui
new file mode 100644
index 0000000..55bd27b
--- /dev/null
+++ b/plugins/rssfeed/rssfeedwidget.ui
@@ -0,0 +1,969 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>RssFeedWidget</class>
+<comment>The display widget for the rssfeed tab</comment>
+<author>Alan Jones</author>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>RssFeedWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>798</width>
+ <height>530</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Rss Feeds</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTabWidget" row="0" column="0">
+ <property name="name">
+ <cstring>tabs</cstring>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>feeds</cstring>
+ </property>
+ <attribute name="title">
+ <string>Feeds</string>
+ </attribute>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSplitter">
+ <property name="name">
+ <cstring>splitter16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>feedlist</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>deleteFeed</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>De&amp;lete</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>newFeed</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>feedLayout</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KURLRequester" row="1" column="1">
+ <property name="name">
+ <cstring>feedUrl</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>feedUrlLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;URL</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>feedUrl</cstring>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>feedBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <property name="title">
+ <string>Articles</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>90</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>downloadArticle</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Download</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QTable" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>feedArticles</cstring>
+ </property>
+ <property name="numRows">
+ <number>0</number>
+ </property>
+ <property name="numCols">
+ <number>0</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>MultiRow</enum>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>feedRefreshTimeLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Auto&amp;refresh</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>feedAutoRefresh</cstring>
+ </property>
+ </widget>
+ <widget class="QTimeEdit">
+ <property name="name">
+ <cstring>feedAutoRefresh</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="time">
+ <time>
+ <hour>0</hour>
+ <minute>30</minute>
+ <second>0</second>
+ </time>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>feedIgnoreTTL</cstring>
+ </property>
+ <property name="text">
+ <string>I&amp;gnore TTL</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>60</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>refreshFeed</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Refresh</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>layout47</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>feedTitleLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Title</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>feedTitle</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>feedTitle</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>feedArticleAgeLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Keep Articles (days)</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>feedArticleAge</cstring>
+ </property>
+ <property name="maxValue">
+ <number>3650</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>feedActive</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Active</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QWidget">
+ <property name="name">
+ <cstring>filters</cstring>
+ </property>
+ <attribute name="title">
+ <string>Filters</string>
+ </attribute>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout28</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox12</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>3</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Accept Filters</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>acceptFilterList</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>deleteAcceptFilter</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>newAcceptFilter</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox13</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Reject Filters</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>rejectFilterList</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="1">
+ <property name="name">
+ <cstring>deleteRejectFilter</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>newRejectFilter</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;New</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>filterTitleLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Title</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>filterTitle</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>filterTitle</cstring>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>filterActive</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Active</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KEditListBox">
+ <property name="name">
+ <cstring>filterRegExps</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>GroupBoxPanel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="title">
+ <string>Regular Expressions</string>
+ </property>
+ <property name="flat">
+ <bool>false</bool>
+ </property>
+ <property name="buttons">
+ <set>Remove|Add</set>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout28</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>filterSeries</cstring>
+ </property>
+ <property name="text">
+ <string>Treat as &amp;Series</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Preferred</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>50</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>processFilter</cstring>
+ </property>
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>60</width>
+ <height>32767</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Process</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>seriesBox</cstring>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32000</width>
+ <height>32000</height>
+ </size>
+ </property>
+ <property name="title">
+ <string>Series Criteria</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>filterSansEpisode</cstring>
+ </property>
+ <property name="text">
+ <string>Match Without Episode</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>filterMinSeason</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>filterMaxEpisodeLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max Episode</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="3">
+ <property name="name">
+ <cstring>filterMinEpisode</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>filterMaxSeason</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>filterMaxSeasonLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max Season</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>filterMinSeason</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>filterMinSeasonLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Min Season</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>filterMinSeason</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="3">
+ <property name="name">
+ <cstring>filterMaxEpisode</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>filterMinEpisodeLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Min Episode</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout33</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>testTextLabel</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Test te&amp;xt</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>testText</cstring>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>testText</cstring>
+ </property>
+ <property name="paletteBackgroundColor">
+ <color>
+ <red>255</red>
+ <green>255</green>
+ <blue>255</blue>
+ </color>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>testTestText</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Te&amp;st</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>filterMatchesBox</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="title">
+ <string>Filter Matches</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QTable">
+ <property name="name">
+ <cstring>filterMatches</cstring>
+ </property>
+ <property name="numRows">
+ <number>0</number>
+ </property>
+ <property name="numCols">
+ <number>0</number>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="selectionMode">
+ <enum>MultiRow</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>downloadFilterMatch</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Download</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>170</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>deleteFilterMatch</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Delete</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>filterSeries</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>seriesBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>feedIgnoreTTL</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>feedAutoRefresh</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="2" margin="2"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>keditlistbox.h</includehint>
+ <includehint>klineedit.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/rssfeed/rssfilter.cpp b/plugins/rssfeed/rssfilter.cpp
new file mode 100644
index 0000000..6cf1f1f
--- /dev/null
+++ b/plugins/rssfeed/rssfilter.cpp
@@ -0,0 +1,423 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 "rssfilter.h"
+
+namespace kt
+{
+
+ FilterMatch::FilterMatch(int season, int episode, QString link, QString time)
+ {
+ m_season = season;
+ m_episode = episode;
+ m_link = link;
+ m_time = time;
+ }
+
+ FilterMatch::FilterMatch(const FilterMatch &other)
+ {
+ *this = other;
+ }
+
+ FilterMatch &FilterMatch::operator=(const FilterMatch &other)
+ {
+ if (&other != this)
+ {
+ m_season = other.season();
+ m_episode = other.episode();
+ m_link = other.link();
+ m_time = other.time();
+ }
+
+ return *this;
+ }
+
+ bool FilterMatch::operator==(const FilterMatch &other) const
+ {
+ return m_link==other.link() && m_season==other.season() && m_episode==other.episode();
+ }
+
+ RssFilter::RssFilter(QObject * parent) : QObject(parent)
+ {
+ m_title = "New";
+ m_active = false;
+ m_series = false;
+ m_sansEpisode = false;
+ m_minSeason = m_minEpisode = m_maxSeason = m_maxEpisode = 0;
+ }
+
+ RssFilter::RssFilter(QString title, bool active, QStringList regExps, bool series, bool sansEpisode,
+ int minSeason, int minEpisode, int maxSeason, int maxEpisode,
+ QValueList<FilterMatch> matches)
+ {
+ m_title = title;
+ m_active = active;
+ m_regExps = regExps;
+ m_series = series;
+ m_sansEpisode = sansEpisode;
+ m_minSeason = minSeason;
+ m_minEpisode = minEpisode;
+ m_maxSeason = maxSeason;
+ m_maxEpisode = maxEpisode;
+ m_matches = matches;
+ }
+
+ RssFilter::RssFilter(const RssFilter &other) : QObject()
+ {
+ *this = other;
+ }
+
+ RssFilter &RssFilter::operator=(const RssFilter &other)
+ {
+ if (&other != this)
+ {
+ m_title = other.title();
+ m_active = other.active();
+ m_regExps = other.regExps();
+ m_series = other.series();
+ m_sansEpisode = other.sansEpisode();
+ m_minSeason = other.minSeason();
+ m_minEpisode = other.minEpisode();
+ m_maxSeason = other.maxSeason();
+ m_maxEpisode = other.maxEpisode();
+ m_matches = other.matches();
+ }
+
+ return *this;
+ }
+
+ void RssFilter::setTitle( const QString& title )
+ {
+ if (m_title != title)
+ {
+ m_title = title;
+ emit titleChanged(title);
+ }
+ }
+
+ void RssFilter::setActive( bool active )
+ {
+ if (m_active != active)
+ {
+ m_active = active;
+
+ emit activeChanged(active);
+ }
+ }
+
+ void RssFilter::setRegExps( const QStringList& regExps )
+ {
+ if (regExps != m_regExps)
+ {
+ m_regExps = regExps;
+
+ emit regExpsChanged(regExps);
+ }
+ }
+
+ void RssFilter::setSeries( bool series )
+ {
+ if (m_series != series)
+ {
+ m_series = series;
+
+ emit seriesChanged(series);
+ }
+ }
+
+ void RssFilter::setSansEpisode( bool sansEpisode )
+ {
+ if (m_sansEpisode != sansEpisode)
+ {
+ m_sansEpisode = sansEpisode;
+
+ emit sansEpisodeChanged(sansEpisode);
+ }
+ }
+
+ void RssFilter::setMinSeason( int minSeason )
+ {
+ if (m_minSeason != minSeason)
+ {
+ m_minSeason = minSeason;
+
+ emit minSeasonChanged(minSeason);
+ }
+ }
+
+ void RssFilter::setMinEpisode( int minEpisode )
+ {
+ if (m_minEpisode != minEpisode)
+ {
+ m_minEpisode = minEpisode;
+
+ emit minEpisodeChanged(minEpisode);
+ }
+ }
+
+ void RssFilter::setMaxSeason( int maxSeason )
+ {
+ if (m_maxSeason != maxSeason)
+ {
+ m_maxSeason = maxSeason;
+
+ emit maxSeasonChanged(maxSeason);
+ }
+ }
+
+ void RssFilter::setMaxEpisode( int maxEpisode )
+ {
+ if (m_maxEpisode != maxEpisode)
+ {
+ m_maxEpisode = maxEpisode;
+
+ emit maxEpisodeChanged(maxEpisode);
+ }
+ }
+
+ void RssFilter::setMatches( const QValueList<FilterMatch>& matches )
+ {
+ if (matches != m_matches)
+ {
+ m_matches = matches;
+
+ emit matchesChanged(matches);
+ }
+ }
+
+ bool RssFilter::episodeInRange(int season, int episode, bool ignoreMatches, bool& alreadyDownloaded)
+ {
+ if (m_minSeason > 0)
+ {
+ if (season < m_minSeason)
+ {
+ return false;
+ }
+ if (season == m_minSeason && m_minEpisode > 0)
+ {
+ if (episode < m_minEpisode)
+ {
+ return false;
+ }
+ }
+ }
+
+ if (m_maxSeason > 0)
+ {
+ if (season > m_maxSeason)
+ {
+ return false;
+ }
+ if (season == m_maxSeason && m_maxEpisode > 0)
+ {
+ if (episode > m_maxEpisode)
+ {
+ return false;
+ }
+ }
+ }
+
+ for (int i=0; i<m_matches.count(); i++)
+ {
+ //if the episode is already in the matches - don't download it
+ if ((*m_matches.at(i)).season() == season &&(*m_matches.at(i)).episode() == episode)
+ {
+ alreadyDownloaded = true;
+ return !ignoreMatches;
+ }
+
+ }
+
+ return true;
+ }
+
+ bool RssFilter::scanArticle( RssArticle article, bool ignoreMatches, bool saveMatch)
+ {
+ if (!m_active && saveMatch)
+ return false;
+
+ QRegExp regEx;
+ regEx.setCaseSensitive(false);
+
+ if (!m_regExps.count())
+ return false;
+
+ for (int i=0; i<m_regExps.count(); i++)
+ {
+ if (m_regExps[i].isEmpty())
+ continue;
+
+ QString curExp = m_regExps[i];
+ bool invert=false;
+
+ if (curExp.startsWith( "!" ))
+ {
+ invert=true;
+ curExp = curExp.remove( 0, 1);
+ }
+
+ regEx.setPattern(curExp);
+
+ if (!invert)
+ {
+ if (!article.title().contains(regEx) && !article.link().prettyURL().contains(regEx) && !article.description().contains(regEx) )
+ {
+ return false;
+ }
+ }
+ else
+ {
+ if (article.title().contains(regEx) || article.link().prettyURL().contains(regEx) || article.description().contains(regEx) )
+ {
+ return false;
+ }
+ }
+ }
+
+ int season = 0, episode = 0;
+ bool alreadyDownloaded = false;
+
+ if (m_series)
+ {
+ QStringList episodeFormats;
+ episodeFormats << "s([0-9]{1,2})[de]([0-9]{1,2})[^0-9]" << "[^0-9]([0-9]{1,2})x([0-9]{1,2})[^0-9]" << "[^0-9]([0-9]{1,2})([0-9]{2})[^0-9]";
+ for (int i=0; i<episodeFormats.count(); i++)
+ {
+ regEx.setPattern(*episodeFormats.at(i));
+ if (regEx.search(article.title()) >= 0)
+ {
+ season = (*regEx.capturedTexts().at(1)).toInt();
+ episode = (*regEx.capturedTexts().at(2)).toInt();
+ if (!episodeInRange(season,episode,ignoreMatches,alreadyDownloaded))
+ {
+ return false;
+ }
+ break;
+ }
+
+ if (regEx.search(article.link().prettyURL()) >= 0)
+ {
+ season = (*regEx.capturedTexts().at(1)).toInt();
+ episode = (*regEx.capturedTexts().at(2)).toInt();
+ if (!episodeInRange(season,episode,ignoreMatches,alreadyDownloaded))
+ {
+ return false;
+ }
+ break;
+ }
+
+ if (regEx.search(article.description()) >= 0)
+ {
+ season = (*regEx.capturedTexts().at(1)).toInt();
+ episode = (*regEx.capturedTexts().at(2)).toInt();
+ if (!episodeInRange(season,episode,ignoreMatches,alreadyDownloaded))
+ {
+ return false;
+ }
+ break;
+ }
+ }
+
+ if (!m_sansEpisode)
+ {
+ if (!season && !episode)
+ {
+ //no episode number was found and we're not downloading matches without episode numbers
+ return false;
+ }
+ }
+ }
+
+ if (!alreadyDownloaded && saveMatch)
+ {
+ FilterMatch newMatch(season, episode, article.link().prettyURL());
+ m_matches.append(newMatch);
+ emit matchesChanged(m_matches);
+ }
+
+ return true;
+ }
+
+ void RssFilter::deleteMatch(const QString& link)
+ {
+
+ QValueList<FilterMatch>::iterator it = m_matches.begin();
+ while (it != m_matches.end())
+ {
+ if ((*it).link() == link)
+ {
+ it = m_matches.remove(it);
+ }
+ else
+ {
+ it++;
+ }
+ }
+
+ }
+
+ QDataStream &operator<<( QDataStream &out, const FilterMatch &filterMatch )
+ {
+ out << filterMatch.season() << filterMatch.episode() << filterMatch.time() << filterMatch.link();
+
+ return out;
+ }
+
+ QDataStream &operator>>( QDataStream &in, FilterMatch &filterMatch )
+ {
+ int season, episode;
+ QString time;
+ QString link;
+ in >> season >> episode >> time >> link;
+ filterMatch = FilterMatch(season, episode, link, time);
+
+ return in;
+ }
+
+ QDataStream &operator<<( QDataStream &out, const RssFilter &filter )
+ {
+ out << filter.title() << int(filter.active()) << filter.regExps() << int(filter.series()) << int(filter.sansEpisode()) << filter.minSeason() << filter.minEpisode() << filter.maxSeason() << filter.maxEpisode() << filter.matches();
+
+ return out;
+ }
+
+ QDataStream &operator>>( QDataStream &in, RssFilter &filter )
+ {
+ QString title;
+ int active;
+ QStringList regExps;
+ int series;
+ int sansEpisode;
+ int minSeason;
+ int minEpisode;
+ int maxSeason;
+ int maxEpisode;
+ QValueList<FilterMatch> matches;
+ in >> title >> active >> regExps >> series >> sansEpisode >> minSeason >> minEpisode >> maxSeason >> maxEpisode >> matches;
+
+ filter = RssFilter(title, active, regExps, series, sansEpisode, minSeason, minEpisode, maxSeason, maxEpisode, matches);
+
+ return in;
+ }
+
+ RssFilter::~RssFilter()
+ {
+ }
+
+}
diff --git a/plugins/rssfeed/rssfilter.h b/plugins/rssfeed/rssfilter.h
new file mode 100644
index 0000000..be31d18
--- /dev/null
+++ b/plugins/rssfeed/rssfilter.h
@@ -0,0 +1,151 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 RSSFILTER_H
+#define RSSFILTER_H
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qtimer.h>
+#include <qdatastream.h>
+#include <qregexp.h>
+
+#include "rssarticle.h"
+
+using namespace RSS;
+
+namespace kt
+{
+ /**
+ * @brief RssFilter Class
+ * @author Alan Jones <skyphyr@gmail.com>
+ *
+ *
+ */
+ class FilterMatch
+ {
+ public:
+
+ FilterMatch() { m_season = 0; m_episode = 0; m_time = QDateTime::currentDateTime().toString(); m_link=QString(); };
+ FilterMatch(int season, int episode, QString link, QString time = QDateTime::currentDateTime().toString());
+ FilterMatch(const FilterMatch &other);
+ FilterMatch &operator=(const FilterMatch &other);
+ bool operator==(const FilterMatch &other) const;
+ ~FilterMatch() {};
+
+ QString link() const { return m_link; }
+ int season() const { return m_season; }
+ int episode() const { return m_episode; }
+ QString time() const { return m_time; }
+
+ void setLink(const QString& link) { m_link = link; }
+ void setSeason(int season) { m_season = season; }
+ void setEpisode(int episode) { m_episode = episode; }
+ void setTime(QString time) { m_time = time; }
+
+ private:
+ int m_season;
+ int m_episode;
+ QString m_link;
+ QString m_time;
+ };
+
+ class RssFilter : public QObject
+ {
+ Q_OBJECT
+ public:
+
+ /**
+ * Default constructor.
+ */
+ RssFilter(QObject * parent = 0);
+ RssFilter(const RssFilter &other);
+ RssFilter(QString title, bool active, QStringList regexps, bool series, bool sansEpisode,
+ int minSeason, int minEpisode, int maxSeason, int maxEpisode,
+ QValueList<FilterMatch> matches);
+ RssFilter &operator=(const RssFilter &other);
+ ~RssFilter();
+
+ QString title() const { return m_title; }
+ bool active() const { return m_active; }
+ QStringList regExps() const { return m_regExps; }
+ bool series() const { return m_series; }
+ bool sansEpisode() const { return m_sansEpisode; }
+ int minSeason() const { return m_minSeason; }
+ int minEpisode() const { return m_minEpisode; }
+ int maxSeason() const { return m_maxSeason; }
+ int maxEpisode() const { return m_maxEpisode; }
+ QValueList<FilterMatch> matches() const { return m_matches; }
+
+ bool scanArticle(RssArticle article, bool ignoreMatches = true, bool saveMatch = true);
+ void deleteMatch(const QString& link);
+
+ public slots:
+ void setTitle( const QString& title );
+ void setActive( bool active );
+ void setRegExps ( const QStringList& regexps );
+ void setSeries ( bool series );
+ void setSansEpisode ( bool sansEpisode );
+ void setMinSeason( int minSeason );
+ void setMinEpisode( int minEpisode );
+ void setMaxSeason( int maxSeason );
+ void setMaxEpisode( int maxEpisode );
+ void setMatches( const QValueList<FilterMatch>& matches );
+
+ //void scanFilter();
+
+ signals:
+ void titleChanged( const QString& title );
+ void activeChanged( bool active );
+ void regExpsChanged( const QStringList& regexps );
+ void seriesChanged( bool series );
+ void sansEpisodeChanged( bool sansEpisode );
+ void minSeasonChanged (int minSeason);
+ void minEpisodeChanged (int minEpisode);
+ void maxSeasonChanged (int maxSeason);
+ void maxEpisodeChanged (int maxEpisode);
+ void matchesChanged( const QValueList<FilterMatch>& matches );
+
+ void rescanFilter();
+
+ private:
+ QString m_title;
+ bool m_active;
+ QStringList m_regExps;
+ bool m_series;
+ bool m_sansEpisode;
+ int m_minSeason;
+ int m_minEpisode;
+ int m_maxSeason;
+ int m_maxEpisode;
+ QValueList<FilterMatch> m_matches;
+
+ bool episodeInRange(int season, int episode, bool ignoreMatches, bool& alreadyDownloaded);
+
+ };
+
+ QDataStream &operator<<( QDataStream &out, const FilterMatch &filterMatch );
+ QDataStream &operator>>( QDataStream &in, FilterMatch &filterMatch );
+
+ QDataStream &operator<<( QDataStream &out, const RssFilter &filter );
+ QDataStream &operator>>( QDataStream &in, RssFilter &filter );
+
+}
+
+#endif
diff --git a/plugins/rssfeed/rsslinkdownloader.cpp b/plugins/rssfeed/rsslinkdownloader.cpp
new file mode 100644
index 0000000..4b0f390
--- /dev/null
+++ b/plugins/rssfeed/rsslinkdownloader.cpp
@@ -0,0 +1,202 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 "rsslinkdownloader.h"
+
+#include <klocale.h>
+#include <kmimetype.h>
+#include <kmessagebox.h>
+
+#include <qfile.h>
+
+#include "../../libktorrent/torrent/bdecoder.h"
+#include "../../libktorrent/torrent/bnode.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ RssLinkDownloader::RssLinkDownloader(CoreInterface* core, QString link, RssFilter * filter, QObject * parent) : QObject (parent)
+ {
+ //tempFile.setAutoDelete(true);
+ m_core = core;
+ firstLink = true;
+ curFilter = filter;
+ if (!KURL(link).isValid())
+ {
+ // no valid URL, so just display an error message
+ KMessageBox::error(0,i18n("Failed to find and download a valid torrent for %1").arg(curLink));
+ QTimer::singleShot(50,this,SLOT(suicide()));
+ }
+ else
+ {
+ //first let's download the link so we can process it to check for the actual torrent
+ curLink = curSubLink = link;
+ curFile = KIO::storedGet(link,false,false);
+ connect(curFile, SIGNAL(result(KIO::Job*)),this,SLOT(processLink( KIO::Job* )));
+ }
+ }
+
+ RssLinkDownloader::~RssLinkDownloader()
+ {
+
+ }
+
+ void RssLinkDownloader::processLink(KIO::Job* jobStatus)
+ {
+
+ if (!jobStatus->error())
+ {
+ //the file downloaded ok - so let's check if it's a torrent
+ KMimeType linkType = *KMimeType::findByContent(curFile->data());
+ if (linkType.is("text/html"))
+ {
+ if (firstLink)
+ {
+ KURL url = curLink;
+ //let's go through the data and populate our sublink array
+ QTextStream html(curFile->data(), IO_ReadOnly);
+
+ //go through a line at a time checking for a torrent
+ QString htmlline = html.readLine();
+ while (!htmlline.isNull())
+ {
+ QRegExp hrefTags = QString("<A.*HREF.*</A");
+ hrefTags.setCaseSensitive(false);
+ hrefTags.setMinimal(true);
+
+ int matchPos = 0;
+ while (htmlline.find(hrefTags, matchPos) >= 0)
+ {
+ matchPos += hrefTags.matchedLength();
+ //we're found an <a href tag - let's check it if contains download
+ QRegExp hrefText = QString("d(own)?load");
+ hrefText.setCaseSensitive(false);
+
+ if (!hrefTags.capturedTexts()[0].contains(hrefText))
+ {
+ //link text doesn't contain dload/download
+ continue;
+ }
+
+ //we're found an <a href tag - now let's the the url out of it
+ hrefText = QString("HREF=\"?([^\">< ]*)[\" ]");
+ hrefText.setCaseSensitive(false);
+
+ hrefTags.capturedTexts()[0].find(hrefText);
+ //lets get the captured
+ QString hrefLink = hrefText.capturedTexts()[1];
+
+ if (hrefLink.startsWith("/"))
+ {
+ hrefLink = url.protocol() + "://" + url.host() + hrefLink;
+ }
+ else if (!hrefLink.startsWith("http://", false))
+ {
+ hrefLink = url.url().left(url.url().findRev("/")+1) + hrefLink;
+ }
+
+ subLinks.append(hrefLink);
+
+ }
+
+ //run the query again
+ htmlline = html.readLine();
+ }
+
+
+ firstLink = false;
+ }
+ }
+ else
+ {
+
+ //I know this may check a file which we've already been told is html, but sometimes it lies
+ try
+ {
+ //last ditched brute force attempt to check if it's a torrent file
+ BNode* node = 0;
+ BDecoder decoder(curFile->data(),false);
+ node = decoder.decode();
+ BDictNode* dict = dynamic_cast<BDictNode*>(node);
+
+ if (dict)
+ {
+ delete node;
+ node = dict = 0;
+
+ if (curFilter)
+ {
+ m_core->loadSilently( curSubLink );
+ emit linkDownloaded( curLink, 3);
+ }
+ else
+ {
+ m_core->load( curSubLink );
+ emit linkDownloaded( curLink, 1);
+ }
+
+ //delete ourself and finish
+ deleteLater();
+ return;
+ }
+
+
+ }
+ catch (...)
+ {
+ //we can just ignore any errors here
+ }
+ }
+
+ }
+ //curFile->deleteLater();
+
+ //check for the next item
+ if (subLinks.isEmpty())
+ {
+ if (curFilter)
+ {
+ //we've failed to download a torrent for this match
+ curFilter->deleteMatch( curLink );
+ }
+ else
+ {
+ //failed to download a selected article from a feed
+ KMessageBox::error(0,i18n("Failed to find and download a valid torrent for %1").arg(curLink));
+ }
+ deleteLater();
+ }
+ else
+ {
+ curSubLink = subLinks.first();
+ subLinks.pop_front();
+ curFile = KIO::storedGet(curSubLink,false,false);
+ connect(curFile, SIGNAL(result(KIO::Job*)),this,SLOT(processLink( KIO::Job* )));
+ }
+ }
+
+
+ void RssLinkDownloader::suicide()
+ {
+ deleteLater();
+ }
+
+} \ No newline at end of file
diff --git a/plugins/rssfeed/rsslinkdownloader.h b/plugins/rssfeed/rsslinkdownloader.h
new file mode 100644
index 0000000..2266f29
--- /dev/null
+++ b/plugins/rssfeed/rsslinkdownloader.h
@@ -0,0 +1,82 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Alan Jones *
+ * skyphyr@gmail.com *
+ * *
+ * 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 RSSLINKDOWNLOADER_H
+#define RSSLINKDOWNLOADER_H
+
+#include <kio/job.h>
+#include <ktempfile.h>
+
+#include <interfaces/coreinterface.h>
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/constants.h>
+
+#include <qstring.h>
+
+#include "rssfilter.h"
+#include "rssarticle.h"
+
+using namespace RSS;
+
+namespace kt
+{
+ /**
+ * @brief RssLinkDownloader Class
+ * @author Alan Jones <skyphyr@gmail.com>
+ *
+ *
+ */
+
+ class RssLinkDownloader : public QObject
+ {
+ Q_OBJECT
+ public:
+
+ /**
+ * Default constructor.
+ */
+ RssLinkDownloader(CoreInterface* core, QString link, RssFilter * filter = 0, QObject * parent = 0);
+
+ ~RssLinkDownloader();
+
+
+ public slots:
+ void processLink(KIO::Job* jobStatus);
+ void suicide();
+
+ signals:
+ void linkDownloaded( QString link, int downloaded );
+
+ private:
+ KIO::StoredTransferJob * curFile;
+ QString curLink, curSubLink;
+ QStringList subLinks;
+ RssFilter * curFilter;
+ bool firstLink;
+
+ //KTempFile tempFile;
+
+ CoreInterface* m_core;
+ };
+
+
+}
+
+#endif
diff --git a/plugins/scanfolder/Makefile.am b/plugins/scanfolder/Makefile.am
new file mode 100644
index 0000000..eb8cc52
--- /dev/null
+++ b/plugins/scanfolder/Makefile.am
@@ -0,0 +1,31 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktscanfolderplugin.la
+
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktscanfolderplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktscanfolderplugin
+# plugins_DATA = ktscanfolderpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+
+rcdir = $(kde_datadir)/ktorrent
+
+kde_kcfg_DATA = ktscanfolderplugin.kcfg
+kde_services_DATA = ktscanfolderplugin.desktop
+
+noinst_HEADERS = scanfolderplugin.h scanfolderprefpage.h \
+ scanfolderprefpagewidget.h scanfolder.h
+ktscanfolderplugin_la_SOURCES = scanfolderplugin.cpp \
+ scanfolderpluginsettings.kcfgc scanfolderprefpage.cpp sfprefwidgetbase.ui scanfolderprefpagewidget.cpp \
+ scanfolder.cpp
+ktscanfolderplugin_la_LIBADD = $(LIB_KPARTS) ../../libktorrent/libktorrent.la \
+ $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/scanfolder/ktscanfolderplugin.desktop b/plugins/scanfolder/ktscanfolderplugin.desktop
new file mode 100644
index 0000000..b6180de
--- /dev/null
+++ b/plugins/scanfolder/ktscanfolderplugin.desktop
@@ -0,0 +1,26 @@
+[Desktop Entry]
+Name=ScanFolderPlugin
+Name[bg]=Приставка за сканиране
+Name[cs]=Modul prohledávání složek
+Name[da]=Plugin for mappesøgning
+Name[de]=Ordner-Durchsuchen-Modul
+Name[el]=Πρόσθετο σάρωσης φακέλων
+Name[et]=Kataloogi uurimise plugin
+Name[it]=Plugin scansione cartella
+Name[nb]=Katalogundersøkingsmdoul
+Name[nds]=Moduul för't Dörkieken vun Ornern
+Name[nl]=Mapscanplugin
+Name[pl]=Wtyczka przeszukiwania katalogów
+Name[pt_BR]=Plugins de Busca
+Name[sk]=ScanFolder Plugin
+Name[sr]=Прикључак прегледа фасцикле
+Name[sr@Latn]=Priključak pregleda fascikle
+Name[sv]=Insticksprogram för katalogsökning
+Name[tr]=Dizin Tarama Eklentisi
+Name[uk]=Втулок сканування тек
+Name[xx]=xxScanFolderPluginxx
+Name[zh_CN]=扫描文件夹插件
+Name[zh_TW]=掃描資料夾外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktscanfolderplugin
diff --git a/plugins/scanfolder/ktscanfolderplugin.kcfg b/plugins/scanfolder/ktscanfolderplugin.kcfg
new file mode 100644
index 0000000..f9b919f
--- /dev/null
+++ b/plugins/scanfolder/ktscanfolderplugin.kcfg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <group name="general">
+ <entry name="useFolder1" type="Bool">
+ <label>Enable scanning of folder1?</label>
+ <default>FALSE</default>
+ </entry>
+
+ <entry name="useFolder2" type="Bool">
+ <label>Enable scanning of folder2?</label>
+ <default>FALSE</default>
+ </entry>
+
+ <entry name="useFolder3" type="Bool">
+ <label>Enable scanning of folder3?</label>
+ <default>FALSE</default>
+ </entry>
+
+ <entry name="folder1" type="String">
+ <label>Folder1 path</label>
+ <default></default>
+ </entry>
+
+ <entry name="folder2" type="String">
+ <label>Folder2 path</label>
+ <default></default>
+ </entry>
+
+ <entry name="folder3" type="String">
+ <label>Folder3 path</label>
+ <default></default>
+ </entry>
+
+ <entry name="openSilently" type="Bool">
+ <label>Whether to open torrent silently or not.</label>
+ <default>FALSE</default>
+ </entry>
+
+ <entry name="actionDelete" type="Bool">
+ <label>Delete action checked.</label>
+ <default>FALSE</default>
+ </entry>
+
+ <entry name="actionMove" type="Bool">
+ <label>Move action checked.</label>
+ <default>FALSE</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/scanfolder/scanfolder.cpp b/plugins/scanfolder/scanfolder.cpp
new file mode 100644
index 0000000..3c30299
--- /dev/null
+++ b/plugins/scanfolder/scanfolder.cpp
@@ -0,0 +1,273 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "scanfolder.h"
+
+#include <kdirlister.h>
+#include <kfileitem.h>
+#include <klocale.h>
+#include <kio/job.h>
+
+#include <qstring.h>
+#include <qobject.h>
+#include <qfile.h>
+#include <qvaluelist.h>
+
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/fileops.h>
+#include <util/functions.h>
+#include <util/constants.h>
+
+#include <torrent/bnode.h>
+#include <torrent/bdecoder.h>
+
+#include <interfaces/coreinterface.h>
+
+using namespace bt;
+
+namespace kt
+{
+
+ ScanFolder::ScanFolder(CoreInterface* core, QString& dir, LoadedTorrentAction action, bool openSilently)
+ : m_core(core), m_dir(0), m_loadedAction(action), m_openSilently(openSilently)
+ {
+ m_dir = new KDirLister();
+
+ if(!m_dir->openURL(dir)) {
+ m_valid = false;
+ return;
+ } else
+ m_valid = true;
+
+ m_dir->setShowingDotFiles(true);
+
+ connect(m_dir, SIGNAL(newItems( const KFileItemList& )), this, SLOT(onNewItems( const KFileItemList& )));
+ connect(m_core, SIGNAL(loadingFinished( const KURL&, bool, bool )), this, SLOT(onLoadingFinished( const KURL&, bool, bool )));
+ connect(&m_incomplePollingTimer,SIGNAL(timeout()),this,SLOT(onIncompletePollingTimeout()));
+ }
+
+
+ ScanFolder::~ScanFolder()
+ {
+// Out() << "UNLOADING SCANFOLDER: " << m_dir->url().path() << endl;
+ delete m_dir;
+ }
+
+ void ScanFolder::onNewItems(const KFileItemList& items)
+ {
+ KFileItemList list = items;
+ KFileItem* file;
+ for(file=list.first(); file; file=list.next())
+ {
+ QString name = file->name();
+ QString dirname = m_dir->url().path();
+ QString filename = dirname + bt::DirSeparator() + name;
+
+ if(!name.endsWith(".torrent"))
+ continue;
+
+ if(name.startsWith("."))
+ {
+ //Check if corresponding torrent exists
+ if(!QFile::exists(m_dir->url().path() + bt::DirSeparator() + name.right(name.length() - 1)) && (m_loadedAction == defaultAction))
+ QFile::remove(filename);
+
+ continue;
+ }
+
+ KURL source;
+ source.setPath(filename);
+
+ //If torrent has it's hidden complement - skip it.
+ if(QFile::exists(dirname + "/." + name))
+ continue;
+
+ if (incomplete(source))
+ {
+ // incomplete file, try this again in 10 seconds
+ bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : incomplete file " << source << endl;
+ m_incompleteURLs.append(source);
+ if (m_incompleteURLs.count() == 1)
+ {
+ // first URL so start the poll timer
+ // lets poll every 10 seconds
+ m_incomplePollingTimer.start(10000,false);
+ }
+ }
+ else
+ {
+ bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : found " << source << endl;
+ //Add pending entry...
+ m_pendingURLs.push_back(source);
+
+ //Load torrent
+ if(m_openSilently)
+ m_core->loadSilently(source);
+ else
+ m_core->load(source);
+ }
+ }
+ }
+
+ void ScanFolder::onLoadingFinished(const KURL & url, bool success, bool canceled)
+ {
+ if(m_pendingURLs.empty() || !success)
+ return;
+
+ //search for entry
+ QValueList<KURL>::iterator it = m_pendingURLs.find(url);
+
+ //if no entry is found than this torrent was not started by this plugin so - quit
+ if(it == m_pendingURLs.end())
+ return;
+
+ //remove this entry
+ m_pendingURLs.erase(it);
+
+ if(canceled)
+ return;
+
+ QString name = url.filename(false);
+ QString dirname = m_dir->url().path();
+ QString filename = dirname + "/" + name;
+ KURL destination(dirname + "/" + i18n("loaded") + "/" + name);
+
+ switch(m_loadedAction) {
+ case deleteAction:
+ //If torrent has it's hidden complement - remove it too.
+ if(QFile::exists(dirname + "/." + name))
+ QFile::remove(dirname + "/." + name);
+ // Out() << "Deleting: " << name.ascii() << endl;
+ QFile::remove(filename);
+ break;
+ case moveAction:
+ // Out() << "Moving: " << name.ascii() << endl;
+ //If torrent has it's hidden complement - remove it too.
+ if(QFile::exists(dirname + "/." + name))
+ QFile::remove(dirname + "/." + name);
+
+ // NetAccess considered harmfull !!!
+ KIO::file_move(url, destination);
+ break;
+ case defaultAction:
+ QFile f(dirname + "/." + name);
+ f.open(IO_WriteOnly);
+ f.close();
+ break;
+ }
+ }
+
+ void ScanFolder::setOpenSilently(bool theValue)
+ {
+ m_openSilently = theValue;
+ }
+
+ void ScanFolder::setLoadedAction(const LoadedTorrentAction& theValue)
+ {
+ m_loadedAction = theValue;
+
+ QDir tmp(m_dir->url().path());
+
+ if( (m_loadedAction == moveAction) && !tmp.exists(i18n("loaded"), false))
+ tmp.mkdir(i18n("loaded"), false);
+ }
+
+ void ScanFolder::setFolderUrl(QString& url)
+ {
+ if(!m_dir->openURL(url)) {
+ m_valid = false;
+ return;
+ } else
+ m_valid = true;
+ }
+
+ bool ScanFolder::incomplete(const KURL & src)
+ {
+ // try to decode file, if it is syntactically correct, we can try to load it
+ QFile fptr(src.path());
+ if (!fptr.open(IO_ReadOnly))
+ return false;
+
+ try
+ {
+ QByteArray data(fptr.size());
+ fptr.readBlock(data.data(),fptr.size());
+ bt::BDecoder dec(data,false);
+ bt::BNode* n = dec.decode();
+ if (n)
+ {
+ // valid node, so file is complete
+ delete n;
+ return false;
+ }
+ else
+ {
+ // decoding failed so incomplete
+ return true;
+ }
+ }
+ catch (...)
+ {
+ // any error means shit happened and the file is incomplete
+ return true;
+ }
+ return false;
+ }
+
+ void ScanFolder::onIncompletePollingTimeout()
+ {
+ bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : checking incomplete files" << endl;
+ for (QValueList<KURL>::iterator i = m_incompleteURLs.begin(); i != m_incompleteURLs.end();)
+ {
+ KURL source = *i;
+ if (!bt::Exists(source.path()))
+ {
+ // doesn't exist anymore, so throw out of list
+ i = m_incompleteURLs.erase(i);
+ }
+ else if (!incomplete(source))
+ {
+ bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : incomplete file " << source << " appears to be completed " << endl;
+ //Add pending entry...
+ m_pendingURLs.push_back(source);
+
+ //Load torrent
+ if(m_openSilently)
+ m_core->loadSilently(source);
+ else
+ m_core->load(source);
+
+ // remove from incomplete list
+ i = m_incompleteURLs.erase(i);
+ }
+ else
+ {
+ bt::Out(SYS_SNF|LOG_NOTICE) << "ScanFolder : still incomplete : " << source << endl;
+ i++;
+ }
+ }
+
+ // stop timer when no incomple URL's are left
+ if (m_incompleteURLs.count() == 0)
+ m_incomplePollingTimer.stop();
+ }
+}
+
+#include "scanfolder.moc"
diff --git a/plugins/scanfolder/scanfolder.h b/plugins/scanfolder/scanfolder.h
new file mode 100644
index 0000000..8e8c27c
--- /dev/null
+++ b/plugins/scanfolder/scanfolder.h
@@ -0,0 +1,111 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 SCANFOLDER_H
+#define SCANFOLDER_H
+
+#include <kdirlister.h>
+#include <kfileitem.h>
+#include <qstring.h>
+#include <qobject.h>
+#include <qdir.h>
+#include <qvaluelist.h>
+#include <qtimer.h>
+#include <kurl.h>
+
+namespace kt
+{
+ ///Action to perform after loading torrent.
+ enum LoadedTorrentAction
+ {
+ deleteAction,
+ moveAction,
+ defaultAction
+ };
+
+ class CoreInterface;
+
+ /**
+ * @brief Scanned folder class.
+ * @author Ivan Vasić <ivasic@gmail.com>
+ *
+ * It will monitor m_dir directory for changes and automatically pass new torrents to core for loading.
+ * After loading, it will perform specified action which can be:
+ * 1. Deleting torrent in question
+ * 2. Moving torrent to 'loaded' subdirectory
+ * 3. Default action (neither 1. nor 2.)
+ * @see LoadedTorrentAction
+ *
+ */
+ class ScanFolder : public QObject
+ {
+ Q_OBJECT
+ public:
+
+ /**
+ * Default constructor.
+ * @param core Pointer to core interface
+ * @param dir Full directory path
+ * @param action Action to perform on loaded torrents.
+ * @param openSilently Wheather to open torrent silently or not.
+ */
+ ScanFolder(CoreInterface* core, QString& dir, LoadedTorrentAction action = defaultAction, bool openSilently = true);
+ ~ScanFolder();
+
+ ///Accessor method for m_openSilently.
+ bool openSilently() const { return m_openSilently; }
+ ///Accessor method for m_openSilently
+ void setOpenSilently(bool theValue);
+
+ ///Accessor method for m_loadedAction.
+ void setLoadedAction(const LoadedTorrentAction& theValue);
+ ///Accessor method for m_loadedAction.
+ LoadedTorrentAction loadedAction() const { return m_loadedAction; }
+
+ ///Returns true if this object is valid, that is - weather directory is valid and this object does its work.
+ bool isValid() const { return m_valid; }
+
+ ///Sets directory path
+ void setFolderUrl(QString& url);
+
+ public slots:
+ void onNewItems(const KFileItemList &items);
+ void onLoadingFinished(const KURL & url,bool success,bool canceled);
+ void onIncompletePollingTimeout();
+
+ private:
+ /// Check if the URL is a complete file
+ bool incomplete(const KURL & src);
+
+ private:
+ CoreInterface* m_core;
+
+ bool m_valid;
+ KDirLister* m_dir;
+
+ LoadedTorrentAction m_loadedAction;
+ bool m_openSilently;
+
+ QValueList<KURL> m_pendingURLs;
+ QValueList<KURL> m_incompleteURLs;
+
+ QTimer m_incomplePollingTimer;
+ };
+}
+#endif
diff --git a/plugins/scanfolder/scanfolderplugin.cpp b/plugins/scanfolder/scanfolderplugin.cpp
new file mode 100644
index 0000000..a994243
--- /dev/null
+++ b/plugins/scanfolder/scanfolderplugin.cpp
@@ -0,0 +1,187 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+
+#include <interfaces/coreinterface.h>
+#include <interfaces/guiinterface.h>
+#include <interfaces/plugin.h>
+#include <util/constants.h>
+#include <util/log.h>
+
+#include <qstring.h>
+#include <qfile.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kglobal.h>
+
+#include "scanfolder.h"
+#include "scanfolderplugin.h"
+#include "scanfolderprefpage.h"
+#include "scanfolderpluginsettings.h"
+
+using namespace bt;
+
+K_EXPORT_COMPONENT_FACTORY(ktscanfolderplugin,KGenericFactory<kt::ScanFolderPlugin>("scanfolderplugin"))
+
+namespace kt
+{
+ const QString NAME = "Scan Folder";
+ const QString AUTHOR = "Ivan Vasic";
+ const QString EMAIL = "ivasic@gmail.com";
+ const QString DESCRIPTION = i18n("Automatically scans directories for torrent files and loads them.");
+
+ ScanFolderPlugin::ScanFolderPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("Scan Folder"),AUTHOR,EMAIL,DESCRIPTION,"view_sidetree")
+ {
+// setXMLFile("ktscanfolderpluginui.rc");
+ m_sf1 = 0;
+ m_sf2 = 0;
+ m_sf3 = 0;
+ }
+
+
+ ScanFolderPlugin::~ScanFolderPlugin()
+ {
+ }
+
+ void ScanFolderPlugin::load()
+ {
+ pref = new ScanFolderPrefPage(this);
+ getGUI()->addPrefPage(pref);
+ updateScanFolders();
+ }
+
+ void ScanFolderPlugin::unload()
+ {
+ getGUI()->removePrefPage(pref);
+ delete pref;
+ pref = 0;
+
+ if(m_sf1)
+ delete m_sf1;
+ m_sf1 = 0;
+
+ if(m_sf2)
+ delete m_sf2;
+ m_sf2 = 0;
+
+ if(m_sf3)
+ delete m_sf3;
+ m_sf3 = 0;
+ }
+
+ void ScanFolderPlugin::updateScanFolders()
+ {
+ QString sfPath1 = ScanFolderPluginSettings::folder1();
+ QString sfPath2 = ScanFolderPluginSettings::folder2();
+ QString sfPath3 = ScanFolderPluginSettings::folder3();
+
+ bool valid1 = QFile::exists(sfPath1);
+ bool valid2 = QFile::exists(sfPath2);
+ bool valid3 = QFile::exists(sfPath3);
+
+ bool usesf1 = ScanFolderPluginSettings::useFolder1() && valid1;
+ bool usesf2 = ScanFolderPluginSettings::useFolder2() && valid2;
+ bool usesf3 = ScanFolderPluginSettings::useFolder3() && valid3;
+
+ bool silently = ScanFolderPluginSettings::openSilently();
+
+ LoadedTorrentAction action;
+
+ if(ScanFolderPluginSettings::actionDelete())
+ action = deleteAction;
+ else if(ScanFolderPluginSettings::actionMove())
+ action = moveAction;
+ else
+ action = defaultAction;
+
+
+ if(usesf1)
+ {
+ if(!m_sf1)
+ m_sf1 = new ScanFolder(getCore(), sfPath1, action, silently);
+ else
+ {
+ m_sf1->setFolderUrl(sfPath1);
+ m_sf1->setLoadedAction(action);
+ m_sf1->setOpenSilently(silently);
+ }
+ }
+ else
+ {
+ if(m_sf1)
+ delete m_sf1;
+ m_sf1 = 0;
+ }
+
+ if(usesf2)
+ {
+ if(!m_sf2)
+ m_sf2 = new ScanFolder(getCore(), sfPath1, action, silently);
+ else
+ {
+ m_sf2->setFolderUrl(sfPath1);
+ m_sf2->setLoadedAction(action);
+ m_sf2->setOpenSilently(silently);
+ }
+ }
+ else
+ {
+ if(m_sf2)
+ delete m_sf2;
+ m_sf2 = 0;
+ }
+
+ if(usesf3)
+ {
+ if(!m_sf3)
+ m_sf3 = new ScanFolder(getCore(), sfPath1, action, silently);
+ else
+ {
+ m_sf3->setFolderUrl(sfPath1);
+ m_sf3->setLoadedAction(action);
+ m_sf3->setOpenSilently(silently);
+ }
+ }
+ else
+ {
+ if(m_sf3)
+ delete m_sf3;
+ m_sf3 = 0;
+ }
+
+ //update config file
+ if(!valid1)
+ ScanFolderPluginSettings::setUseFolder1(false);
+ if(!valid2)
+ ScanFolderPluginSettings::setUseFolder2(false);
+ if(!valid3)
+ ScanFolderPluginSettings::setUseFolder3(false);
+
+ ScanFolderPluginSettings::writeConfig();
+
+ }
+
+ bool ScanFolderPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+}
diff --git a/plugins/scanfolder/scanfolderplugin.h b/plugins/scanfolder/scanfolderplugin.h
new file mode 100644
index 0000000..2ef50c1
--- /dev/null
+++ b/plugins/scanfolder/scanfolderplugin.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTSCANFOLDERPLUGIN_H
+#define KTSCANFOLDERPLUGIN_H
+
+#include <interfaces/plugin.h>
+
+class QString;
+
+
+namespace kt
+{
+ class ScanFolder;
+ class ScanFolderPrefPage;
+
+ /**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief KTorrent ScanFolder plugin
+ * Automatically scans selected folder for torrent files and loads them.
+ */
+ class ScanFolderPlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ ScanFolderPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~ScanFolderPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+
+ void updateScanFolders();
+
+ private:
+ ScanFolder* m_sf1;
+ ScanFolder* m_sf2;
+ ScanFolder* m_sf3;
+
+ ScanFolderPrefPage* pref;
+ };
+
+}
+
+#endif
diff --git a/plugins/scanfolder/scanfolderpluginsettings.kcfgc b/plugins/scanfolder/scanfolderpluginsettings.kcfgc
new file mode 100644
index 0000000..af1ebbc
--- /dev/null
+++ b/plugins/scanfolder/scanfolderpluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktscanfolderplugin.kcfg
+ClassName=ScanFolderPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables \ No newline at end of file
diff --git a/plugins/scanfolder/scanfolderprefpage.cpp b/plugins/scanfolder/scanfolderprefpage.cpp
new file mode 100644
index 0000000..9abbf0d
--- /dev/null
+++ b/plugins/scanfolder/scanfolderprefpage.cpp
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "scanfolderplugin.h"
+#include "scanfolderprefpage.h"
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+
+
+
+namespace kt
+{
+
+ ScanFolderPrefPage::ScanFolderPrefPage(ScanFolderPlugin* plugin)
+ : PrefPageInterface(i18n("ScanFolder"), i18n("ScanFolder Options"),
+ KGlobal::iconLoader()->loadIcon("view_sidetree",KIcon::NoGroup)), m_plugin(plugin)
+ {}
+
+
+ ScanFolderPrefPage::~ScanFolderPrefPage()
+ {}
+
+ bool ScanFolderPrefPage::apply()
+ {
+ if(m_widget)
+ m_widget->apply();
+
+ m_plugin->updateScanFolders();
+
+ return true;
+ }
+
+ void ScanFolderPrefPage::createWidget(QWidget* parent)
+ {
+ m_widget = new ScanFolderPrefPageWidget(parent);
+ }
+
+ void ScanFolderPrefPage::updateData()
+ {
+ }
+
+ void ScanFolderPrefPage::deleteWidget()
+ {
+ delete m_widget;
+ }
+
+}
diff --git a/plugins/scanfolder/scanfolderprefpage.h b/plugins/scanfolder/scanfolderprefpage.h
new file mode 100644
index 0000000..539a5fe
--- /dev/null
+++ b/plugins/scanfolder/scanfolderprefpage.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTSCANFOLDERPREFPAGE_H
+#define KTSCANFOLDERPREFPAGE_H
+
+#include <interfaces/prefpageinterface.h>
+
+#include "scanfolderplugin.h"
+#include "scanfolderprefpagewidget.h"
+
+namespace kt
+{
+
+ /**
+ * ScanFolder plugin preferences page
+ * @author Ivan Vasić <ivasic@gmail.com>
+ */
+ class ScanFolderPrefPage : public PrefPageInterface
+ {
+ public:
+ ScanFolderPrefPage(ScanFolderPlugin* plugin);
+ virtual ~ScanFolderPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void updateData();
+ virtual void deleteWidget();
+
+ private:
+ ScanFolderPlugin* m_plugin;
+ ScanFolderPrefPageWidget* m_widget;
+ };
+
+}
+
+#endif
diff --git a/plugins/scanfolder/scanfolderprefpagewidget.cpp b/plugins/scanfolder/scanfolderprefpagewidget.cpp
new file mode 100644
index 0000000..b577a88
--- /dev/null
+++ b/plugins/scanfolder/scanfolderprefpagewidget.cpp
@@ -0,0 +1,107 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "scanfolderprefpagewidget.h"
+#include "scanfolderpluginsettings.h"
+
+#include <qwidget.h>
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qfile.h>
+
+#include <kglobal.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kurlrequester.h>
+
+namespace kt
+{
+ ScanFolderPrefPageWidget::ScanFolderPrefPageWidget(QWidget *parent, const char *name)
+ :SfPrefPageWidgetBase(parent, name)
+ {
+ use1->setChecked(ScanFolderPluginSettings::useFolder1());
+ use2->setChecked(ScanFolderPluginSettings::useFolder2());
+ use3->setChecked(ScanFolderPluginSettings::useFolder3());
+
+ url1->setURL(ScanFolderPluginSettings::folder1());
+ url2->setURL(ScanFolderPluginSettings::folder2());
+ url3->setURL(ScanFolderPluginSettings::folder3());
+
+ openSilently->setChecked(ScanFolderPluginSettings::openSilently());
+ deleteCheck->setChecked(ScanFolderPluginSettings::actionDelete());
+ moveCheck->setChecked(ScanFolderPluginSettings::actionMove());
+
+ url1->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly);
+ url2->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly);
+ url3->setMode(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly);
+ }
+
+ void ScanFolderPrefPageWidget::apply()
+ {
+ bool usesf1 = use1->isChecked();
+ bool usesf2 = use2->isChecked();
+ bool usesf3 = use3->isChecked();
+
+ QString sfPath1 = url1->url();
+ QString sfPath2 = url2->url();
+ QString sfPath3 = url3->url();
+
+ bool silently = openSilently->isChecked();
+ bool deleteChecked = deleteCheck->isChecked();
+ bool moveChecked = moveCheck->isChecked();
+
+ ScanFolderPluginSettings::setOpenSilently(silently);
+ ScanFolderPluginSettings::setActionDelete(deleteChecked);
+ ScanFolderPluginSettings::setActionMove(moveChecked);
+
+ QString message = i18n( "ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a valid directory." );
+ if(!QFile::exists(sfPath1) && usesf1)
+ {
+ KMessageBox::sorry(0, message.arg( 1 ) );
+ usesf1 = false;
+ }
+ else
+ ScanFolderPluginSettings::setFolder1(sfPath1);
+
+ if(!QFile::exists(sfPath2) && usesf2)
+ {
+ KMessageBox::sorry(0, message.arg( 2 ) );
+ usesf2 = false;
+ }
+ else
+ ScanFolderPluginSettings::setFolder2(sfPath2);
+
+ if(!QFile::exists(sfPath3) && usesf3)
+ {
+ KMessageBox::sorry(0, message.arg( 3 ) );
+ usesf3 = false;
+ }
+ else
+ ScanFolderPluginSettings::setFolder3(sfPath3);
+
+
+ ScanFolderPluginSettings::setUseFolder1(usesf1);
+ ScanFolderPluginSettings::setUseFolder2(usesf2);
+ ScanFolderPluginSettings::setUseFolder3(usesf3);
+
+ ScanFolderPluginSettings::writeConfig();
+ }
+
+}
+#include "scanfolderprefpagewidget.moc"
diff --git a/plugins/scanfolder/scanfolderprefpagewidget.h b/plugins/scanfolder/scanfolderprefpagewidget.h
new file mode 100644
index 0000000..480b3b0
--- /dev/null
+++ b/plugins/scanfolder/scanfolderprefpagewidget.h
@@ -0,0 +1,36 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 SCANFOLDERPREFPAGEWIDGET_H
+#define SCANFOLDERPREFPAGEWIDGET_H
+
+#include "sfprefwidgetbase.h"
+
+namespace kt
+{
+ class ScanFolderPrefPageWidget: public SfPrefPageWidgetBase
+ {
+ Q_OBJECT
+ public:
+ ScanFolderPrefPageWidget(QWidget *parent = 0, const char *name = 0);
+
+ void apply();
+ };
+}
+#endif
diff --git a/plugins/scanfolder/sfprefwidgetbase.ui b/plugins/scanfolder/sfprefwidgetbase.ui
new file mode 100644
index 0000000..8b2c83a
--- /dev/null
+++ b/plugins/scanfolder/sfprefwidgetbase.ui
@@ -0,0 +1,272 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SfPrefPageWidgetBase</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SfPrefPageWidgetBase</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>546</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>ScanFolder Preferences</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>use1</cstring>
+ </property>
+ <property name="text">
+ <string>Scan folder &amp;1</string>
+ </property>
+ <property name="accel">
+ <string>Alt+1</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>use2</cstring>
+ </property>
+ <property name="text">
+ <string>Scan folder &amp;2</string>
+ </property>
+ <property name="accel">
+ <string>Alt+2</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>use3</cstring>
+ </property>
+ <property name="text">
+ <string>Scan folder &amp;3</string>
+ </property>
+ <property name="accel">
+ <string>Alt+3</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QButtonGroup" row="3" column="0">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>moveCheck</cstring>
+ </property>
+ <property name="text">
+ <string>Move to "loaded" directory &amp;after loading</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Move torrent to "loaded" directory after loading it</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>openSilently</cstring>
+ </property>
+ <property name="text">
+ <string>Open torrents silentl&amp;y</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Do not show 'Select files to download' dialog</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>deleteCheck</cstring>
+ </property>
+ <property name="text">
+ <string>Delete after loadin&amp;g</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Deletes torrent after loading</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox" row="2" column="0">
+ <property name="name">
+ <cstring>groupBox9</cstring>
+ </property>
+ <property name="title">
+ <string>Folders to scan</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KURLRequester" row="0" column="1">
+ <property name="name">
+ <cstring>url1</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="1" column="1">
+ <property name="name">
+ <cstring>url2</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="KURLRequester" row="2" column="1">
+ <property name="name">
+ <cstring>url3</cstring>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Folder 1:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kURLRequester1</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Folder 2:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kURLRequester4</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Folder 3:</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>kURLRequester5</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer row="1" column="0">
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Fixed</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="4" column="0">
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>90</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>use1</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>url1</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>use2</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>url2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>use3</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>url3</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>deleteCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>moveCheck</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>moveCheck</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>deleteCheck</receiver>
+ <slot>setDisabled(bool)</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>use1</tabstop>
+ <tabstop>use2</tabstop>
+ <tabstop>use3</tabstop>
+ <tabstop>url1</tabstop>
+ <tabstop>url2</tabstop>
+ <tabstop>url3</tabstop>
+ <tabstop>openSilently</tabstop>
+ <tabstop>deleteCheck</tabstop>
+ <tabstop>moveCheck</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/scheduler/Makefile.am b/plugins/scheduler/Makefile.am
new file mode 100644
index 0000000..b2c9760
--- /dev/null
+++ b/plugins/scheduler/Makefile.am
@@ -0,0 +1,36 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktschedulerplugin.la
+noinst_HEADERS = schedulerplugin.h bwscheduler.h schedulerprefpagewidget.h \
+ bwsprefpagewidget.h bwswidget.h schedulerprefpage.h
+ktschedulerplugin_la_SOURCES = schedulerplugin.cpp \
+ schedulerpluginsettings.kcfgc bwscheduler.cpp schedulerprefpagewidget.cpp schedulerpage.ui bwspage.ui \
+ bwsprefpagewidget.cpp bwswidget.cpp schedulerprefpage.cpp
+
+# Libs needed by the plugin
+ktschedulerplugin_la_LIBADD = $(LIB_KHTML) $(LIB_KPARTS) \
+ ../../libktorrent/libktorrent.la \
+ $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktschedulerplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktschedulerplugin
+# plugins_DATA = ktschedulerpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktschedulerplugin.desktop
+
+kde_kcfg_DATA = ktschedulerplugin.kcfg
+
+kticonsdir = $(kde_datadir)/ktorrent/icons
+
+kticons_DATA = cell-a-0000.png cell-a-0001.png cell-a-0002.png cell-a-0003.png\
+ cell-a-0004.png cell-b-0000.png cell-b-0001.png cell-b-0002.png\
+ cell-b-0003.png cell-b-0004.png
+rcdir = $(kde_datadir)/ktorrent
+rc_DATA = ktschedulerpluginui.rc
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/scheduler/bwscheduler.cpp b/plugins/scheduler/bwscheduler.cpp
new file mode 100644
index 0000000..56375b5
--- /dev/null
+++ b/plugins/scheduler/bwscheduler.cpp
@@ -0,0 +1,282 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "bwscheduler.h"
+#include "schedulerpluginsettings.h"
+
+#include <torrent/globals.h>
+#include <torrent/queuemanager.h>
+
+#include <interfaces/coreinterface.h>
+#include <interfaces/torrentinterface.h>
+
+#include <net/socketmonitor.h>
+
+#include <util/constants.h>
+#include <util/log.h>
+
+#include <qdatetime.h>
+#include <qfile.h>
+#include <qptrlist.h>
+
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+using namespace bt;
+
+namespace kt
+{
+ // ****** BWS *----------------------------------------------------------------------
+ BWS::BWS()
+ {
+ m_schedule = new ScheduleCategory*[7];
+ for(int i=0; i<7; ++i)
+ m_schedule[i] = new ScheduleCategory[24];
+
+ reset();
+ }
+
+ BWS& kt::BWS::operator=(const BWS& b)
+ {
+ for(int i=0; i<7; ++i)
+ for(int j=0; j<24; ++j)
+ m_schedule[i][j] = b.m_schedule[i][j];
+
+ for(int i=0; i<3; ++i)
+ {
+ download[i] = b.download[i];
+ upload[i] = b.upload[i];
+ }
+
+ return *this;
+ }
+
+ int BWS::getDownload(int cat)
+ {
+ return download[cat];
+ }
+
+ int BWS::getUpload(int cat)
+ {
+ return upload[cat];
+ }
+
+ void BWS::setDownload(int cat, int val)
+ {
+ download[cat] = val;
+ }
+
+ void BWS::setUpload(int cat, int val)
+ {
+ upload[cat] = val;
+ }
+
+ void BWS::setCategory(int day, int hour, ScheduleCategory val)
+ {
+ m_schedule[day][hour] = val;
+ }
+
+ ScheduleCategory BWS::getCategory(int day, int hour)
+ {
+ return m_schedule[day][hour];
+ }
+
+ void BWS::reset()
+ {
+ for(int i=0; i<7; ++i)
+ for(int j=0; j<24; ++j)
+ m_schedule[i][j] = CAT_NORMAL;
+
+ for(int i=0; i<3; ++i)
+ {
+ download[i] = 0;
+ upload[i] = 0;
+ }
+ }
+
+ BWS::~BWS()
+ {
+ for(int i=0; i<7; ++i)
+ delete [] m_schedule[i];
+
+ delete [] m_schedule;
+ }
+
+ void BWS::debug()
+ {
+ for(int i=0; i<7; ++i)
+ {
+ Log & lg = Out();
+ for(int j=0; j<24; ++j)
+ lg << m_schedule[i][j];
+ lg << endl;
+ }
+ }
+
+ // ---- BWScheduler --------------------------------------------------------------------
+
+ BWScheduler::BWScheduler()
+ : m_core(0)
+ {
+ m_enabled = SchedulerPluginSettings::enableBWS();
+ loadSchedule();
+ }
+
+ BWScheduler::~BWScheduler()
+ {
+ }
+
+ void BWScheduler::setSchedule(const BWS& sch)
+ {
+ Out(SYS_SCD|LOG_NOTICE) << "BWS: Setting new schedule..." << endl;
+ m_schedule = sch;
+ saveSchedule();
+ trigger();
+ }
+
+ void BWScheduler::setCoreInterface(CoreInterface* core)
+ {
+ m_core = core;
+ }
+
+ void BWScheduler::trigger()
+ {
+ if(!m_enabled)
+ return;
+
+ QDateTime now = QDateTime::currentDateTime();
+
+ QString prefix = QString("BWS: %1 :: ").arg(now.toString());
+
+ int t1 = now.date().dayOfWeek();
+ int t2 = now.time().hour();
+ ScheduleCategory sch = m_schedule.getCategory(t1-1, t2);
+
+ switch(sch)
+ {
+ case CAT_NORMAL:
+ Out(SYS_SCD|LOG_NOTICE) << prefix << "Switching to NORMAL category" << endl;
+ Out(SYS_SCD|LOG_NOTICE) << prefix << QString("%1 Up, %2 Down")
+ .arg(m_core->getMaxUploadSpeed()).arg(m_core->getMaxDownloadSpeed()) << endl;
+ if(!m_core)
+ break;
+ m_core->setPausedState(false);
+ net::SocketMonitor::setDownloadCap(1024 * m_core->getMaxDownloadSpeed());
+ net::SocketMonitor::setUploadCap(1024 * m_core->getMaxUploadSpeed());
+ break;
+ case CAT_FIRST:
+ Out(SYS_SCD|LOG_NOTICE) << prefix << "Switching to FIRST category" << endl;
+ Out(SYS_SCD|LOG_NOTICE) << prefix << QString("%1 Up, %2 Down")
+ .arg(m_schedule.getUpload(0)).arg(m_schedule.getDownload(0)) << endl;
+ if(!m_core)
+ break;
+ m_core->setPausedState(false);
+ net::SocketMonitor::setDownloadCap(1024 * m_schedule.getDownload(0));
+ net::SocketMonitor::setUploadCap(1024 * m_schedule.getUpload(0));
+ break;
+ case CAT_SECOND:
+ Out(SYS_SCD|LOG_NOTICE) << prefix << "Switching to SECOND category" << endl;
+ Out(SYS_SCD|LOG_NOTICE) << prefix << QString("%1 Up, %2 Down")
+ .arg(m_schedule.getUpload(1)).arg(m_schedule.getDownload(1)) << endl;
+ if(!m_core)
+ break;
+ m_core->setPausedState(false);
+ net::SocketMonitor::setDownloadCap(1024 * m_schedule.getDownload(1));
+ net::SocketMonitor::setUploadCap(1024 * m_schedule.getUpload(1));
+ break;
+ case CAT_THIRD:
+ Out(SYS_SCD|LOG_NOTICE) << prefix << "Switching to THIRD category" << endl;
+ Out(SYS_SCD|LOG_NOTICE) << prefix << QString("%1 Up, %2 Down")
+ .arg(m_schedule.getUpload(2)).arg(m_schedule.getDownload(2)) << endl;
+ if(!m_core)
+ break;
+ m_core->setPausedState(false);
+ net::SocketMonitor::setDownloadCap(1024 * m_schedule.getDownload(2));
+ net::SocketMonitor::setUploadCap(1024 * m_schedule.getUpload(2));
+ break;
+ case CAT_OFF:
+ Out(SYS_SCD|LOG_NOTICE) << prefix << "Switching to OFF" << endl;
+
+ if(!m_core)
+ break;
+ m_core->setPausedState(true);
+ break;
+ }
+ }
+
+ void BWScheduler::loadSchedule()
+ {
+ QFile file(KGlobal::dirs()->saveLocation("data","ktorrent") + "bwschedule");
+
+ if(!file.exists())
+ return;
+
+ file.open(IO_ReadOnly);
+ QDataStream stream(&file);
+
+ int tmp;
+
+ //extract category values
+ for(int i=0; i<3; ++i)
+ {
+ stream >> tmp;
+ m_schedule.setDownload(i, tmp);
+ stream >> tmp;
+ m_schedule.setUpload(i, tmp);
+ }
+
+ //extract schedule
+ for(int i=0; i<7; ++i)
+ {
+ for(int j=0; j<24; ++j)
+ {
+ stream >> tmp;
+ m_schedule.setCategory(i, j, (ScheduleCategory) tmp);
+ }
+ }
+
+ file.close();
+ }
+
+ void BWScheduler::saveSchedule()
+ {
+ QFile file(KGlobal::dirs()->saveLocation("data","ktorrent") + "bwschedule");
+
+ file.open(IO_WriteOnly);
+ QDataStream stream(&file);
+
+ for(int i=0; i<3; ++i)
+ {
+ stream << m_schedule.getDownload(i);
+ stream << m_schedule.getUpload(i);
+ }
+
+ //Now schedule
+ for(int i=0; i<7; ++i)
+ for(int j=0; j<24; ++j)
+ stream << (int) m_schedule.getCategory(i, j);
+
+ file.close();
+ }
+
+ void BWScheduler::setEnabled(bool theValue)
+ {
+ m_enabled = theValue;
+ }
+}
diff --git a/plugins/scheduler/bwscheduler.h b/plugins/scheduler/bwscheduler.h
new file mode 100644
index 0000000..e752b1d
--- /dev/null
+++ b/plugins/scheduler/bwscheduler.h
@@ -0,0 +1,173 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTBWSCHEDULER_H
+#define KTBWSCHEDULER_H
+
+#include <interfaces/coreinterface.h>
+
+namespace kt
+{
+
+ typedef enum bws_category
+ {
+ CAT_NORMAL,
+ CAT_FIRST,
+ CAT_SECOND,
+ CAT_THIRD,
+ CAT_OFF
+ }ScheduleCategory;
+
+ /**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief This class represents bandwidth schedule for the week.
+ * It simplifies usage of 2 dimensional schedule (array) and its transfer between classes.
+ */
+ class BWS
+ {
+ ///Schedule
+ ScheduleCategory** m_schedule;
+
+ ///Download categories
+ int download[3];
+ ///Upload categories
+ int upload[3];
+
+ public:
+ BWS();
+ BWS& operator=(const BWS& b);
+ ~BWS();
+
+ /**
+ * @brief Resets this schedule.
+ */
+ void reset();
+
+
+ /**
+ * Gets download rate for category <i>cat</i>.
+ * @param cat download category index
+ * @return Download rate in KB/s
+ */
+ int getDownload(int cat);
+
+ /**
+ * Gets upload rate for category <i>cat</i>.
+ * @param cat upload category index
+ * @return upload rate in KB/s
+ */
+ int getUpload(int cat);
+
+
+ /**
+ * @brief Gets category for specified <i>day</i> and <i>hour</i>.
+ * @param day Number of day in a week.
+ * @param hour Hour of the day.
+ * @return ScheduleCategory - category associated with that day/hour.
+ */
+ ScheduleCategory getCategory(int day, int hour);
+
+
+ /**
+ * @brief Sets download rate for a category.
+ * @param cat Category to set rate to.
+ * @param val Download rate to set to category in KB/s
+ */
+ void setDownload(int cat, int val);
+
+ /**
+ * @brief Sets upload rate for a category.
+ * @param cat Category to set rate to.
+ * @param val Upload rate to set to category in KB/s
+ */
+ void setUpload(int cat, int val);
+
+
+ /**
+ * @brief Sets category for specified <i>day</i>/<i>hour</i> combination.
+ * @param day Day of the week.
+ * @param hour Hour of the day.
+ * @param val Category value.
+ */
+ void setCategory(int day, int hour, ScheduleCategory val);
+
+ ///Prints schedule to LogViewer. Used only for debugging.
+ void debug();
+ };
+
+
+ /**
+ * @brief Bandwidth scheduler class.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * Singleton class. Used to keep bandwidth schedule and change download/upload rate as necessary.
+ */
+ class BWScheduler
+ {
+ public:
+ inline static BWScheduler& instance()
+ {
+ static BWScheduler self;
+ return self;
+ }
+ ~BWScheduler();
+
+ /**
+ * Triggers bandwidth limit changes (if needed).
+ */
+ void trigger();
+
+ /**
+ * Sets a new schedule.
+ * @param sch - new BWS schedule.
+ * @note Call trigger() after setting new schedule for changes to take effect.
+ */
+ void setSchedule(const BWS& sch);
+
+ /**
+ * Sets a pointer to CoreInterface.
+ * Needed for getting global bandwidth limits.
+ * @param core Pointer to CoreInterface
+ */
+ void setCoreInterface(CoreInterface* core);
+
+ ///Pauses all torrents (TURN OFF category)
+ void pauseAll();
+
+ ///Loads schedule from HD
+ void loadSchedule();
+ ///Saves schedule to HD
+ void saveSchedule();
+
+ void setEnabled(bool theValue);
+
+
+ protected:
+ BWScheduler();
+ BWScheduler(const BWScheduler&);
+ BWScheduler& operator=(const BWScheduler&);
+
+ BWS m_schedule;
+ CoreInterface* m_core;
+
+ bool m_enabled;
+ };
+}
+
+#endif
+
diff --git a/plugins/scheduler/bwspage.ui b/plugins/scheduler/bwspage.ui
new file mode 100644
index 0000000..af0e771
--- /dev/null
+++ b/plugins/scheduler/bwspage.ui
@@ -0,0 +1,877 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>BWSPage</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BWSPage</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>718</width>
+ <height>530</height>
+ </rect>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>750</width>
+ <height>540</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Bandwidth scheduler</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="resizeMode">
+ <enum>Fixed</enum>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Left click category</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="1" column="1">
+ <property name="name">
+ <cstring>radio2</cstring>
+ </property>
+ <property name="text">
+ <string>Categor&amp;y 1</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>pix1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>pix2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>pix3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>pix5</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="4" column="1">
+ <property name="name">
+ <cstring>radio5</cstring>
+ </property>
+ <property name="text">
+ <string>T&amp;urn off</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="1">
+ <property name="name">
+ <cstring>radio1</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Normal</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>pix4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="3" column="1">
+ <property name="name">
+ <cstring>radio4</cstring>
+ </property>
+ <property name="text">
+ <string>Category &amp;3</string>
+ </property>
+ <property name="accel">
+ <string>Alt+3</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="1">
+ <property name="name">
+ <cstring>radio3</cstring>
+ </property>
+ <property name="text">
+ <string>Category &amp;2</string>
+ </property>
+ <property name="accel">
+ <string>Alt+2</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1_2</cstring>
+ </property>
+ <property name="title">
+ <string>Right click category</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="1" column="1">
+ <property name="name">
+ <cstring>radio22</cstring>
+ </property>
+ <property name="text">
+ <string>Category &amp;1</string>
+ </property>
+ <property name="accel">
+ <string>Alt+1</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>pix12</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>pix22</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>pix32</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>pix52</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="4" column="1">
+ <property name="name">
+ <cstring>radio52</cstring>
+ </property>
+ <property name="text">
+ <string>T&amp;urn off</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="1">
+ <property name="name">
+ <cstring>radio12</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Normal</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>pix42</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>30</width>
+ <height>15</height>
+ </size>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="3" column="1">
+ <property name="name">
+ <cstring>radio42</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Category 3</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="1">
+ <property name="name">
+ <cstring>radio32</cstring>
+ </property>
+ <property name="text">
+ <string>Category &amp;2</string>
+ </property>
+ <property name="accel">
+ <string>Alt+2</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox" row="1" column="1">
+ <property name="name">
+ <cstring>groupCategories_2</cstring>
+ </property>
+ <property name="title">
+ <string>Categories</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel8_4</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;1. Category&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel8_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;3. Category&lt;/b&gt;</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6_5</cstring>
+ </property>
+ <property name="text">
+ <string>download:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>dlCat1</cstring>
+ </property>
+ <property name="maxValue">
+ <number>30000</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6_4_4</cstring>
+ </property>
+ <property name="text">
+ <string>upload:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>ulCat1</cstring>
+ </property>
+ <property name="maxValue">
+ <number>30000</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel9_4</cstring>
+ </property>
+ <property name="text">
+ <string>KB/s *</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>download:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>dlCat2</cstring>
+ </property>
+ <property name="maxValue">
+ <number>30000</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6_4_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>upload:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>ulCat2</cstring>
+ </property>
+ <property name="maxValue">
+ <number>30000</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel9_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>KB/s *</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="5" column="0">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>download:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>dlCat3</cstring>
+ </property>
+ <property name="maxValue">
+ <number>30000</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel6_4_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>upload:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>ulCat3</cstring>
+ </property>
+ <property name="maxValue">
+ <number>30000</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel9_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>KB/s *</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel8_2_2</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;b&gt;2. Category&lt;/b&gt;</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="kt::BWSWidget" row="0" column="0" rowspan="5" colspan="1">
+ <property name="name">
+ <cstring>m_bwsWidget</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>379</width>
+ <height>510</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>379</width>
+ <height>508</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="1">
+ <property name="name">
+ <cstring>layout34</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>lblStatus</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel10</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>5</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>* zero means no limit</string>
+ </property>
+ <property name="alignment">
+ <set>AlignVCenter|AlignRight</set>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <spacer row="3" column="1">
+ <property name="name">
+ <cstring>spacer16</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget" row="4" column="1">
+ <property name="name">
+ <cstring>layout32</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout31</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnSave</cstring>
+ </property>
+ <property name="text">
+ <string>Save to file</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnLoad</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Load from file</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnReset</cstring>
+ </property>
+ <property name="text">
+ <string>Reset schedule</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>36</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>pix_icon</cstring>
+ </property>
+ <property name="pixmap">
+ <pixmap>image0</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer14</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>35</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout29</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnOk</cstring>
+ </property>
+ <property name="text">
+ <string>O&amp;k</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnApply</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Apply</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnCancel</cstring>
+ </property>
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+ <customwidget>
+ <class>kt::BWSWidget</class>
+ <header location="local">bwswidget.h</header>
+ <sizehint>
+ <width>-1</width>
+ <height>-1</height>
+ </sizehint>
+ <container>0</container>
+ <sizepolicy>
+ <hordata>5</hordata>
+ <verdata>5</verdata>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ <pixmap>image1</pixmap>
+ </customwidget>
+</customwidgets>
+<images>
+ <image name="image0">
+ <data format="XPM.GZ" length="4833">789c8597596f23470e80dfe75718c3b7c182e9eabb11ec834fc9873cbeaf601fc86ec9966df994cfc5fef794483633934d10c836fcb9582cde55fee5dbd2d9de68e9db2f5f9ee7349fb64bed153d2d7deb5e66b38fdffef3efff7ef99aa64b8baf2c5b4abffeebcb57dc5c6a9720499290640b8613e110ff22eb941b07657e7256f90be742e4a7c6a9ed076791c7a1732efbd784d3f817615a71167db0e55c0a17ce95c88f8ced3c7e74d6f306cea29fd159f583b3e8a75367d18f5bce8df0b63389be67e3ccfcd97716fd78e22cfaf1d459edefedcbedbc63e75af4cf85b33edeb8616cfef1b5b39eb7e72cf6c28b7166fb53678df7b5b3fadf388b3d503a8b3d40c6b9eaa35767d9cf37c6a5e53f73d6f3769d55bedf5f2789ac6bfcf2de1fda33ce4cdfbb716eeb6fce1acf1de3c2f2bbe7acf573605cdafe2b67f5efd359f20bb97165febe38b3c453fd2bfa7cd0a67165fea97c9db416ff1de3b1e9d77a6d12567bf8c159ed9d1ab7969fc2b8d378e2ba304579c93769bd719457fd524f2184cae221f51bd250a8fd3c35ae4cfec1b8b6fa06e3c6eaffc859d651f215b2d0c7efdab8327b969d459e9e8d7bfd57c68df587c43be4c1e20b685c1b9f0b17c1e283cfce927f96f911ca40d63fcbce7afebd31eb3a91b3fa37376ead9e64dea5759606a94f546eb23499883d9bc69932bef4acf22cf594725c1f8bfca9b3c8d3aa711e82c82bb73de3817111a4fe2171d67e1a1b97ba8e87ce5a8f12bfb48b2cfae8ceb85206894f9666135bff2e5c45d6fae894a3393a3f5be13aaeb7729eca4ff2d6ce3f5b701ef2b1c95f0aa7715dfb4de657519675d0fc8d8c9ba0f527f12faab234fd8fc695f1ab716dfa3f84ebb2089dec5f779678d381711d74beae398b7f540b3751bfd6e39ab1c9033b6bbd07e326687dcb3c2da8ecf47cfa301e9bbe37e389c94b3c0a2edba0f5f361dc194b3c8b36eed77acf9c453fab7f6d95587e6e8d83c957c25dc9668fdc5fc538b2c6e3a6e754e7adcc836252b6a9d69bccffb2ad535d67e98fb2ab538befaab3e8439947e5b84e82f6ffa17165f1bd7096fcc1ccb8b67a981b375a0f20f92d2775b078493dd54c75aaef0de9dfba75167fea2eb2f683dc5771388d753fbe396b7fca7c6b52ea2c5e57ce621fcbfdd26464f1812767ed8f63e3ced665de34c464fe9e1bb3d5b3f45bc3dca67a7fc9fba7697b46a9bf66cc13cb8fcc8b66c2960f3832b6f3988dad1e2828b799c53371d6f9766b9c5b7f4afe286983f5c3aeb3be177ace6c1ecc9cb51f6a678def8a7169f351fca710f5a93d9db3d64febacf9981aa76a2f5e3b6b7d5d1af7f6df3aebfb67e4acf93f72d6f972675cd83c7d77d67cac3bebfdfce9acf7eb87b3c66b665cdabc5feed9f44bfd51caade59395dbc4fc3f33cecc9f9b9e35bf786fdccfffc459e7ffc059eb7fe2acefcfd459df13dbceda5f4367bddffed8affdf0665c243a6f769c351f6367f51f7ad6fcefcf9dd57e72567fd959e3dd3a6bbc3b677daf34ce6affadb3dadbdb57263a5f46ce7adf8e9dd5dededfbe5e2f9cb5de5b678df7bb71a5fa59f767dccf77cd57d6f7136c185b7e79d359f3159cf53df7e8acf19e19f7f57ee5acef9b0d67f5b733b6fa844b63f38f07ceea9fcc3fca5b9bef58199b3dbce5acefa53567bd6fee8c73d54f95b3fa3b34b6fcc3b3b3f6dba1b3f6afe6a788fb6bad9f1f3f08f19b90b18ddff0f3dafefc2fe4bb284948f1b7f1e2e73fca4ff012af708ad77883b77f2f8f33bc8b9aeff1011ff1099f718e2ff88a6ff88e1ff8196da33fc92fe30aaee21aaee3060e70889bb885dbb88323dc8d7a407df941be8dd2dfa3ec5e94dac7033cc4233cc6133cc5333cc78bffb327c18029669863812556d1ef1a9ba8168080a1850ec608daaf30814bb882296ec035dc486426700b33b8837b78c0213cc2133ce367af3f7a93c01c5e700b5ee10d6fe11d093ee01396610556f104d6601d36a2d77abf0da2f41036610bb6b1841d18c12e7c873dd887033884233886133885b318297d3fc558e114cee1021208d1e01432c8a180122aa8e3c5190f2322c63bb507995aea62bc37698c9f34a14bba822d9ad235ddd02dcde80e87744f0f7fc823d1233de1363d634d737aa1577aa3ebf8047ba70ffaa4655aa1555aa375b37f0c298e6923ca0fb0a1212cd3266dd136edd08876e93bedd13e1dd0211d997e88f6031dd3099d624e67744e17f15f8b40296594cb273ef61632aa5ff34515d5d43032707c19449fd6e993db283b8217ee62fc0630fa31bf1cdf037c493bb1724ef98a162d30e56bcae185467cc3b731dfa0f935f919dff13daef1033ff2133fc77d039e73d41da55ff90d268b8afba17ea27d30a18edff9833f7999577895d7a88421aff31b6fc0e04ff5c6314acc031ef2266cc4c7ce036ff12ca66a10ff75d95eacfd2ccf3b0bfd38e651ac93f7d83b77f84e47d1e6f1222e0bf9c5ef3ff7a3f690766f4ffd0490aa85affffbf5cbef985d44a8</data>
+ </image>
+ <image name="image1">
+ <data format="PNG" length="1122">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042949444154388db5954d6c545514c77ff7de37eff1a6a550da994e5ba798868f948fc847a2a2911816c436b0a02ed0083161a1981877ee10d90aa94656063491882c5cd4c4b8103f20cd806909a98604da8482341de80cb69de9bcd799799d79efba980f1da3a80b4f727273939bdff99f9b93f3175a6b6a21849080020c4002a29a8f0a5dcd002803bed63a1035f0d0d0504b6f6fef51d7758fa4d3e98d8ee3fc03af128ee3303939399548242eb8aefb09300f78464de9f0f0f0d148cc7caf3d5424de97a7ec17104220242805520a44557bbd4b21f083801d33e63a6d1bc7bf19c6064e0319a35a58b9ae7ba43d54e4d7c54b64dc097c7f09d30ef04b36736983cc7c11b4456b9b492c5e20dc54a6540e00896a8268a7017010f8bcae1830d2e9f4c69ebe3c197782b2ce60d94ddc9b30f9feeb45ae5d7181c5ead35636ef08d3ffe26a76ee3208b4031a56d80aa00768fda362e9380e25bf80ef3b587613d7afc099533380a4b5dda46fcb5aa42998b9eb7173dce5e6788e434763ec7fc942532008ea436003660d2caa7f8d69c3bd8910674e4d033e83877ad8d36fb0aa4d6058658ac5358c5df6383bf480f31fdda5a3632bbbfb6da4ccd5c00a10b2012cc12fd97cfb5516f0187c25cee0619396480ec3ca909d0f3372d1e5f9fe66de3ad605587c712ec55256a2540d5519d19ae24a29057329839f7ecc138944d833102290f3184ae1e6d6f0e98739c61229e6d21eafbed1c9c8c5558c8f3ee4ceed76946a1c43d97091828585223e2eebfbc295f60d45de89707628cb58224577bc85a79e5d4d786581cddb9b0148259711b20145836221400416e0232d1f6595c9ce4538773ac7b54406f0b15784e8e80aa1ac2594190220d021e49f2437960156b70ba095e95f96f18acd8c263cc6122962b1167a7ba34cdd7ec8c977a699bed546722a8fc2a02b6e2185fff78ab586ce78894ddb9ab9f5738ed14b1e030756929d8ff2e4ae5544632b38f96e89a99b298ebd6950cc2d12ed0eb3618b26f520788462ad09877df60db600f0f1fb49c646f21c7ebd836dcf94e9d9b4c0db27d6d3bd36c6426a96bce731703046d7da129a4670836284a054869d4f1b1c7e2dca67676ef3c1898091ef5ad8bc358c3205c93bf7c9a40ad4c660f4728edd7bbb3142ea2fc1da711cfc200011e08b45f6bd1c261adbce9717928c5f9d63fc6a19f0014567773303073790f8214bd6f5282dfbb8b9fa1f6b40d7c1939393533b92e63ad9240990484aec7e41b27d579cbb531e0f67023492d86316ebb768ba1e0f786e6f37e56550c62237aee7011e54abd7c1412291b8a06de378b4d3c0b215da9708e5a3a442192085404a83d4accfecac067c0c43e13a70e3fa12e96409e0325000966bbb354465339d04a6f9dd15fe6dde07ce030780278088d05ad72cc9a6b2f2daaaa74d75a1f0e8d0d5f60b40868a8364ead6248430000b0857a126ffcdf396abf03ce089ffcb4c7f033046c6b4a995e7a00000000049454e44ae426082</data>
+ </image>
+</images>
+<connections>
+ <connection>
+ <sender>btnOk</sender>
+ <signal>clicked()</signal>
+ <receiver>BWSPage</receiver>
+ <slot>btnOk_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnApply</sender>
+ <signal>clicked()</signal>
+ <receiver>BWSPage</receiver>
+ <slot>btnApply_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnSave</sender>
+ <signal>clicked()</signal>
+ <receiver>BWSPage</receiver>
+ <slot>btnSave_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnLoad</sender>
+ <signal>clicked()</signal>
+ <receiver>BWSPage</receiver>
+ <slot>btnLoad_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnReset</sender>
+ <signal>clicked()</signal>
+ <receiver>BWSPage</receiver>
+ <slot>btnReset_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>btnCancel</sender>
+ <signal>clicked()</signal>
+ <receiver>BWSPage</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>radio1</tabstop>
+ <tabstop>radio2</tabstop>
+ <tabstop>radio3</tabstop>
+ <tabstop>radio4</tabstop>
+ <tabstop>radio5</tabstop>
+ <tabstop>dlCat1</tabstop>
+ <tabstop>ulCat1</tabstop>
+ <tabstop>dlCat2</tabstop>
+ <tabstop>ulCat2</tabstop>
+ <tabstop>dlCat3</tabstop>
+ <tabstop>ulCat3</tabstop>
+</tabstops>
+<slots>
+ <slot>btnOk_clicked()</slot>
+ <slot>btnApply_clicked()</slot>
+ <slot>btnCancel_clicked()</slot>
+ <slot>btnSave_clicked()</slot>
+ <slot>btnLoad_clicked()</slot>
+ <slot>btnReset_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>bwswidget.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/scheduler/bwsprefpage.cpp b/plugins/scheduler/bwsprefpage.cpp
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/scheduler/bwsprefpage.cpp
diff --git a/plugins/scheduler/bwsprefpage.h b/plugins/scheduler/bwsprefpage.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/plugins/scheduler/bwsprefpage.h
diff --git a/plugins/scheduler/bwsprefpagewidget.cpp b/plugins/scheduler/bwsprefpagewidget.cpp
new file mode 100644
index 0000000..0c44a43
--- /dev/null
+++ b/plugins/scheduler/bwsprefpagewidget.cpp
@@ -0,0 +1,291 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "bwspage.h"
+#include "bwsprefpagewidget.h"
+#include "bwscheduler.h"
+#include "bwswidget.h"
+#include "schedulerpluginsettings.h"
+
+#include <knuminput.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <kiconloader.h>
+#include <kstdguiitem.h>
+#include <kpushbutton.h>
+
+#include <qcombobox.h>
+#include <qfile.h>
+#include <qdatastream.h>
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+
+namespace kt
+{
+
+ /* PREF PAGE WIDGET --------------------------------------------------------*/
+
+ BWSPrefPageWidget::BWSPrefPageWidget(QWidget* parent, const char* name, WFlags fl)
+ : BWSPage(parent,name,fl)
+ {
+
+ loadDefault();
+
+ lblStatus->clear();
+
+ pix_icon->setPixmap(KGlobal::iconLoader()->loadIcon("clock",KIcon::NoGroup));
+
+ btnOk->setGuiItem(KStdGuiItem::ok());
+ btnCancel->setGuiItem(KStdGuiItem::cancel());
+ btnApply->setGuiItem(KStdGuiItem::apply());
+ btnSave->setGuiItem(KStdGuiItem::saveAs());
+ btnLoad->setGuiItem(KStdGuiItem::open());
+ btnReset->setGuiItem(KStdGuiItem::reset());
+
+
+ bool use_colors = SchedulerPluginSettings::useColors();
+
+ if(use_colors) //set up colors
+ {
+ pix1->setPaletteBackgroundColor(QColor(30,165,105));
+ pix2->setPaletteBackgroundColor(QColor(195,195,70));
+ pix3->setPaletteBackgroundColor(QColor(195,195,70));
+ pix4->setPaletteBackgroundColor(QColor(195,195,70));
+ pix5->setPaletteBackgroundColor(QColor(190,30,30));
+
+ pix12->setPaletteBackgroundColor(QColor(30,165,105));
+ pix22->setPaletteBackgroundColor(QColor(195,195,70));
+ pix32->setPaletteBackgroundColor(QColor(195,195,70));
+ pix42->setPaletteBackgroundColor(QColor(195,195,70));
+ pix52->setPaletteBackgroundColor(QColor(190,30,30));
+ } else //set up pixmaps
+ {
+ pix1->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0000.png"))));
+ pix2->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0001.png"))));
+ pix3->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0002.png"))));
+ pix4->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0003.png"))));
+ pix5->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0004.png"))));
+
+ pix12->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0000.png"))));
+ pix22->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0001.png"))));
+ pix32->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0002.png"))));
+ pix42->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0003.png"))));
+ pix52->setPixmap(QPixmap(locate("data", QString("ktorrent/icons/cell-a-0004.png"))));
+ }
+
+ connect(radio1, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio2, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio3, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio4, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio5, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio12, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio22, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio32, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio42, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+ connect(radio52, SIGNAL(stateChanged(int)), this, SLOT(categoryChanged(int)));
+
+ //pre-check default categories (say 1 for left and 0 for right)
+ radio2->setChecked(true);
+ radio12->setChecked(true);
+
+ m_bwsWidget->setSchedule(schedule);
+ }
+
+ BWSPrefPageWidget::~BWSPrefPageWidget()
+ {}
+
+ void BWSPrefPageWidget::btnSave_clicked()
+ {
+ QString sf = KFileDialog::getSaveFileName("/home","*",this,i18n("Choose a filename to save under"));
+
+ if(sf.isEmpty())
+ return;
+
+ saveSchedule(sf);
+ }
+
+ void BWSPrefPageWidget::btnLoad_clicked()
+ {
+ QString lf = KFileDialog::getOpenFileName("/home", "*",this,i18n("Choose a file"));
+
+ if(lf.isEmpty())
+ return;
+
+ btnReset_clicked();
+ loadSchedule(lf);
+ }
+
+ void BWSPrefPageWidget::saveSchedule(QString& fn)
+ {
+ schedule = m_bwsWidget->schedule();
+
+ QFile file(fn);
+
+ file.open(IO_WriteOnly);
+ QDataStream stream(&file);
+
+ //First category
+ stream << dlCat1->value();
+ stream << ulCat1->value();
+
+ //Second category
+ stream << dlCat2->value();
+ stream << ulCat2->value();
+
+ //Third category
+ stream << dlCat3->value();
+ stream << ulCat3->value();
+
+ //Now schedule
+ for(int i=0; i<7; ++i)
+ for(int j=0; j<24; ++j)
+ stream << (int) schedule.getCategory(i, j);
+
+ file.close();
+ lblStatus->setText(i18n("Schedule saved."));
+ }
+
+ void BWSPrefPageWidget::loadSchedule(QString& fn, bool showmsg)
+ {
+ QFile file(fn);
+
+ if(!file.exists()) {
+ if(showmsg)
+ KMessageBox::error(this, i18n("File not found."), i18n("Error"));
+ return;
+ }
+
+ file.open(IO_ReadOnly);
+ QDataStream stream(&file);
+
+ int tmp;
+
+ stream >> tmp;
+ dlCat1->setValue(tmp);
+ stream >> tmp;
+ ulCat1->setValue(tmp);
+
+ stream >> tmp;
+ dlCat2->setValue(tmp);
+ stream >> tmp;
+ ulCat2->setValue(tmp);
+
+ stream >> tmp;
+ dlCat3->setValue(tmp);
+ stream >> tmp;
+ ulCat3->setValue(tmp);
+
+ for(int i=0; i<7; ++i) {
+ for(int j=0; j<24; ++j) {
+ stream >> tmp;
+ schedule.setCategory(i, j, (ScheduleCategory) tmp);
+ }
+ }
+
+ file.close();
+
+ m_bwsWidget->setSchedule(schedule);
+ lblStatus->setText(i18n("Schedule loaded."));
+ }
+
+ void BWSPrefPageWidget::loadDefault()
+ {
+ //read schedule from HD
+ QString fn = KGlobal::dirs()->saveLocation("data","ktorrent") + "bwschedule";
+ loadSchedule(fn, false);
+ }
+
+ void BWSPrefPageWidget::btnReset_clicked()
+ {
+ schedule.reset();
+ m_bwsWidget->resetSchedule();
+
+ dlCat1->setValue(0);
+ dlCat2->setValue(0);
+ dlCat3->setValue(0);
+
+ ulCat1->setValue(0);
+ ulCat2->setValue(0);
+ ulCat3->setValue(0);
+
+ lblStatus->clear();
+ }
+
+ void BWSPrefPageWidget::apply()
+ {
+ schedule = m_bwsWidget->schedule();
+
+ SchedulerPluginSettings::writeConfig();
+
+ //update category values...
+ schedule.setDownload(0, dlCat1->value());
+ schedule.setUpload(0, ulCat1->value());
+ schedule.setDownload(1, dlCat2->value());
+ schedule.setUpload(1, ulCat2->value());
+ schedule.setDownload(2, dlCat3->value());
+ schedule.setUpload(2, ulCat3->value());
+
+ //set new schedule
+ BWScheduler::instance().setSchedule(schedule);
+ }
+
+ void BWSPrefPageWidget::btnOk_clicked()
+ {
+ apply();
+ accept();
+ }
+
+ void BWSPrefPageWidget::btnApply_clicked()
+ {
+ apply();
+ }
+}
+
+void kt::BWSPrefPageWidget::categoryChanged(int)
+{
+ if(radio1->isChecked())
+ m_bwsWidget->setLeftCategory(0);
+ else if(radio2->isChecked())
+ m_bwsWidget->setLeftCategory(1);
+ else if(radio3->isChecked())
+ m_bwsWidget->setLeftCategory(2);
+ else if(radio4->isChecked())
+ m_bwsWidget->setLeftCategory(3);
+ else if(radio5->isChecked())
+ m_bwsWidget->setLeftCategory(4);
+
+ if(radio12->isChecked())
+ m_bwsWidget->setRightCategory(0);
+ else if(radio22->isChecked())
+ m_bwsWidget->setRightCategory(1);
+ else if(radio32->isChecked())
+ m_bwsWidget->setRightCategory(2);
+ else if(radio42->isChecked())
+ m_bwsWidget->setRightCategory(3);
+ else if(radio52->isChecked())
+ m_bwsWidget->setRightCategory(4);
+}
+
+
+
+#include "bwsprefpagewidget.moc"
diff --git a/plugins/scheduler/bwsprefpagewidget.h b/plugins/scheduler/bwsprefpagewidget.h
new file mode 100644
index 0000000..ca0e80b
--- /dev/null
+++ b/plugins/scheduler/bwsprefpagewidget.h
@@ -0,0 +1,84 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTBWSPREFPAGEWIDGET_H
+#define KTBWSPREFPAGEWIDGET_H
+
+#include <qwidget.h>
+
+#include "bwspage.h"
+#include "bwscheduler.h"
+
+namespace kt
+{
+ /**
+ * @brief Bandwidth Scheduler page
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class BWSPrefPageWidget : public BWSPage
+ {
+ Q_OBJECT
+ public:
+ BWSPrefPageWidget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~BWSPrefPageWidget();
+ /*$PUBLIC_FUNCTIONS$*/
+
+ /**
+ * @brief Loads default schedule.
+ * Default schedule is currently active (if enabled) and it's in ~/.kde/share/apps/ktorrent/bwschedule
+ */
+ void loadDefault();
+
+ /**
+ * Loads a schedule from HD.
+ * @param fn Schedule filename
+ * @param showmsg Should I show msgBox if file doesn't exist.
+ * @ref BWSPrefPageWidget::btnLoad_clicked()
+ * @ref BWSPrefPageWidget::loadDefault()
+ */
+ void loadSchedule(QString& fn, bool showmsg = true);
+
+ /**
+ * Saves current schedule to HD.
+ * @param fn Schedule filename.
+ */
+ void saveSchedule(QString& fn);
+
+
+ public slots:
+ /*$PUBLIC_SLOTS$*/
+ virtual void btnReset_clicked();
+ virtual void btnLoad_clicked();
+ virtual void btnSave_clicked();
+ virtual void btnApply_clicked();
+ virtual void btnOk_clicked();
+
+ private slots:
+ void categoryChanged(int);
+
+ ///Applies settings
+ void apply();
+
+ private:
+ BWS schedule;
+ };
+
+}
+
+#endif
diff --git a/plugins/scheduler/bwswidget.cpp b/plugins/scheduler/bwswidget.cpp
new file mode 100644
index 0000000..b430de3
--- /dev/null
+++ b/plugins/scheduler/bwswidget.cpp
@@ -0,0 +1,334 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "bwswidget.h"
+#include "schedulerpluginsettings.h"
+
+#include <klocale.h>
+#include <qstringlist.h>
+#include <qpixmap.h>
+#include <qtable.h>
+#include <qpainter.h>
+#include <qrect.h>
+#include <qfont.h>
+#include <qcolor.h>
+
+#include <kglobal.h>
+#include <kstandarddirs.h>
+
+namespace kt
+{
+ BWSWidget::BWSWidget(QWidget* parent, const char* name, bool useColors)
+ : QTable(parent,name), m_leftCategory(1), m_rightCategory(0), draw_focus(true), right_click(false), use_colors(useColors)
+ {
+ use_colors = SchedulerPluginSettings::useColors();
+
+ QStringList days;
+ QStringList hours;
+
+ days << i18n("MON") << i18n("TUE") << i18n("WED") << i18n("THU") << i18n("FRI") << i18n("SAT") << i18n("SUN");
+ hours <<
+ "00:00-00:59h" << "01:00-01:59h" <<
+ "02:00-02:59h" << "03:00-03:59h" <<
+ "04:00-04:59h" << "05:00-05:59h" <<
+ "06:00-06:59h" << "07:00-07:59h" <<
+ "08:00-08:59h" << "09:00-09:59h" <<
+ "10:00-10:59h" << "11:00-11:59h" <<
+ "12:00-12:59h" << "13:00-13:59h" <<
+ "14:00-14:59h" << "15:00-15:59h" <<
+ "16:00-16:59h" << "17:00-17:59h" <<
+ "18:00-18:59h" << "19:00-19:59h" <<
+ "20:00-20:59h" << "21:00-21:59h" <<
+ "22:00-22:59h" << "23:00-23:59h";
+
+ insertRows(0,24);
+ insertColumns(0,7);
+
+ setColumnLabels(days);
+ setRowLabels(hours);
+
+ setFocusPolicy(QWidget::StrongFocus);
+
+ QFont f;
+ f.setPointSize(8);
+ setFont(f);
+
+ for(int i=0; i<7; ++i) {
+ setColumnWidth(i,40);
+ setColumnStretchable(i, true);
+ }
+ for(int i=0; i<24; ++i) {
+ setColumnWidth(i,40);
+ setRowStretchable(i, true);
+ }
+
+ setColumnMovingEnabled(false);
+ setRowMovingEnabled(false);
+
+ setSorting(false);
+
+ adjustSize();
+
+ for(int i=0; i<5; ++i) {
+ m_pix[i] = 0;
+ m_pixf[i] = 0;
+ m_color[i] = 0;
+ m_colorf[i] = 0;
+ }
+
+ setType(use_colors);
+
+ resetSchedule();
+
+ setSelectionMode(QTable::NoSelection);
+
+ setHScrollBarMode(QTable::AlwaysOff);
+ setVScrollBarMode(QTable::AlwaysOff);
+
+ connect(this, SIGNAL(currentChanged( int, int )), this, SLOT(cellSelectionChanged( int, int )));
+ connect(this, SIGNAL(pressed(int, int, int, const QPoint&)), this, SLOT(cellMouseDown(int, int, int, const QPoint& )));
+ }
+
+ BWSWidget::~BWSWidget()
+ {
+ for(int i=0; i<5; ++i) {
+ if(m_pix[i])
+ delete m_pix[i];
+ if(m_pixf[i])
+ delete m_pixf[i];
+ }
+ }
+
+ void BWSWidget::paintFocus(QPainter* p, const QRect& cr)
+ {
+ int x = rowAt(cr.y());
+ int y = columnAt(cr.x());
+
+ if(x == 1 && y == 1) {
+ int trt = 0;
+ ++trt;
+ }
+
+ if(lastFocused.x != x || lastFocused.y != y)
+ updateCell(lastFocused.x, lastFocused.y);
+
+ if(draw_focus) {
+
+ if(right_click)
+ drawCell(p, m_rightCategory, true);
+ else
+ drawCell(p, m_leftCategory, true);
+
+ lastFocused.x = x;
+ lastFocused.y = y;
+ } else {
+ lastFocused.x = -1;
+ lastFocused.y = -1;
+ }
+ }
+
+ void BWSWidget::cellSelectionChanged(int row, int col)
+ {
+ if(right_click)
+ setText(row, col, QString::number(m_rightCategory));
+ else
+ setText(row, col, QString::number(m_leftCategory));
+ }
+
+ void BWSWidget::paintCell(QPainter* p, int row, int col, const QRect& cr, bool selected)
+ {
+ if(selected)
+ return;
+
+ bool ok;
+ int cat = text(row,col).toInt(&ok);
+ if((ok || cat == 0) && cat >= 0 && cat <= 4)
+ drawCell(p, cat);
+ else
+ setText(row,col,QString::number(0));
+ // QTable::paintCell(p,row,col,cr,selected);
+ }
+
+ void BWSWidget::resetSchedule()
+ {
+ for(int i=0; i<7; ++i)
+ for(int j=0; j<24; ++j)
+ setText(j,i, "0");
+ draw_focus = false;
+ clearSelection();
+ updateHeaderStates();
+ }
+
+ void BWSWidget::repaintWidget()
+ {
+ for(int i=0; i<7; ++i)
+ for(int j=0; j<24; ++j)
+ updateCell(j,i);
+ }
+
+ void BWSWidget::cellMouseDown(int row, int col, int button, const QPoint& mousePos)
+ {
+ right_click = button == 2;
+ draw_focus = true;
+ cellSelectionChanged(row,col);
+ }
+
+ void BWSWidget::clearSelect()
+ {
+ draw_focus = false;
+ clearSelection();
+ updateHeaderStates();
+ repaintWidget();
+ }
+
+ void BWSWidget::setLeftCategory(const int& theValue)
+ {
+ m_leftCategory = theValue;
+ }
+
+ void BWSWidget::setRightCategory(const int& theValue)
+ {
+ m_rightCategory = theValue;
+ }
+
+
+ void BWSWidget::setUseColors(bool theValue)
+ {
+ use_colors = theValue;
+ }
+
+ void BWSWidget::drawCell(QPainter* p, int category, bool focus)
+ {
+ if(use_colors) {
+ if(focus) {
+ p->fillRect(0,0,40,20,*m_colorf[category]);
+ } else {
+ p->fillRect(0,0,40,20,*m_color[category]);
+ }
+
+ switch(category) {
+ case 0:
+ // p->drawText(QRect(0,0,40,20), Qt::AlignCenter | Qt::SingleLine, "normalllll");
+ break;
+ case 1:
+ case 2:
+ case 3:
+ p->drawText(QRect(0,0,40,20), Qt::AlignCenter | Qt::SingleLine, QString::number(category));
+ break;
+ case 4:
+ p->drawText(QRect(0,0,40,20), Qt::AlignCenter | Qt::SingleLine, "off");
+ break;
+ }
+
+ p->drawRect(0,0,40,20);
+ } else {
+ if(focus)
+ p->drawPixmap(0,0,*m_pixf[category]);
+ else
+ p->drawPixmap(0,0, *m_pix[category]);
+ }
+ }
+
+ void BWSWidget::setType(bool color)
+ {
+ if(color) {
+ for(int i=0; i<5; ++i) {
+ if(m_pix[i])
+ delete m_pix[i];
+ if(m_pixf[i])
+ delete m_pixf[i];
+
+ m_pix[i] = 0;
+ m_pixf[i] = 0;
+ }
+
+ m_color[0] = new QColor(30,165,105);
+ m_color[1] = new QColor(195,195,70);
+ m_color[2] = new QColor(195,195,70);
+ m_color[3] = new QColor(195,195,70);
+ m_color[4] = new QColor(190,30,30);
+
+ m_colorf[0] = new QColor(40,200,130);
+ m_colorf[1] = new QColor(210,220,130);
+ m_colorf[2] = new QColor(210,220,130);
+ m_colorf[3] = new QColor(210,220,130);
+ m_colorf[4] = new QColor(230,40,40);
+
+ } else {
+ for(int i=0; i<5; ++i) {
+ if(m_color[i])
+ delete m_color[i];
+ if(m_colorf[i])
+ delete m_colorf[i];
+
+ m_color[i] = 0;
+ m_colorf[i] = 0;
+ }
+
+ m_pix[0] = new QPixmap(locate("data", QString("ktorrent/icons/cell-a-0000.png")));
+ m_pix[1] = new QPixmap(locate("data", QString("ktorrent/icons/cell-a-0001.png")));
+ m_pix[2] = new QPixmap(locate("data", QString("ktorrent/icons/cell-a-0002.png")));
+ m_pix[3] = new QPixmap(locate("data", QString("ktorrent/icons/cell-a-0003.png")));
+ m_pix[4] = new QPixmap(locate("data", QString("ktorrent/icons/cell-a-0004.png")));
+
+ m_pixf[0] = new QPixmap(locate("data", QString("ktorrent/icons/cell-b-0000.png")));
+ m_pixf[1] = new QPixmap(locate("data", QString("ktorrent/icons/cell-b-0001.png")));
+ m_pixf[2] = new QPixmap(locate("data", QString("ktorrent/icons/cell-b-0002.png")));
+ m_pixf[3] = new QPixmap(locate("data", QString("ktorrent/icons/cell-b-0003.png")));
+ m_pixf[4] = new QPixmap(locate("data", QString("ktorrent/icons/cell-b-0004.png")));
+ }
+
+ use_colors = color;
+
+ repaintWidget();
+ }
+
+ void BWSWidget::setSchedule(const BWS& theValue)
+ {
+ m_schedule = theValue;
+ for(int i=0; i<7; ++i)
+ for(int j=0; j<24; ++j)
+ setText(j,i, QString::number((int) m_schedule.getCategory(i,j)));
+ }
+
+ const BWS& BWSWidget::schedule()
+ {
+ for(int i=0; i<7; ++i)
+ {
+ for(int j=0; j<24; ++j)
+ {
+ bool ok;
+ ScheduleCategory cat = (ScheduleCategory) text(j,i).toInt(&ok);
+
+ if((ok || cat == 0) && cat >= 0 && cat <= 4) //precaution
+ m_schedule.setCategory(i,j, cat);
+ else
+ m_schedule.setCategory(i,j,(ScheduleCategory) 0);
+ }
+ }
+
+ return m_schedule;
+ }
+
+ void BWSWidget::focusOutEvent(QFocusEvent* e)
+ {
+ if(e->lostFocus())
+ clearSelect();
+ }
+}
diff --git a/plugins/scheduler/bwswidget.h b/plugins/scheduler/bwswidget.h
new file mode 100644
index 0000000..c035edb
--- /dev/null
+++ b/plugins/scheduler/bwswidget.h
@@ -0,0 +1,107 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTBWSWIDGET_H
+#define KTBWSWIDGET_H
+
+#include <qtable.h>
+#include <qpixmap.h>
+#include <qpoint.h>
+#include <qcolor.h>
+
+#include "bwscheduler.h"
+
+namespace kt
+{
+ typedef struct _focusedCell
+ {
+ int x;
+ int y;
+ }
+ FocusedCell;
+
+ /**
+ * @brief Bandwidth scheduler widget.
+ * @author Ivan Vasić <ivasic@gmail.com>
+ * This class is a QTable with customized cells. It's used for bandwidth scheduling by painting each cell with mouse moves or keyboard.
+ */
+ class BWSWidget : public QTable
+ {
+ Q_OBJECT
+ public:
+ BWSWidget(QWidget* parent = 0, const char* name = 0, bool useColors = true);
+ ~BWSWidget();
+
+ ///Repaints the whole widget
+ void repaintWidget();
+
+ ///Clears selection (removes focus)
+ void clearSelect();
+
+ ///Sets category for left mouse click.
+ void setLeftCategory(const int& theValue);
+ ///Sets category for right mouse click.
+ void setRightCategory(const int& theValue);
+
+
+ /**
+ * Sets cell paint type.
+ * @param color TRUE - paints colors. FALSE - paints pixmaps.
+ */
+ void setType(bool color);
+
+ ///Returns current schedule.
+ const BWS& schedule();
+ ///Sets schedule.
+ void setSchedule(const BWS& theValue);
+
+ public slots:
+ void resetSchedule();
+ void setUseColors(bool theValue);
+
+ private slots:
+ void cellSelectionChanged(int row, int col);
+ void cellMouseDown(int row, int col, int button, const QPoint& mousePos);
+
+ private:
+ void paintFocus(QPainter* p, const QRect& cr);
+ void paintCell(QPainter* p, int row, int col, const QRect& cr, bool selected);
+ void drawCell(QPainter* p, int category, bool focus = false);
+ void focusOutEvent(QFocusEvent*);
+
+ QPixmap* m_pix[5];
+ QPixmap* m_pixf[5];
+
+ QColor* m_color[5];
+ QColor* m_colorf[5];
+
+ int m_leftCategory;
+ int m_rightCategory;
+
+ FocusedCell lastFocused;
+
+ bool draw_focus;
+ bool right_click;
+
+ bool use_colors;
+
+ BWS m_schedule;
+ };
+}
+#endif
diff --git a/plugins/scheduler/cell-a-0000.png b/plugins/scheduler/cell-a-0000.png
new file mode 100644
index 0000000..c3a7afd
--- /dev/null
+++ b/plugins/scheduler/cell-a-0000.png
Binary files differ
diff --git a/plugins/scheduler/cell-a-0001.png b/plugins/scheduler/cell-a-0001.png
new file mode 100644
index 0000000..7f93d4e
--- /dev/null
+++ b/plugins/scheduler/cell-a-0001.png
Binary files differ
diff --git a/plugins/scheduler/cell-a-0002.png b/plugins/scheduler/cell-a-0002.png
new file mode 100644
index 0000000..635377e
--- /dev/null
+++ b/plugins/scheduler/cell-a-0002.png
Binary files differ
diff --git a/plugins/scheduler/cell-a-0003.png b/plugins/scheduler/cell-a-0003.png
new file mode 100644
index 0000000..16f5080
--- /dev/null
+++ b/plugins/scheduler/cell-a-0003.png
Binary files differ
diff --git a/plugins/scheduler/cell-a-0004.png b/plugins/scheduler/cell-a-0004.png
new file mode 100644
index 0000000..db91d39
--- /dev/null
+++ b/plugins/scheduler/cell-a-0004.png
Binary files differ
diff --git a/plugins/scheduler/cell-b-0000.png b/plugins/scheduler/cell-b-0000.png
new file mode 100644
index 0000000..1c765f0
--- /dev/null
+++ b/plugins/scheduler/cell-b-0000.png
Binary files differ
diff --git a/plugins/scheduler/cell-b-0001.png b/plugins/scheduler/cell-b-0001.png
new file mode 100644
index 0000000..2fdfcc2
--- /dev/null
+++ b/plugins/scheduler/cell-b-0001.png
Binary files differ
diff --git a/plugins/scheduler/cell-b-0002.png b/plugins/scheduler/cell-b-0002.png
new file mode 100644
index 0000000..6ed81c0
--- /dev/null
+++ b/plugins/scheduler/cell-b-0002.png
Binary files differ
diff --git a/plugins/scheduler/cell-b-0003.png b/plugins/scheduler/cell-b-0003.png
new file mode 100644
index 0000000..847b3a4
--- /dev/null
+++ b/plugins/scheduler/cell-b-0003.png
Binary files differ
diff --git a/plugins/scheduler/cell-b-0004.png b/plugins/scheduler/cell-b-0004.png
new file mode 100644
index 0000000..458aae4
--- /dev/null
+++ b/plugins/scheduler/cell-b-0004.png
Binary files differ
diff --git a/plugins/scheduler/ktschedulerplugin.desktop b/plugins/scheduler/ktschedulerplugin.desktop
new file mode 100644
index 0000000..c208cb3
--- /dev/null
+++ b/plugins/scheduler/ktschedulerplugin.desktop
@@ -0,0 +1,26 @@
+[Desktop Entry]
+Name=SchedulerPlugin
+Name[bg]=Приставка за график
+Name[cs]=Modul plánování
+Name[da]=Skemalægger-Plugin
+Name[de]=Planer-Modul
+Name[el]=Πρόσθετο προγραμματισμού
+Name[et]=Ajastamisplugin
+Name[it]=Plugin pianificatore
+Name[nb]=Planleggermodul
+Name[nds]=Planer-Moduul
+Name[nl]=Plannerplugin
+Name[pl]=Wtyczka planowanie transferu
+Name[pt_BR]=Plugin de agendamento
+Name[sk]=Scheduler Plugin
+Name[sr]=Прикључак распоређивања
+Name[sr@Latn]=Priključak raspoređivanja
+Name[sv]=Insticksprogram för schemaläggning
+Name[tr]=Zamanlayıcı Eklentisi
+Name[uk]=Втулок розкладу
+Name[xx]=xxSchedulerPluginxx
+Name[zh_CN]=带宽规划器插件
+Name[zh_TW]=排程器外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktschedulerplugin
diff --git a/plugins/scheduler/ktschedulerplugin.kcfg b/plugins/scheduler/ktschedulerplugin.kcfg
new file mode 100644
index 0000000..7f752b3
--- /dev/null
+++ b/plugins/scheduler/ktschedulerplugin.kcfg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktschedulerpluginrc"/>
+ <group name="general">
+ <entry name="enableBWS" type="Bool">
+ <label>Enable bandwidth scheduler?</label>
+ <default>FALSE</default>
+ </entry>
+ <entry name="useColors" type="Bool">
+ <label>Use colors instead of pixmaps?</label>
+ <default>FALSE</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/scheduler/ktschedulerpluginui.rc b/plugins/scheduler/ktschedulerpluginui.rc
new file mode 100644
index 0000000..217e103
--- /dev/null
+++ b/plugins/scheduler/ktschedulerpluginui.rc
@@ -0,0 +1,12 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="ktorrent" version="1">
+ <MenuBar>
+ <Menu name="file">
+ <Action name="bwscheduler"/>
+ </Menu>
+ </MenuBar>
+
+ <ToolBar name="SchedulerToolbar" noMerge="1">
+ <Action name="bwscheduler"/>
+ </ToolBar>
+</kpartgui> \ No newline at end of file
diff --git a/plugins/scheduler/schedulerpage.ui b/plugins/scheduler/schedulerpage.ui
new file mode 100644
index 0000000..01a4f47
--- /dev/null
+++ b/plugins/scheduler/schedulerpage.ui
@@ -0,0 +1,146 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SchedulerPage</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SchedulerPage</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>570</width>
+ <height>401</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Scheduler Plugin Pref Page</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>useBS</cstring>
+ </property>
+ <property name="text">
+ <string>Use &amp;bandwidth scheduler?</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox" row="1" column="0">
+ <property name="name">
+ <cstring>groupBWS</cstring>
+ </property>
+ <property name="title">
+ <string>Bandwidth Scheduler</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>useColors</cstring>
+ </property>
+ <property name="text">
+ <string>Use colors instead of pi&amp;xmaps?</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>(Recommended for slower systems)</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>btnEditBWS</cstring>
+ </property>
+ <property name="text">
+ <string>Edit s&amp;chedule</string>
+ </property>
+ </widget>
+ <spacer row="2" column="1" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>spacer22</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer18</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>80</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <spacer row="2" column="0">
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>useBS</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>groupBWS</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>btnEditBWS</sender>
+ <signal>clicked()</signal>
+ <receiver>SchedulerPage</receiver>
+ <slot>btnEditBWS_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>useColors</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SchedulerPage</receiver>
+ <slot>useColors_toggled(bool)</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>btnEditBWS_toggled(bool)</slot>
+ <slot>btnEditBWS_clicked()</slot>
+ <slot>useColors_toggled(bool)</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/plugins/scheduler/schedulerplugin.cpp b/plugins/scheduler/schedulerplugin.cpp
new file mode 100644
index 0000000..7639293
--- /dev/null
+++ b/plugins/scheduler/schedulerplugin.cpp
@@ -0,0 +1,152 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+
+#include <interfaces/coreinterface.h>
+#include <interfaces/guiinterface.h>
+#include <util/constants.h>
+#include <util/log.h>
+
+#include <qstring.h>
+#include <qtimer.h>
+#include <qdatetime.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kstdaction.h>
+#include <kiconloader.h>
+#include <kglobal.h>
+
+#include "schedulerplugin.h"
+#include "schedulerpluginsettings.h"
+#include "bwscheduler.h"
+#include "schedulerprefpage.h"
+#include "bwsprefpagewidget.h"
+
+#include <torrent/downloadcap.h>
+#include <torrent/uploadcap.h>
+#include <torrent/globals.h>
+
+using namespace bt;
+
+K_EXPORT_COMPONENT_FACTORY(ktschedulerplugin,KGenericFactory<kt::SchedulerPlugin>("schedulerplugin"))
+
+namespace kt
+{
+ const QString NAME = "Bandwith Scheduler";
+ const QString AUTHOR = "Ivan Vasic";
+ const QString EMAIL = "ivasic@gmail.com";
+ const QString DESCRIPTION = i18n("Bandwidth scheduling plugin");
+
+ SchedulerPlugin::SchedulerPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("Bandwidth Scheduler"),AUTHOR,EMAIL,DESCRIPTION, "clock")
+ {
+ setXMLFile("ktschedulerpluginui.rc");
+ bws_action = 0;
+ connect(&m_timer, SIGNAL(timeout()), this, SLOT(timer_triggered()));
+ }
+
+
+ SchedulerPlugin::~SchedulerPlugin()
+ {
+ }
+
+ void SchedulerPlugin::load()
+ {
+ Pref = new SchedulerPrefPage(this);
+ getGUI()->addPrefPage(Pref);
+ BWScheduler::instance().setCoreInterface(getCore());
+
+ QDateTime now = QDateTime::currentDateTime();
+
+ //each hour
+ QDateTime hour = now.addSecs(3600);
+ QTime t(hour.time().hour(), 0);
+
+ //each minute
+// QDateTime hour = now.addSecs(60);
+// QTime t(hour.time().hour(), hour.time().minute());
+
+ QDateTime round(hour.date(), t);
+
+ // add a 5 second safety margin (BUG: 131246)
+ int secs_to = now.secsTo(round) + 5;
+
+ m_timer.start(secs_to*1000);
+
+ BWScheduler::instance().trigger();
+
+// updateEnabledBWS();
+ bws_action = new KAction(i18n("Open Bandwidth Scheduler" ), "clock", 0, this,
+ SLOT(openBWS()), actionCollection(), "bwscheduler" );
+ }
+
+ void SchedulerPlugin::unload()
+ {
+ getGUI()->removePrefPage(Pref);
+ if(Pref)
+ delete Pref;
+ Pref = 0;
+
+ if(bws_action)
+ delete bws_action;
+ bws_action = 0;
+
+ m_timer.stop();
+ }
+
+ void SchedulerPlugin::timer_triggered()
+ {
+ m_timer.changeInterval(3600*1000);
+ QDateTime now = QDateTime::currentDateTime();
+ BWScheduler::instance().trigger();
+ }
+
+ void SchedulerPlugin::openBWS()
+ {
+ if(SchedulerPluginSettings::enableBWS())
+ {
+ BWSPrefPageWidget dlg;
+ dlg.exec();
+ }
+ else
+ KMessageBox::sorry(0, i18n("Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."));
+ }
+
+ void SchedulerPlugin::updateEnabledBWS()
+ {
+ if(SchedulerPluginSettings::enableBWS())
+ {
+ bws_action = new KAction(i18n("Open Bandwidth Scheduler" ), "clock", 0, this,
+ SLOT(openBWS()), actionCollection(), "bwscheduler" );
+ }
+ else
+ {
+ if(bws_action)
+ delete bws_action;
+ bws_action = 0;
+ }
+ }
+
+ bool SchedulerPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+}
diff --git a/plugins/scheduler/schedulerplugin.h b/plugins/scheduler/schedulerplugin.h
new file mode 100644
index 0000000..6828d0d
--- /dev/null
+++ b/plugins/scheduler/schedulerplugin.h
@@ -0,0 +1,70 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTschedulerPLUGIN_H
+#define KTschedulerPLUGIN_H
+
+#include <interfaces/plugin.h>
+
+#include "schedulerprefpage.h"
+
+#include <qtimer.h>
+
+#include <kstdaction.h>
+
+class QString;
+
+
+namespace kt
+{
+ class BWSPrefPage;
+
+ /**
+ * @author Ivan Vasic <ivasic@gmail.com>
+ * @brief KTorrent scheduler plugin.
+ *
+ */
+ class SchedulerPlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ SchedulerPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~SchedulerPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+
+ void updateEnabledBWS();
+
+ public slots:
+ void timer_triggered();
+ void openBWS();
+
+ private:
+ QTimer m_timer;
+
+ /* BANDWIDTH SCHEDULE PLUGIN */
+ SchedulerPrefPage* Pref;
+ KAction* bws_action;
+ };
+
+}
+
+#endif
diff --git a/plugins/scheduler/schedulerpluginsettings.kcfgc b/plugins/scheduler/schedulerpluginsettings.kcfgc
new file mode 100644
index 0000000..f38f816
--- /dev/null
+++ b/plugins/scheduler/schedulerpluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktschedulerplugin.kcfg
+ClassName=SchedulerPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables \ No newline at end of file
diff --git a/plugins/scheduler/schedulerprefpage.cpp b/plugins/scheduler/schedulerprefpage.cpp
new file mode 100644
index 0000000..fe82f34
--- /dev/null
+++ b/plugins/scheduler/schedulerprefpage.cpp
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "schedulerprefpage.h"
+#include "bwsprefpagewidget.h"
+#include "schedulerplugin.h"
+#include "schedulerpluginsettings.h"
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+
+namespace kt
+{
+
+ SchedulerPrefPage::SchedulerPrefPage(SchedulerPlugin* plugin)
+ : PrefPageInterface(i18n("Scheduler"), i18n("Scheduler plugin options"), KGlobal::iconLoader()->loadIcon("clock",KIcon::NoGroup)), m_plugin(plugin)
+ {
+ widget = 0;
+ }
+
+
+ SchedulerPrefPage::~SchedulerPrefPage()
+ {}
+
+ bool SchedulerPrefPage::apply()
+ {
+ widget->apply();
+// m_plugin->updateEnabledBWS();
+ return true;
+ }
+
+ void SchedulerPrefPage::createWidget( QWidget * parent )
+ {
+ widget = new SchedulerPrefPageWidget(parent);
+ }
+
+ void SchedulerPrefPage::updateData()
+ {}
+
+ void SchedulerPrefPage::deleteWidget()
+ {
+ delete widget;
+ widget = 0;
+ }
+}
diff --git a/plugins/scheduler/schedulerprefpage.h b/plugins/scheduler/schedulerprefpage.h
new file mode 100644
index 0000000..a10a98a
--- /dev/null
+++ b/plugins/scheduler/schedulerprefpage.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTSchedulerPREFPAGE_H
+#define KTSchedulerPREFPAGE_H
+
+#include <interfaces/prefpageinterface.h>
+
+#include "schedulerprefpagewidget.h"
+
+namespace kt
+{
+ class SchedulerPlugin;
+
+ /**
+ * @brief Scheduler Preferences Page.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class SchedulerPrefPage : public PrefPageInterface
+ {
+ public:
+ SchedulerPrefPage(SchedulerPlugin* plugin);
+ virtual ~SchedulerPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void updateData();
+ virtual void deleteWidget();
+
+ private:
+ SchedulerPlugin* m_plugin;
+ SchedulerPrefPageWidget* widget;
+ };
+}
+
+#endif
diff --git a/plugins/scheduler/schedulerprefpagewidget.cpp b/plugins/scheduler/schedulerprefpagewidget.cpp
new file mode 100644
index 0000000..d6e73dd
--- /dev/null
+++ b/plugins/scheduler/schedulerprefpagewidget.cpp
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 "schedulerprefpagewidget.h"
+#include "bwsprefpagewidget.h"
+#include "bwscheduler.h"
+#include "schedulerpluginsettings.h"
+
+#include <qcheckbox.h>
+#include <qtimer.h>
+#include <qpushbutton.h>
+#include <qgroupbox.h>
+
+namespace kt
+{
+
+ SchedulerPrefPageWidget::SchedulerPrefPageWidget(QWidget* parent, const char* name, WFlags fl)
+ : SchedulerPage(parent,name,fl)
+ {
+ groupBWS->setEnabled(false);
+ bool useit = SchedulerPluginSettings::enableBWS();
+ bool use_colors = SchedulerPluginSettings::useColors();
+ useBS->setChecked(useit);
+ useColors->setChecked(use_colors);
+ }
+
+
+ SchedulerPrefPageWidget::~SchedulerPrefPageWidget()
+ {}
+
+ void SchedulerPrefPageWidget::btnEditBWS_clicked()
+ {
+ BWSPrefPageWidget w(this);
+ w.exec();
+ }
+
+ void SchedulerPrefPageWidget::apply()
+ {
+ bool use_bws = useBS->isChecked();
+
+ SchedulerPluginSettings::setEnableBWS(use_bws);
+ SchedulerPluginSettings::setUseColors(useColors->isChecked());
+ SchedulerPluginSettings::writeConfig();
+
+ /* force trigger since the schedule has changed but after KTorrent::apply()
+ * Used QTimer with fixed interval - not very nice solution... */
+ if(useBS->isChecked())
+ QTimer::singleShot(1000, this, SLOT(scheduler_trigger()));
+
+ BWScheduler::instance().setEnabled(use_bws);
+ }
+
+ void SchedulerPrefPageWidget::scheduler_trigger()
+ {
+ BWScheduler::instance().trigger();
+ }
+
+ void SchedulerPrefPageWidget::useColors_toggled(bool)
+ {
+ SchedulerPluginSettings::setUseColors(useColors->isChecked());
+ SchedulerPluginSettings::writeConfig();
+ }
+
+}
+
+
+
diff --git a/plugins/scheduler/schedulerprefpagewidget.h b/plugins/scheduler/schedulerprefpagewidget.h
new file mode 100644
index 0000000..9f62c20
--- /dev/null
+++ b/plugins/scheduler/schedulerprefpagewidget.h
@@ -0,0 +1,50 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Ivan Vasić *
+ * ivasic@gmail.com *
+ * *
+ * 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 KTSCHEDULERPREFPAGEWIDGET_H
+#define KTSCHEDULERPREFPAGEWIDGET_H
+
+#include <qwidget.h>
+#include "schedulerpage.h"
+
+namespace kt
+{
+ /**
+ * @brief Scheduler Preferences Page.
+ * @author Ivan Vasic <ivasic@gmail.com>
+ */
+ class SchedulerPrefPageWidget : public SchedulerPage
+ {
+ Q_OBJECT
+ public:
+ SchedulerPrefPageWidget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+
+ ~SchedulerPrefPageWidget();
+
+ void apply();
+
+ public slots:
+ virtual void btnEditBWS_clicked();
+ void scheduler_trigger();
+ virtual void useColors_toggled(bool);
+ };
+
+}
+
+#endif
diff --git a/plugins/search/Makefile.am b/plugins/search/Makefile.am
new file mode 100644
index 0000000..af57f30
--- /dev/null
+++ b/plugins/search/Makefile.am
@@ -0,0 +1,28 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktsearchplugin.la
+noinst_HEADERS = searchplugin.h searchprefpage.h searchtab.h searchenginelist.h
+ktsearchplugin_la_SOURCES = searchplugin.cpp htmlpart.cpp searchbar.ui \
+ searchpref.ui searchwidget.cpp searchprefpage.cpp searchpluginsettings.kcfgc \
+ searchtab.cpp searchenginelist.cpp
+
+# Libs needed by the plugin
+ktsearchplugin_la_LIBADD = ../../libktorrent/libktorrent.la \
+ $(LIB_KHTML) $(LIB_KPARTS) $(LIB_QT) \
+ $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktsearchplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktsearchplugin
+# plugins_DATA = ktsearchpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktsearchplugin.desktop
+
+kde_kcfg_DATA = ktsearchplugin.kcfg
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/search/htmlpart.cpp b/plugins/search/htmlpart.cpp
new file mode 100644
index 0000000..b1c6b23
--- /dev/null
+++ b/plugins/search/htmlpart.cpp
@@ -0,0 +1,198 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kmessagebox.h>
+#include <kio/job.h>
+#include <kio/jobclasses.h>
+//#include <qfile.h>
+#include <qclipboard.h>
+#include <qapplication.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kparts/browserextension.h>
+#include <util/constants.h>
+#include <khtmlview.h>
+#include "htmlpart.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ HTMLPart::HTMLPart(QWidget *parent)
+ : KHTMLPart(parent)
+ {
+ setJScriptEnabled(true);
+ setJavaEnabled(true);
+ setMetaRefreshEnabled(true);
+ setPluginsEnabled(false);
+ setStatusMessagesEnabled(false);
+ KParts::BrowserExtension* ext = this->browserExtension();
+ connect(ext,SIGNAL(openURLRequest(const KURL&,const KParts::URLArgs&)),
+ this,SLOT(openURLRequest(const KURL&, const KParts::URLArgs& )));
+
+ ext->enableAction("copy",true);
+ ext->enableAction("paste",true);
+ active_job = 0;
+ }
+
+
+ HTMLPart::~HTMLPart()
+ {}
+
+ void HTMLPart::copy()
+ {
+ QString txt = selectedText();
+ QClipboard *cb = QApplication::clipboard();
+ // Copy text into the clipboard
+ if (cb)
+ cb->setText(txt,QClipboard::Clipboard);
+ }
+
+ void HTMLPart::openURLRequest(const KURL &u,const KParts::URLArgs &)
+ {
+ if (active_job)
+ {
+ active_job->kill(true);
+ active_job = 0;
+ }
+
+ KIO::TransferJob* j = KIO::get(u,false,false);
+ connect(j,SIGNAL(data(KIO::Job*,const QByteArray &)),
+ this,SLOT(dataRecieved(KIO::Job*, const QByteArray& )));
+ connect(j,SIGNAL(result(KIO::Job*)),this,SLOT(jobDone(KIO::Job* )));
+ connect(j,SIGNAL(mimetype(KIO::Job*, const QString &)),
+ this,SLOT(mimetype(KIO::Job*, const QString& )));
+
+ active_job = j;
+ curr_data.resize(0);
+ mime_type = QString::null;
+ curr_url = u;
+ }
+
+ void HTMLPart::back()
+ {
+ if (history.count() <= 1)
+ {
+ backAvailable(false);
+ }
+ else
+ {
+ history.pop_back();
+ KURL u = history.back();
+ openURL(u);
+ backAvailable(history.count() > 1 ? true : false);
+
+ }
+ }
+
+ void HTMLPart::addToHistory(const KURL & url)
+ {
+ history.append(url);
+ if (history.count() > 1)
+ backAvailable(true);
+ }
+
+ void HTMLPart::reload()
+ {
+ openURL(url());
+ }
+
+ void HTMLPart::dataRecieved(KIO::Job* job,const QByteArray & data)
+ {
+ if (job != active_job)
+ {
+ job->kill(true);
+ return;
+ }
+
+ if (data.size() == 0)
+ return;
+
+ Uint32 off = curr_data.size();
+ curr_data.resize(curr_data.size() + data.size());
+ for (Uint32 i = 0;i < data.size();i++)
+ {
+ curr_data[i + off] = data[i];
+ }
+ }
+
+ void HTMLPart::mimetype(KIO::Job* job,const QString & mt)
+ {
+ if (job != active_job)
+ {
+ job->kill(true);
+ return;
+ }
+
+ mime_type = mt;
+ }
+
+ void HTMLPart::jobDone(KIO::Job* job)
+ {
+ if (job != active_job)
+ {
+ job->kill(true);
+ return;
+ }
+
+ if (job->error() == 0)
+ {
+ bool is_bencoded_data = curr_data.size() > 0 &&
+ curr_data[0] == 'd' &&
+ curr_data[curr_data.size()-1] == 'e';
+
+ if (is_bencoded_data || mime_type == "application/x-bittorrent")
+ {
+ int ret = KMessageBox::questionYesNoCancel(0,
+ i18n("Do you want to download or save the torrent?"),
+ i18n("Download Torrent"),
+ KGuiItem(i18n("to download", "Download"),"down"),
+ KStdGuiItem::save());
+
+ if (ret == KMessageBox::Yes)
+ openTorrent(curr_url);
+ else if (ret == KMessageBox::No)
+ saveTorrent(curr_url);
+ }
+ else
+ {
+ addToHistory(curr_url);
+ begin(curr_url);
+ write(curr_data.data(),curr_data.size());
+ end();
+ view()->ensureVisible(0,0);
+ searchFinished();
+ }
+ }
+ else
+ {
+ begin(curr_url);
+ write(KIO::buildErrorString(job->error(),job->errorText()));/*,&curr_url));**/
+ end();
+ }
+ active_job = 0;
+ curr_data.resize(0);
+ curr_url = KURL();
+ mime_type = QString::null;
+ }
+}
+
+#include "htmlpart.moc"
diff --git a/plugins/search/htmlpart.h b/plugins/search/htmlpart.h
new file mode 100644
index 0000000..f5b78ee
--- /dev/null
+++ b/plugins/search/htmlpart.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 HTMLPART_H
+#define HTMLPART_H
+
+#include <khtml_part.h>
+
+namespace KIO
+{
+ class Job;
+}
+
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class HTMLPart : public KHTMLPart
+ {
+ Q_OBJECT
+ public:
+ HTMLPart(QWidget *parent = 0);
+ virtual ~HTMLPart();
+
+ public slots:
+ void back();
+ void reload();
+ void copy();
+ void openURLRequest(const KURL &url, const KParts::URLArgs &args);
+
+ private slots:
+ void addToHistory(const KURL & url);
+ void dataRecieved(KIO::Job* job,const QByteArray & data);
+ void mimetype(KIO::Job* job,const QString & mt);
+ void jobDone(KIO::Job* job);
+
+
+ signals:
+ void backAvailable(bool yes);
+ void openTorrent(const KURL & url);
+ void saveTorrent(const KURL & url);
+ void searchFinished();
+
+ private:
+ KURL::List history;
+ KIO::Job* active_job;
+ QByteArray curr_data;
+ QString mime_type;
+ KURL curr_url;
+ };
+}
+
+#endif
diff --git a/plugins/search/ktsearchplugin.desktop b/plugins/search/ktsearchplugin.desktop
new file mode 100644
index 0000000..0210135
--- /dev/null
+++ b/plugins/search/ktsearchplugin.desktop
@@ -0,0 +1,60 @@
+[Desktop Entry]
+Name=SearchPlugin
+Name[bg]=Приставка за търсене
+Name[br]=Lugent klask
+Name[da]=SøgePlugin
+Name[de]=Suche-Modul
+Name[el]=Πρόσθετο αναζήτησης
+Name[es]=Complemento de búsqueda
+Name[et]=Otsimisplugin
+Name[fa]=وصلۀ جستجو
+Name[it]=Plugin di ricerca
+Name[nb]=Søkemodul
+Name[nds]=Söök-Moduul
+Name[nl]=Zoekplugin
+Name[pl]=Wtyczka wyszukiwania
+Name[pt]='Plugin' de Procura
+Name[pt_BR]=Plugin de Busca
+Name[sk]=Vyhľadávací Plugin
+Name[sr]=Прикључак претраге
+Name[sr@Latn]=Priključak pretrage
+Name[sv]=Sökinsticksprogram
+Name[tr]=Arama Eklentisi
+Name[uk]=Втулок пошуку
+Name[xx]=xxSearchPluginxx
+Name[zh_CN]=搜索插件
+Name[zh_TW]=搜尋外掛程式
+Comment=Search plugin for KTorrent
+Comment[ar]=قابس البحث لِــ KTorrent
+Comment[bg]=Приставка за търсене (KTorrent)
+Comment[br]=Lugent klask evit KTorrent
+Comment[ca]=Connector de cerca per a KTorrent
+Comment[cs]=Vyhledávací modul pro KTorrent
+Comment[da]=Søge-plugin for KTorrent
+Comment[de]=Suche-Modul für KTorrent
+Comment[el]=Πρόσθετο αναζήτησης για το KTorrent
+Comment[es]=Complemento de búsqueda para KTorrent
+Comment[et]=KTorrenti otsimisplugin
+Comment[fa]=وصلۀ جستجو برای KTorrent
+Comment[gl]=Plugin de procuras para KTorrent
+Comment[it]=Plugin di ricerca per KTorrent
+Comment[ja]=KTorrent のための検索プラグイン
+Comment[ka]=ძებნის მოდული KTorrent-თვის
+Comment[nb]=Søkemodul for KTorrent
+Comment[nds]=Söök-Moduul för KTorrent
+Comment[nl]=Zoekplugin voor KTorrent
+Comment[pl]=Wtyczka wyszukiwania dla KTorrent
+Comment[pt]='Plugin' de procura para o KTorrent
+Comment[pt_BR]=Busca de plug-in para o KTorrent
+Comment[sk]=Vyhľadávací plugin pre KTorrent
+Comment[sr]=Прикључак претраге за KTorrent
+Comment[sr@Latn]=Priključak pretrage za KTorrent
+Comment[sv]=Sökinsticksprogram för Ktorrent
+Comment[tr]=KTorrent için arama eklentisi
+Comment[uk]=Втулок пошуку для KTorrent
+Comment[xx]=xxSearch plugin for KTorrentxx
+Comment[zh_CN]=KTorrent 的搜索插件
+Comment[zh_TW]=KTorrent 搜尋外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktsearchplugin
diff --git a/plugins/search/ktsearchplugin.kcfg b/plugins/search/ktsearchplugin.kcfg
new file mode 100644
index 0000000..fdcc141
--- /dev/null
+++ b/plugins/search/ktsearchplugin.kcfg
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktsearchpluginrc"/>
+ <group name="general">
+ <entry name="searchEngine" type="Int">
+ <label>Current search engine</label>
+ <default>0</default>
+ </entry>
+
+ <entry name="useDefaultBrowser" type ="Bool">
+ <label>Use default browser</label>
+ <default>true</default>
+ </entry>
+ <entry name="useCustomBrowser" type ="Bool">
+ <label>Use custom browser</label>
+ <default>false</default>
+ </entry>
+ <entry name="customBrowser" type ="String">
+ <label>Custom browser executable path</label>
+ <default>/usr/bin/firefox</default>
+ </entry>
+ <entry name="openInExternal" type = "Bool">
+ <default>false</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/search/searchbar.ui b/plugins/search/searchbar.ui
new file mode 100644
index 0000000..2b91ea0
--- /dev/null
+++ b/plugins/search/searchbar.ui
@@ -0,0 +1,99 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SearchBar</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SearchBar</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>804</width>
+ <height>52</height>
+ </rect>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_back</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_reload</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_clear_button</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_search_text</cstring>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_search_button</cstring>
+ </property>
+ <property name="text">
+ <string>Search</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Maximum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>60</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Search engine:</string>
+ </property>
+ </widget>
+ <widget class="KComboBox">
+ <property name="name">
+ <cstring>m_search_engine</cstring>
+ </property>
+ </widget>
+ </hbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kcombobox.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/search/searchenginelist.cpp b/plugins/search/searchenginelist.cpp
new file mode 100644
index 0000000..cf7a11b
--- /dev/null
+++ b/plugins/search/searchenginelist.cpp
@@ -0,0 +1,134 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qfile.h>
+#include <qtextstream.h>
+#include <qstringlist.h>
+#include "searchenginelist.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ SearchEngineList::SearchEngineList()
+ {}
+
+
+ SearchEngineList::~SearchEngineList()
+ {}
+
+ void SearchEngineList::save(const QString& file)
+ {
+ QFile fptr(file);
+ if (!fptr.open(IO_WriteOnly))
+ return;
+
+ QTextStream out(&fptr);
+ out << "# PLEASE DO NOT MODIFY THIS FILE. Use KTorrent configuration dialog for adding new search engines." << ::endl;
+ out << "# SEARCH ENGINES list" << ::endl;
+
+ QValueList<SearchEngine>::iterator i = m_search_engines.begin();
+ while (i != m_search_engines.end())
+ {
+ SearchEngine & e = *i;
+
+ // replace spaces by %20
+ QString name = e.name;
+ name = name.replace(" ","%20");
+ QString u = e.url.prettyURL();
+ u = u.replace(" ","%20");
+ out << name << " " << u << ::endl;
+ i++;
+ }
+ }
+
+ void SearchEngineList::load(const QString& file)
+ {
+ m_search_engines.clear();
+
+ QFile fptr(file);
+
+ if(!fptr.exists())
+ makeDefaultFile(file);
+
+ if (!fptr.open(IO_ReadOnly))
+ return;
+
+ QTextStream in(&fptr);
+
+ int id = 0;
+
+ while (!in.atEnd())
+ {
+ QString line = in.readLine();
+
+ if(line.startsWith("#") || line.startsWith(" ") || line.isEmpty() ) continue;
+
+ QStringList tokens = QStringList::split(" ", line);
+
+ SearchEngine se;
+ se.name = tokens[0];
+ se.name = se.name.replace("%20"," ");
+ se.url = KURL::fromPathOrURL(tokens[1]);
+
+ for(Uint32 i=2; i<tokens.count(); ++i)
+ se.url.addQueryItem(tokens[i].section("=",0,0), tokens[i].section("=", 1, 1));
+
+ m_search_engines.append(se);
+ }
+ }
+
+ void SearchEngineList::makeDefaultFile(const QString& file)
+ {
+ QFile fptr(file);
+ if (!fptr.open(IO_WriteOnly))
+ return;
+
+ QTextStream out(&fptr);
+ out << "# PLEASE DO NOT MODIFY THIS FILE. Use KTorrent configuration dialog for adding new search engines." << ::endl;
+ out << "# SEARCH ENGINES list" << ::endl;
+ out << "KTorrents http://www.ktorrents.com/search.php?lg=0&sourceid=ktorrent&q=FOOBAR&f=0" << ::endl;
+ out << "bittorrent.com http://www.bittorrent.com/search_result.myt?search=FOOBAR" << ::endl;
+ out << "isohunt.com http://isohunt.com/torrents.php?ihq=FOOBAR&op=and" << ::endl;
+ out << "mininova.org http://www.mininova.org/search.php?search=FOOBAR" << ::endl;
+ out << "thepiratebay.org http://thepiratebay.org/search.php?q=FOOBAR" << ::endl;
+ out << "bitoogle.com http://bitoogle.com/search.php?q=FOOBAR" << ::endl;
+ out << "bytenova.org http://www.bitenova.org/search.php?search=FOOBAR&start=0&start=0&ie=utf-8&oe=utf-8" << ::endl;
+ out << "torrentspy.com http://torrentspy.com/search.asp?query=FOOBAR" << ::endl;
+ out << "torrentz.com http://www.torrentz.com/search_FOOBAR" << ::endl;
+ }
+
+ KURL SearchEngineList::getSearchURL(bt::Uint32 engine) const
+ {
+ if (engine >= m_search_engines.count())
+ return KURL();
+ else
+ return m_search_engines[engine].url;
+ }
+
+ QString SearchEngineList::getEngineName(bt::Uint32 engine) const
+ {
+ if (engine >= m_search_engines.count())
+ return QString::null;
+ else
+ return m_search_engines[engine].name;
+ }
+
+}
diff --git a/plugins/search/searchenginelist.h b/plugins/search/searchenginelist.h
new file mode 100644
index 0000000..236b8eb
--- /dev/null
+++ b/plugins/search/searchenginelist.h
@@ -0,0 +1,60 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTSEARCHENGINELIST_H
+#define KTSEARCHENGINELIST_H
+
+#include <kurl.h>
+#include <qvaluelist.h>
+#include <util/constants.h>
+
+namespace kt
+{
+
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class SearchEngineList
+ {
+ struct SearchEngine
+ {
+ QString name;
+ KURL url;
+ };
+
+ QValueList<SearchEngine> m_search_engines;
+ public:
+ SearchEngineList();
+ virtual ~SearchEngineList();
+
+ void save(const QString& file);
+ void load(const QString& file);
+ void makeDefaultFile(const QString& file);
+
+ KURL getSearchURL(bt::Uint32 engine) const;
+ QString getEngineName(bt::Uint32 engine) const;
+
+ /// Get the number of engines
+ bt::Uint32 getNumEngines() const {return m_search_engines.count();}
+ };
+
+}
+
+#endif
diff --git a/plugins/search/searchplugin.cpp b/plugins/search/searchplugin.cpp
new file mode 100644
index 0000000..c674369
--- /dev/null
+++ b/plugins/search/searchplugin.cpp
@@ -0,0 +1,157 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kstdaction.h>
+#include <kpopupmenu.h>
+#include <kapplication.h>
+#include <kstandarddirs.h>
+#include <krun.h>
+#include <interfaces/guiinterface.h>
+#include "searchplugin.h"
+#include "searchwidget.h"
+#include "searchprefpage.h"
+#include "searchtab.h"
+#include "searchpluginsettings.h"
+#include "searchenginelist.h"
+
+
+#define NAME "Search"
+#define AUTHOR "Joris Guisson"
+#define EMAIL "joris.guisson@gmail.com"
+
+
+
+K_EXPORT_COMPONENT_FACTORY(ktsearchplugin,KGenericFactory<kt::SearchPlugin>("ktsearchplugin"))
+
+namespace kt
+{
+
+ SearchPlugin::SearchPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("Search"),AUTHOR,EMAIL,
+ i18n("Search for torrents on several popular torrent search engines"),"viewmag")
+ {
+ // setXMLFile("ktsearchpluginui.rc");
+ pref = 0;
+ tab = 0;
+ }
+
+
+ SearchPlugin::~SearchPlugin()
+ {}
+
+
+ void SearchPlugin::load()
+ {
+ engines.load(KGlobal::dirs()->saveLocation("data","ktorrent") + "search_engines");
+ KToolBar* tb = getGUI()->addToolBar("search");
+ tab = new SearchTab(tb);
+ connect(tab,SIGNAL(search( const QString&, int, bool )),
+ this,SLOT(search( const QString&, int, bool )));
+
+ pref = new SearchPrefPage(this);
+ getGUI()->addPrefPage(pref);
+ pref->updateData();
+ tab->updateSearchEngines(engines);
+ }
+
+ void SearchPlugin::unload()
+ {
+ tab->saveSettings();
+ SearchWidget* s = 0;
+ while ((s = searches.first()) != 0)
+ {
+ getGUI()->removeTabPage(s);
+ searches.removeFirst();
+ delete s;
+ }
+ getGUI()->removeToolBar(tab->getToolBar());
+ getGUI()->removePrefPage(pref);
+ delete pref;
+ pref = 0;
+ delete tab;
+ tab = 0;
+ }
+
+ void SearchPlugin::search(const QString & text,int engine,bool external)
+ {
+ if(external)
+ {
+ const SearchEngineList& sl = getSearchEngineList();
+
+ if (engine < 0 || engine >= sl.getNumEngines())
+ engine = 0;
+
+ QString s_url = sl.getSearchURL(engine).prettyURL();
+ s_url.replace("FOOBAR", KURL::encode_string(text), true);
+ KURL url = KURL::fromPathOrURL(s_url);
+
+ if(SearchPluginSettings::useDefaultBrowser())
+ kapp->invokeBrowser(url.url());
+ else
+ KRun::runCommand(QString("%1 \"%2\"").arg(SearchPluginSettings::customBrowser()).arg(url.url()), SearchPluginSettings::customBrowser(), "viewmag" );
+
+ return;
+ }
+
+ KIconLoader* iload = KGlobal::iconLoader();
+
+ SearchWidget* search = new SearchWidget(this);
+ getGUI()->addTabPage(search,iload->loadIconSet("viewmag", KIcon::Small),text,this);
+
+ KAction* copy_act = KStdAction::copy(search,SLOT(copy()),actionCollection());
+ copy_act->plug(search->rightClickMenu(),0);
+ searches.append(search);
+
+ search->updateSearchEngines(engines);
+ search->search(text,engine);
+ }
+
+ void SearchPlugin::preferencesUpdated()
+ {
+ engines.load(KGlobal::dirs()->saveLocation("data","ktorrent") + "search_engines");
+ if (tab)
+ tab->updateSearchEngines(engines);
+
+ for (QPtrList<SearchWidget>::iterator i = searches.begin(); i != searches.end();i++)
+ {
+ SearchWidget* w = *i;
+ w->updateSearchEngines(engines);
+ }
+ }
+
+ void SearchPlugin::tabCloseRequest(kt::GUIInterface* gui,QWidget* tab)
+ {
+ if (searches.contains((SearchWidget*)tab))
+ {
+ searches.remove((SearchWidget*)tab);
+ gui->removeTabPage(tab);
+ tab->deleteLater();
+ }
+ }
+
+ bool SearchPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+}
+#include "searchplugin.moc"
diff --git a/plugins/search/searchplugin.h b/plugins/search/searchplugin.h
new file mode 100644
index 0000000..ce65499
--- /dev/null
+++ b/plugins/search/searchplugin.h
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTSEARCHPLUGIN_H
+#define KTSEARCHPLUGIN_H
+
+#include <qptrlist.h>
+#include <interfaces/plugin.h>
+#include <interfaces/guiinterface.h>
+#include "searchenginelist.h"
+
+namespace kt
+{
+ class SearchWidget;
+ class SearchPrefPage;
+ class SearchTab;
+
+ /**
+ @author Joris Guisson
+ */
+ class SearchPlugin : public Plugin, public kt::CloseTabListener
+ {
+ Q_OBJECT
+ public:
+ SearchPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~SearchPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+
+ void preferencesUpdated();
+
+ const SearchEngineList & getSearchEngineList() const {return engines;}
+ private slots:
+ void search(const QString & text,int engine,bool external);
+
+ private:
+ virtual void tabCloseRequest(kt::GUIInterface* gui,QWidget* tab);
+
+ private:
+ SearchPrefPage* pref;
+ SearchTab* tab;
+ SearchEngineList engines;
+ QPtrList<SearchWidget> searches;
+ };
+
+}
+
+#endif
diff --git a/plugins/search/searchpluginsettings.kcfgc b/plugins/search/searchpluginsettings.kcfgc
new file mode 100644
index 0000000..8b3488b
--- /dev/null
+++ b/plugins/search/searchpluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktsearchplugin.kcfg
+ClassName=SearchPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables
diff --git a/plugins/search/searchpref.ui b/plugins/search/searchpref.ui
new file mode 100644
index 0000000..8c8c026
--- /dev/null
+++ b/plugins/search/searchpref.ui
@@ -0,0 +1,320 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SEPreferences</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>SEPreferences</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>529</width>
+ <height>515</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>500</width>
+ <height>350</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Search Preferences</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>External Browser</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>openExternal</cstring>
+ </property>
+ <property name="text">
+ <string>Open searches in external browser</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>useDefaultBrowser</cstring>
+ </property>
+ <property name="text">
+ <string>Use default browser</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout29</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>useCustomBrowser</cstring>
+ </property>
+ <property name="text">
+ <string>Custom browser path:</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>customBrowser</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer20</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox8</cstring>
+ </property>
+ <property name="title">
+ <string>Search Engines</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KActiveLabel">
+ <property name="name">
+ <cstring>m_infoLabel</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout22</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Search engine name:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_engine_name</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>URL:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>m_engine_url</cstring>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnAdd</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&amp;Add</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>Engines</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>URL</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_engines</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>7</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>50</height>
+ </size>
+ </property>
+ <property name="resizeMode">
+ <enum>AllColumns</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnRemove</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Remove</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btnRemoveAll</cstring>
+ </property>
+ <property name="text">
+ <string>R&amp;emove All</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer19</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Maximum</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>16</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>btn_add_default</cstring>
+ </property>
+ <property name="text">
+ <string>Add Defau&amp;lt</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>btnUpdate</cstring>
+ </property>
+ <property name="text">
+ <string>Update From Internet</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>btnUpdate</sender>
+ <signal>clicked()</signal>
+ <receiver>SEPreferences</receiver>
+ <slot>btnUpdate_clicked()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>btnUpdate_clicked()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klineedit.h</includehint>
+ <includehint>kactivelabel.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/search/searchprefpage.cpp b/plugins/search/searchprefpage.cpp
new file mode 100644
index 0000000..2285ead
--- /dev/null
+++ b/plugins/search/searchprefpage.cpp
@@ -0,0 +1,289 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson, Ivan Vasic *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include <qtooltip.h>
+#include <qfile.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+#include <kactivelabel.h>
+#include <kpushbutton.h>
+#include <klistview.h>
+#include <klineedit.h>
+#include <kmessagebox.h>
+#include <kio/netaccess.h>
+#include <klineedit.h>
+
+#include <qlabel.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+
+#include <util/constants.h>
+#include "searchprefpage.h"
+#include "searchplugin.h"
+#include "searchenginelist.h"
+#include "searchpluginsettings.h"
+
+using namespace bt;
+
+namespace kt
+{
+ SearchPrefPageWidget::SearchPrefPageWidget(QWidget *parent) : SEPreferences(parent)
+ {
+ QString info = i18n("Use your web browser to search for the string %1"
+ " (capital letters) on the search engine you want to add. <br> "
+ "Then copy the URL in the addressbar after the search is finished, and paste it here.<br><br>Searching for %1"
+ " on Google for example, will result in http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. <br> "
+ "If you add this URL here, ktorrent can search using Google.").arg("FOOBAR").arg("FOOBAR");
+ QString info_short = i18n("Use your web browser to search for the string %1 (capital letters) "
+ "on the search engine you want to add. Use the resulting URL below.").arg("FOOBAR");
+ m_infoLabel->setText(info_short);
+ QToolTip::add(m_infoLabel,info);
+ QToolTip::add(m_engine_name,info);
+
+ connect(btnAdd, SIGNAL(clicked()), this, SLOT(addClicked()));
+ connect(btnRemove, SIGNAL(clicked()), this, SLOT(removeClicked()));
+ connect(btn_add_default, SIGNAL(clicked()), this, SLOT(addDefaultClicked()));
+ connect(btnRemoveAll, SIGNAL(clicked()), this, SLOT(removeAllClicked()));
+
+ connect(useCustomBrowser, SIGNAL(toggled(bool)), this, SLOT(customToggled( bool )));
+
+ useCustomBrowser->setChecked(SearchPluginSettings::useCustomBrowser());
+ useDefaultBrowser->setChecked(SearchPluginSettings::useDefaultBrowser());
+ customBrowser->setText(SearchPluginSettings::customBrowser());
+
+ customBrowser->setEnabled(useCustomBrowser->isChecked());
+ openExternal->setChecked(SearchPluginSettings::openInExternal());
+ }
+
+ void SearchPrefPageWidget::updateSearchEngines(const SearchEngineList & se)
+ {
+ m_engines->clear();
+
+ for (Uint32 i = 0;i < se.getNumEngines();i++)
+ {
+ new QListViewItem(m_engines,se.getEngineName(i),se.getSearchURL(i).prettyURL());
+ }
+ }
+
+ bool SearchPrefPageWidget::apply()
+ {
+ saveSearchEngines();
+
+ SearchPluginSettings::setUseCustomBrowser(useCustomBrowser->isChecked());
+ SearchPluginSettings::setUseDefaultBrowser(useDefaultBrowser->isChecked());
+ SearchPluginSettings::setCustomBrowser(customBrowser->text());
+ SearchPluginSettings::setOpenInExternal(openExternal->isChecked());
+ SearchPluginSettings::writeConfig();
+ return true;
+ }
+
+ void SearchPrefPageWidget::saveSearchEngines()
+ {
+ QFile fptr(KGlobal::dirs()->saveLocation("data","ktorrent") + "search_engines");
+ if (!fptr.open(IO_WriteOnly))
+ return;
+ QTextStream out(&fptr);
+ out << "# PLEASE DO NOT MODIFY THIS FILE. Use KTorrent configuration dialog for adding new search engines." << ::endl;
+ out << "# SEARCH ENGINES list" << ::endl;
+
+ QListViewItemIterator itr(m_engines);
+ while (itr.current())
+ {
+ QListViewItem* item = itr.current();
+ QString u = item->text(1);
+ QString name = item->text(0);
+ out << name.replace(" ","%20") << " " << u.replace(" ","%20") << endl;
+ itr++;
+ }
+ }
+
+ void SearchPrefPageWidget::addClicked()
+ {
+ if ( m_engine_url->text().isEmpty() || m_engine_name->text().isEmpty() )
+ {
+ KMessageBox::error(this, i18n("You must enter the search engine's name and URL"));
+ }
+ else if ( m_engine_url->text().contains("FOOBAR") )
+ {
+ KURL url = KURL::fromPathOrURL(m_engine_url->text());
+ if ( !url.isValid() )
+ {
+ KMessageBox::error(this, i18n("Malformed URL."));
+ return;
+ }
+
+ if (m_engines->findItem(m_engine_name->text(), 0))
+ {
+ KMessageBox::error(this, i18n("A search engine with the same name already exists. Please use a different name.")); return;
+ }
+
+ new QListViewItem(m_engines, m_engine_name->text(), m_engine_url->text());
+ m_engine_url->setText("");
+ m_engine_name->setText("");
+ }
+ else
+ {
+ KMessageBox::error(this, i18n("Bad URL. You should search for FOOBAR with your Internet browser and copy/paste the exact URL here."));
+ }
+ }
+
+ void SearchPrefPageWidget::removeClicked()
+ {
+ if ( m_engines->selectedItem() == 0 )
+ return;
+
+ QListViewItem* item = m_engines->selectedItem();
+ m_engines->takeItem(item);
+ delete item;
+ }
+
+ void SearchPrefPageWidget::addDefaultClicked()
+ {
+ QListViewItem* se = new QListViewItem(m_engines, "KTorrents", "http://www.ktorrents.com/search.php?lg=0&sourceid=ktorrent&q=FOOBAR&f=0");
+
+ se = new QListViewItem(m_engines, "bittorrent.com", "http://search.bittorrent.com/search.jsp?query=FOOBAR");
+
+ se = new QListViewItem(m_engines, "isohunt.com", "http://isohunt.com/torrents.php?ihq=FOOBAR&op=and");
+
+ se = new QListViewItem(m_engines, "mininova.org", "http://www.mininova.org/search.php?search=FOOBAR");
+
+ se = new QListViewItem(m_engines, "thepiratebay.org", "http://thepiratebay.org/search.php?q=FOOBAR");
+
+ se = new QListViewItem(m_engines, "bitoogle.com", "http://bitoogle.com/search.php?q=FOOBAR");
+
+ se = new QListViewItem(m_engines, "bytenova.org", "http://www.bitenova.org/search.php?search=FOOBAR&start=0&start=0&ie=utf-8&oe=utf-8");
+
+ se = new QListViewItem(m_engines, "torrentspy.com", "http://torrentspy.com/search.asp?query=FOOBAR");
+
+ se = new QListViewItem(m_engines, "torrentz.com", "http://www.torrentz.com/search_FOOBAR");
+ }
+
+ void SearchPrefPageWidget::removeAllClicked()
+ {
+ m_engines->clear();
+ }
+
+ void SearchPrefPageWidget::btnUpdate_clicked()
+ {
+ QString fn = KGlobal::dirs()->saveLocation("data","ktorrent") + "search_engines.tmp";
+ KURL source("http://www.ktorrent.org/downloads/search_engines");
+
+ if (KIO::NetAccess::download(source,fn,NULL))
+ {
+ //list successfully downloaded, remove temporary file
+ updateList(fn);
+ saveSearchEngines();
+ KIO::NetAccess::removeTempFile(fn);
+ }
+ }
+
+ void SearchPrefPageWidget::updateList(QString& source)
+ {
+ QFile fptr(source);
+
+ if (!fptr.open(IO_ReadOnly))
+ return;
+
+ QTextStream in(&fptr);
+
+ QMap<QString,KURL> engines;
+
+ while (!in.atEnd())
+ {
+ QString line = in.readLine();
+
+ if(line.startsWith("#") || line.startsWith(" ") || line.isEmpty() )
+ continue;
+
+ QStringList tokens = QStringList::split(" ", line);
+ QString name = tokens[0];
+ name = name.replace("%20"," ");
+
+ KURL url = KURL::fromPathOrURL(tokens[1]);
+ for(Uint32 i=2; i<tokens.count(); ++i)
+ url.addQueryItem(tokens[i].section("=",0,0), tokens[i].section("=", 1, 1));
+
+ engines.insert(name,url);
+ }
+
+ QMap<QString,KURL>::iterator i = engines.begin();
+ while (i != engines.end())
+ {
+ QListViewItem* item = m_engines->findItem(i.key(),0);
+ // if we have found the item, replace it if not make a new one
+ if (item)
+ item->setText(1, i.data().prettyURL());
+ else
+ new QListViewItem(m_engines,i.key(),i.data().prettyURL());
+
+ i++;
+ }
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+
+
+ SearchPrefPage::SearchPrefPage(SearchPlugin* plugin)
+ : PrefPageInterface(i18n("a noun", "Search"), i18n("Search Engine Options"),
+ KGlobal::iconLoader()->loadIcon("viewmag",KIcon::NoGroup)), m_plugin(plugin)
+ {
+ widget = 0;
+ }
+
+
+ SearchPrefPage::~SearchPrefPage()
+ {}
+
+
+ bool SearchPrefPage::apply()
+ {
+ bool ret = widget->apply();
+ if(ret)
+ m_plugin->preferencesUpdated();
+
+ return ret;
+ }
+
+ void SearchPrefPage::createWidget(QWidget* parent)
+ {
+ widget = new SearchPrefPageWidget(parent);
+ }
+
+ void SearchPrefPage::deleteWidget()
+ {
+ delete widget;
+ }
+
+ void SearchPrefPage::updateData()
+ {
+ widget->updateSearchEngines(m_plugin->getSearchEngineList());
+
+ }
+
+ void SearchPrefPageWidget::customToggled(bool toggled)
+ {
+ customBrowser->setEnabled(toggled);
+ }
+}
+
+#include "searchprefpage.moc"
diff --git a/plugins/search/searchprefpage.h b/plugins/search/searchprefpage.h
new file mode 100644
index 0000000..a8d647d
--- /dev/null
+++ b/plugins/search/searchprefpage.h
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTSEARCHPREFPAGE_H
+#define KTSEARCHPREFPAGE_H
+
+
+#include <interfaces/prefpageinterface.h>
+#include "searchpref.h"
+
+#include <qstring.h>
+
+namespace kt
+{
+ class SearchPlugin;
+ class SearchEngineList;
+
+ class SearchPrefPageWidget : public SEPreferences
+ {
+ Q_OBJECT
+ public:
+ SearchPrefPageWidget(QWidget *parent = 0);
+
+ bool apply();
+ void saveSearchEngines();
+ void updateList(QString& source);
+
+ void updateSearchEngines(const SearchEngineList & se);
+
+ public slots:
+ virtual void btnUpdate_clicked();
+ void customToggled(bool toggled);
+
+ private slots:
+ void addClicked();
+ void removeClicked();
+ void addDefaultClicked();
+ void removeAllClicked();
+ };
+
+ /**
+ @author Joris Guisson
+ */
+ class SearchPrefPage : public PrefPageInterface
+ {
+ public:
+ SearchPrefPage(SearchPlugin* plugin);
+ virtual ~SearchPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void updateData();
+ virtual void deleteWidget();
+
+ private:
+ SearchPrefPageWidget* widget;
+ SearchPlugin* m_plugin;
+ };
+
+}
+
+#endif
diff --git a/plugins/search/searchtab.cpp b/plugins/search/searchtab.cpp
new file mode 100644
index 0000000..1beaa6a
--- /dev/null
+++ b/plugins/search/searchtab.cpp
@@ -0,0 +1,169 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qfile.h>
+#include <qtextstream.h>
+#include <qapplication.h>
+#include <qlistbox.h>
+#include <qcheckbox.h>
+#include <kglobal.h>
+#include <kpushbutton.h>
+#include <kiconloader.h>
+#include <kcombobox.h>
+#include <kcompletion.h>
+#include <qlabel.h>
+#include <klocale.h>
+#include "searchtab.h"
+#include "searchenginelist.h"
+#include "searchpluginsettings.h"
+#include "functions.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ SearchTab::SearchTab(KToolBar* tb) : m_tool_bar(tb)
+ {
+ m_search_text = new KComboBox(tb);
+ m_search_text->setEditable(true);
+
+ m_clear_button = new KPushButton(tb);
+ m_search_new_tab = new KPushButton(i18n("Search"),tb);
+ m_search_engine = new KComboBox(tb);
+
+ m_clear_button->setIconSet(SmallIconSet(QApplication::reverseLayout() ? "clear_left" : "locationbar_erase"));
+ m_clear_button->setEnabled(false);
+
+ connect(m_search_new_tab,SIGNAL(clicked()),this,SLOT(searchNewTabPressed()));
+ connect(m_search_text,SIGNAL(returnPressed(const QString&)),this,SLOT(searchBoxReturn( const QString& )));
+ connect(m_search_text,SIGNAL(textChanged(const QString &)),this,SLOT(textChanged( const QString& )));
+ connect(m_clear_button,SIGNAL(clicked()),this,SLOT(clearButtonPressed()));
+ m_search_text->setMaxCount(20);
+ m_search_new_tab->setEnabled(false);
+ m_search_text->setInsertionPolicy(QComboBox::NoInsertion);
+
+ tb->insertWidget(1,-1,m_clear_button);
+ tb->insertWidget(2,-1,m_search_text);
+ tb->insertWidget(3,-1,m_search_new_tab);
+ tb->insertWidget(4,-1,new QLabel(i18n(" Engine: "),tb));
+ tb->insertWidget(5,-1,m_search_engine);
+ loadSearchHistory();
+ }
+
+ SearchTab::~SearchTab()
+ {
+ }
+
+ void SearchTab::saveSettings()
+ {
+ SearchPluginSettings::setSearchEngine(m_search_engine->currentItem());
+ SearchPluginSettings::writeConfig();
+ }
+
+ void SearchTab::updateSearchEngines(const SearchEngineList & sl)
+ {
+ int ci = 0;
+ if (m_search_engine->count() == 0)
+ ci = SearchPluginSettings::searchEngine();
+ else
+ ci = m_search_engine->currentItem();
+
+ m_search_engine->clear();
+ for (Uint32 i = 0;i < sl.getNumEngines();i++)
+ {
+ m_search_engine->insertItem(sl.getEngineName(i));
+ }
+ m_search_engine->setCurrentItem(ci);
+ }
+
+ void SearchTab::searchBoxReturn(const QString & str)
+ {
+ KCompletion *comp = m_search_text->completionObject();
+ if (!m_search_text->contains(str))
+ {
+ comp->addItem(str);
+ m_search_text->insertItem(str);
+ }
+ m_search_text->clearEdit();
+ saveSearchHistory();
+ search(str,m_search_engine->currentItem(),SearchPluginSettings::openInExternal());
+ }
+
+ void SearchTab::clearButtonPressed()
+ {
+ m_search_text->clearEdit();
+ }
+
+ void SearchTab::searchNewTabPressed()
+ {
+ searchBoxReturn(m_search_text->currentText());
+ }
+
+ void SearchTab::textChanged(const QString & str)
+ {
+ m_search_new_tab->setEnabled(str.length() > 0);
+ m_clear_button->setEnabled(str.length() > 0);
+ }
+
+ void SearchTab::loadSearchHistory()
+ {
+ QFile fptr(kt::DataDir() + "search_history");
+ if (!fptr.open(IO_ReadOnly))
+ return;
+
+ KCompletion *comp = m_search_text->completionObject();
+
+ Uint32 cnt = 0;
+ QTextStream in(&fptr);
+ while (!in.atEnd() && cnt < 50)
+ {
+ QString line = in.readLine();
+ if (line.isNull())
+ break;
+
+ if (!m_search_text->contains(line))
+ {
+ comp->addItem(line);
+ m_search_text->insertItem(line);
+ }
+ cnt++;
+ }
+
+ m_search_text->clearEdit();
+ }
+
+ void SearchTab::saveSearchHistory()
+ {
+ QFile fptr(kt::DataDir() + "search_history");
+ if (!fptr.open(IO_WriteOnly))
+ return;
+
+ QTextStream out(&fptr);
+ KCompletion *comp = m_search_text->completionObject();
+ QStringList items = comp->items();
+ for (QStringList::iterator i = items.begin();i != items.end();i++)
+ {
+ out << *i << endl;
+ }
+ }
+}
+
+#include "searchtab.moc"
+
diff --git a/plugins/search/searchtab.h b/plugins/search/searchtab.h
new file mode 100644
index 0000000..c392de9
--- /dev/null
+++ b/plugins/search/searchtab.h
@@ -0,0 +1,77 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 SEARCHTAB_H
+#define SEARCHTAB_H
+
+#include <ktoolbar.h>
+
+class KComboBox;
+class KPushButton;
+
+namespace kt
+{
+ class SearchEngineList;
+
+ /**
+ Holds all widgets of the toolbar of the search plugin.
+ */
+ class SearchTab : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ SearchTab(KToolBar* toolbar);
+ virtual ~SearchTab();
+
+ /// Get the tool bar
+ KToolBar* getToolBar() {return m_tool_bar;}
+
+ /// Update the search engine list
+ void updateSearchEngines(const SearchEngineList & sl);
+
+ /// Save settings like current search engine
+ void saveSettings();
+
+ protected slots:
+ void clearButtonPressed();
+ void searchNewTabPressed();
+ void searchBoxReturn(const QString & str);
+ void textChanged(const QString & str);
+
+ signals:
+ /// Emitted when the user presses enter or clicks search
+ void search(const QString & text,int engine,bool external);
+
+ private:
+ void loadSearchHistory();
+ void saveSearchHistory();
+
+ private:
+ KToolBar* m_tool_bar;
+ KComboBox* m_search_text;
+ KComboBox* m_search_engine;
+ KPushButton* m_clear_button;
+ KPushButton* m_search_new_tab;
+ };
+}
+
+#endif
+
diff --git a/plugins/search/searchwidget.cpp b/plugins/search/searchwidget.cpp
new file mode 100644
index 0000000..2ed19e8
--- /dev/null
+++ b/plugins/search/searchwidget.cpp
@@ -0,0 +1,272 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson, Ivan Vasic *
+ * joris.guisson@gmail.com *
+ * ivasic@gmail.com *
+ * *
+ * 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 <kapplication.h>
+#include <khtmlview.h>
+#include <qlayout.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <klineedit.h>
+#include <kpushbutton.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <kiconloader.h>
+#include <kcombobox.h>
+#include <kpopupmenu.h>
+#include <kparts/partmanager.h>
+#include <kio/job.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+#include <kprogress.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <interfaces/guiinterface.h>
+#include <interfaces/coreinterface.h>
+#include "searchwidget.h"
+#include "searchbar.h"
+#include "htmlpart.h"
+#include "searchplugin.h"
+#include "searchenginelist.h"
+
+
+
+using namespace bt;
+
+namespace kt
+{
+
+
+ SearchWidget::SearchWidget(SearchPlugin* sp) : html_part(0),sp(sp)
+ {
+ QVBoxLayout* layout = new QVBoxLayout(this);
+ layout->setAutoAdd(true);
+ sbar = new SearchBar(this);
+ html_part = new HTMLPart(this);
+
+ right_click_menu = new KPopupMenu(this);
+ right_click_menu->insertSeparator();
+ back_id = right_click_menu->insertItem(
+ KGlobal::iconLoader()->loadIconSet(QApplication::reverseLayout()
+ ? "forward" : "back",KIcon::Small),
+ i18n("Back"),html_part,SLOT(back()));
+ right_click_menu->insertItem(
+ KGlobal::iconLoader()->loadIconSet("reload",KIcon::Small),
+ i18n("Reload"),html_part,SLOT(reload()));
+
+ right_click_menu->setItemEnabled(back_id,false);
+ sbar->m_back->setEnabled(false);
+ connect(sbar->m_search_button,SIGNAL(clicked()),this,SLOT(searchPressed()));
+ connect(sbar->m_clear_button,SIGNAL(clicked()),this,SLOT(clearPressed()));
+ connect(sbar->m_search_text,SIGNAL(returnPressed()),this,SLOT(searchPressed()));
+ connect(sbar->m_back,SIGNAL(clicked()),html_part,SLOT(back()));
+ connect(sbar->m_reload,SIGNAL(clicked()),html_part,SLOT(reload()));
+
+ sbar->m_clear_button->setIconSet(
+ KGlobal::iconLoader()->loadIconSet(QApplication::reverseLayout()
+ ? "clear_left" : "locationbar_erase",KIcon::Small));
+ sbar->m_back->setIconSet(
+ KGlobal::iconLoader()->loadIconSet(QApplication::reverseLayout()
+ ? "forward" : "back", KIcon::Small));
+ sbar->m_reload->setIconSet(
+ KGlobal::iconLoader()->loadIconSet("reload",KIcon::Small));
+
+
+ connect(html_part,SIGNAL(backAvailable(bool )),
+ this,SLOT(onBackAvailable(bool )));
+ connect(html_part,SIGNAL(onURL(const QString& )),
+ this,SLOT(onURLHover(const QString& )));
+ connect(html_part,SIGNAL(openTorrent(const KURL& )),
+ this,SLOT(onOpenTorrent(const KURL& )));
+ connect(html_part,SIGNAL(popupMenu(const QString&, const QPoint& )),
+ this,SLOT(showPopupMenu(const QString&, const QPoint& )));
+ connect(html_part,SIGNAL(searchFinished()),this,SLOT(onFinished()));
+ connect(html_part,SIGNAL(saveTorrent(const KURL& )),
+ this,SLOT(onSaveTorrent(const KURL& )));
+
+ KParts::PartManager* pman = html_part->partManager();
+ connect(pman,SIGNAL(partAdded(KParts::Part*)),this,SLOT(onFrameAdded(KParts::Part* )));
+
+ connect(html_part->browserExtension(),SIGNAL(loadingProgress(int)),this,SLOT(loadingProgress(int)));
+ prog = 0;
+ }
+
+
+ SearchWidget::~SearchWidget()
+ {
+ if (prog)
+ {
+ sp->getGUI()->removeProgressBarFromStatusBar(prog);
+ prog = 0;
+ }
+ }
+
+ void SearchWidget::updateSearchEngines(const SearchEngineList & sl)
+ {
+ int ci = sbar->m_search_engine->currentItem();
+ sbar->m_search_engine->clear();
+ for (Uint32 i = 0;i < sl.getNumEngines();i++)
+ {
+ sbar->m_search_engine->insertItem(sl.getEngineName(i));
+ }
+ sbar->m_search_engine->setCurrentItem(ci);
+ }
+
+ void SearchWidget::onBackAvailable(bool available)
+ {
+ sbar->m_back->setEnabled(available);
+ right_click_menu->setItemEnabled(back_id,available);
+ }
+
+ void SearchWidget::onFrameAdded(KParts::Part* p)
+ {
+ KHTMLPart* frame = dynamic_cast<KHTMLPart*>(p);
+ if (frame)
+ {
+ connect(frame,SIGNAL(popupMenu(const QString&, const QPoint& )),
+ this,SLOT(showPopupMenu(const QString&, const QPoint& )));
+ }
+ }
+
+ void SearchWidget::copy()
+ {
+ if (!html_part)
+ return;
+ html_part->copy();
+ }
+
+ void SearchWidget::search(const QString & text,int engine)
+ {
+ if (!html_part)
+ return;
+
+ if (sbar->m_search_text->text() != text)
+ sbar->m_search_text->setText(text);
+
+ if (sbar->m_search_engine->currentItem() != engine)
+ sbar->m_search_engine->setCurrentItem(engine);
+
+ const SearchEngineList & sl = sp->getSearchEngineList();
+
+ if (engine < 0 || (Uint32)engine >= sl.getNumEngines())
+ engine = sbar->m_search_engine->currentItem();
+
+ QString s_url = sl.getSearchURL(engine).prettyURL();
+ s_url.replace("FOOBAR", KURL::encode_string(text), true);
+ KURL url = KURL::fromPathOrURL(s_url);
+
+ statusBarMsg(i18n("Searching for %1...").arg(text));
+ //html_part->openURL(url);
+ html_part->openURLRequest(url,KParts::URLArgs());
+ }
+
+ void SearchWidget::searchPressed()
+ {
+ search(sbar->m_search_text->text(),sbar->m_search_engine->currentItem());
+ }
+
+ void SearchWidget::clearPressed()
+ {
+ sbar->m_search_text->clear();
+ }
+
+ void SearchWidget::onURLHover(const QString & url)
+ {
+ statusBarMsg(url);
+ }
+
+ void SearchWidget::onFinished()
+ {
+ }
+
+ void SearchWidget::onOpenTorrent(const KURL & url)
+ {
+ openTorrent(url);
+ }
+
+ void SearchWidget::onSaveTorrent(const KURL & url)
+ {
+ KFileDialog fdlg(QString::null,"*.torrent | " + i18n("torrent files"),this,0,true);
+ fdlg.setSelection(url.fileName());
+ fdlg.setOperationMode(KFileDialog::Saving);
+ if (fdlg.exec() == QDialog::Accepted)
+ {
+ KURL save_url = fdlg.selectedURL();
+ // start a copy job
+ KIO::Job* j = KIO::file_copy(url,save_url,-1,true);
+ // let it deal with the errors
+ j->setAutoErrorHandlingEnabled(true,0);
+ }
+ }
+
+ void SearchWidget::showPopupMenu(const QString & url,const QPoint & p)
+ {
+ right_click_menu->popup(p);
+ }
+
+ KPopupMenu* SearchWidget::rightClickMenu()
+ {
+ return right_click_menu;
+ }
+
+ void SearchWidget::onShutDown()
+ {
+ delete html_part;
+ html_part = 0;
+ }
+
+ void SearchWidget::statusBarMsg(const QString & url)
+ {
+ sp->getGUI()->changeStatusbar(url);
+ }
+
+ void SearchWidget::openTorrent(const KURL & url)
+ {
+ sp->getCore()->load(url);
+ }
+
+ void SearchWidget::loadingProgress(int perc)
+ {
+ if (perc < 100 && !prog)
+ {
+ prog = sp->getGUI()->addProgressBarToStatusBar();
+ if (prog)
+ prog->setValue(perc);
+ }
+ else if (prog && perc < 100)
+ {
+ prog->setValue(perc);
+ }
+ else if (perc == 100)
+ {
+ if (prog)
+ {
+ sp->getGUI()->removeProgressBarFromStatusBar(prog);
+ prog = 0;
+ }
+ statusBarMsg(i18n("Search finished"));
+ }
+ }
+}
+
+#include "searchwidget.moc"
diff --git a/plugins/search/searchwidget.h b/plugins/search/searchwidget.h
new file mode 100644
index 0000000..36fb73e
--- /dev/null
+++ b/plugins/search/searchwidget.h
@@ -0,0 +1,89 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 BTSEARCHWIDGET_H
+#define BTSEARCHWIDGET_H
+
+#include <qwidget.h>
+#include <qvaluevector.h>
+#include <kurl.h>
+
+class SearchBar;
+class KProgress;
+class KPopupMenu;
+
+namespace KParts
+{
+ class Part;
+}
+
+namespace kt
+{
+ class HTMLPart;
+ class SearchPlugin;
+ class SearchEngineList;
+
+
+ /**
+ @author Joris Guisson
+
+ Widget which shows a KHTML window with the users search in it
+ */
+ class SearchWidget : public QWidget
+ {
+ Q_OBJECT
+ public:
+ SearchWidget(SearchPlugin* sp);
+ virtual ~SearchWidget();
+
+ KPopupMenu* rightClickMenu();
+
+ void updateSearchEngines(const SearchEngineList & sl);
+
+ public slots:
+ void search(const QString & text,int engine = 0);
+ void copy();
+ void onShutDown();
+
+ private slots:
+ void searchPressed();
+ void clearPressed();
+ void onURLHover(const QString & url);
+ void onFinished();
+ void onOpenTorrent(const KURL & url);
+ void onSaveTorrent(const KURL & url);
+ void showPopupMenu(const QString & s,const QPoint & p);
+ void onBackAvailable(bool available);
+ void onFrameAdded(KParts::Part* p);
+ void statusBarMsg(const QString & url);
+ void openTorrent(const KURL & url);
+ void loadingProgress(int perc);
+
+ private:
+ HTMLPart* html_part;
+ SearchBar* sbar;
+ KPopupMenu* right_click_menu;
+ int back_id;
+ SearchPlugin* sp;
+ KProgress* prog;
+ };
+
+}
+
+#endif
diff --git a/plugins/stats/ChartDrawer.cc b/plugins/stats/ChartDrawer.cc
new file mode 100644
index 0000000..75142e6
--- /dev/null
+++ b/plugins/stats/ChartDrawer.cc
@@ -0,0 +1,473 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "ChartDrawer.h"
+
+#ifdef USE_SOLARIS
+#include <ieeefp.h>
+int isinf(double x) { return !finite(x) && x==x; }
+#endif
+
+
+namespace kt {
+
+ChartDrawer::ChartDrawer(QWidget *p, wgtsize_t x_max, wgtsize_t y_max, bool autom, const QString & uname) : QWidget(p), mXMax(x_max), mYMax(y_max), mAutoMax(autom),
+ mUnitName(uname), mMMode(MaxModeExact)
+{
+ setBackgroundColor("white");
+}
+
+ChartDrawer::~ChartDrawer()
+{
+ QToolTip::remove(this);
+}
+
+ChartDrawer::wgtsize_t ChartDrawer::GetXMax() const
+{
+ return mXMax;
+}
+
+ChartDrawer::wgtsize_t ChartDrawer::GetYMax() const
+{
+ return mYMax;
+}
+
+void ChartDrawer::SetXMax(const wgtsize_t x)
+{
+ mXMax = x;
+
+ for(size_t i = 0; i < mEls.size(); i++)
+ {
+ mEls[i].pmVals -> resize(x, 0.0);
+ }
+}
+
+void ChartDrawer::SetYMax(const wgtsize_t y)
+{
+ mYMax = y;
+}
+
+inline ChartDrawer::wgtsize_t ChartDrawer::GetYScale() const
+{
+ return height() / 8;
+}
+
+
+inline ChartDrawer::wgtunit_t ChartDrawer::TrY(const ChartDrawer::wgtunit_t y) const
+{
+ return height() - y;
+}
+
+void ChartDrawer::paintEvent ( QPaintEvent *)
+{
+ QPainter pnt( this );
+
+ DrawScale(pnt);
+ DrawFrame(pnt);
+ DrawChart(pnt);
+
+}
+
+inline ChartDrawer::wgtunit_t ChartDrawer::height() const
+{
+ return QWidget::height() - 15;
+}
+
+inline ChartDrawer::wgtunit_t ChartDrawer::width() const
+{
+ return QWidget::width() - 65;
+}
+
+void ChartDrawer::DrawFrame(QPainter & rPnt )
+{
+ QPen op = rPnt.pen();
+ rPnt.setPen(QPen("#000", 3));
+
+ rPnt.drawLine(0, TrY(0), width()+3, TrY(0));
+ rPnt.drawLine(width()+1, TrY(0), width()+1, TrY(QWidget::height()));
+
+ QFont oldf(rPnt.font());
+ QFont newf(oldf);
+ newf.setWeight(QFont::Bold);
+ newf.setPointSize(10);
+ newf.setUnderline(1);
+
+ rPnt.setFont(newf);
+ rPnt.drawText(width() + 30, TrY(-7), mUnitName);
+ rPnt.setFont(oldf);
+
+ rPnt.setPen(op);
+}
+
+void ChartDrawer::DrawScale(QPainter & rPnt )
+{
+
+ if(!mYMax)
+ {
+ return;
+ }
+
+ QPen op = rPnt.pen();
+ QPen ep("#eee", 1, Qt::DashLine);
+ QPen lp("#666", 2, Qt::DotLine);
+ QPen tp("#000");
+
+ rPnt.setPen(ep);
+
+ for(wgtsize_t i = 1; i < width(); i += 10)
+ {
+ rPnt.drawLine(i, TrY(0), i, TrY(height()));
+ }
+
+ for(wgtsize_t i = 0; i < height(); i += 10)
+ {
+ rPnt.drawLine(0, TrY(i), width(), TrY(i));
+ }
+
+ rPnt.setPen(lp);
+ rPnt.drawLine(0, TrY(height() - 10), width(), TrY(height() - 10));
+ rPnt.setPen(tp);
+ rPnt.drawText(width() + 4, TrY(height() - 10) + 4, QString::number (mYMax));
+
+ for(wgtsize_t i = 0; i < height() - 15 ; i += GetYScale())
+ {
+ rPnt.setPen(lp);
+ rPnt.drawLine(0, TrY(i), width(), TrY(i));
+ rPnt.setPen(tp);
+ rPnt.drawText(width() + 4, TrY(i) + 4, QString::number ( (mYMax / 8.0 ) * ( i / static_cast<double>(GetYScale() )), 'f', 1 ) );
+ }
+
+ rPnt.setPen(op);
+}
+
+void ChartDrawer::DrawChart(QPainter & rPnt)
+{
+
+ QPen op = rPnt.pen();
+
+ uint32_t skip_max = 0;
+
+ for(size_t i = 0; i < mEls.size(); i++)
+ {
+ rPnt.setPen( *mEls[i].GetPen() );
+
+ for(size_t j = 1; j < mEls[i].pmVals -> size() - 1; j++)
+ {
+ rPnt.drawLine(
+ FindXScreenCoords(j-1),
+ TrY(FindYScreenCoords(mEls[i].pmVals -> at(j-1))),
+ FindXScreenCoords(j),
+ TrY(FindYScreenCoords(mEls[i].pmVals -> at(j)))
+ );
+ }
+//
+ rPnt.drawLine(
+ FindXScreenCoords(mEls[i].pmVals -> size() - 2),
+ TrY(FindYScreenCoords(mEls[i].pmVals -> at(mEls[i].pmVals -> size() - 2))),
+ width(),
+ TrY(FindYScreenCoords(mEls[i].pmVals -> at(mEls[i].pmVals -> size() - 1)))
+ );
+
+ // --------------------
+ // Line on top
+ // ------------
+ QPen myop(rPnt.pen());
+ QPen topl(myop);
+ topl.setStyle(Qt::DotLine);
+ rPnt.setPen(topl);
+ rPnt.drawLine(0, TrY(FindYScreenCoords(mEls[i].pmVals -> at(mEls[i].pmVals -> size() - 1))), width(), TrY(FindYScreenCoords(mEls[i].pmVals -> at(mEls[i].pmVals -> size() - 1))) );
+ rPnt.setPen(myop);
+
+ QFont oldf(rPnt.font());
+ QFont newf(oldf);
+ newf.setWeight(QFont::Bold);
+ newf.setPointSize(8);
+
+ rPnt.setFont(newf);
+ rPnt.drawText(5 + (i * 50), TrY(FindYScreenCoords(mEls[i].pmVals -> at(mEls[i].pmVals -> size() - 1))) + 11, QString::number (mEls[i].pmVals -> at(mEls[i].pmVals -> size() - 1), 'f', 2 ) );
+
+
+ //------------------
+ // max
+ //------------------
+
+ if(mMarkMax[i])
+ {
+ rPnt.setPen(topl);
+ std::pair<double, size_t> max = mEls[i] . Max();
+
+ rPnt.drawLine(
+ FindXScreenCoords(max.second), TrY(0), FindXScreenCoords(max.second), TrY(height())
+ );
+
+ rPnt.setPen(myop);
+
+ rPnt.setFont(newf);
+ QString maxv(QString::number (max.first, 'f', 2));
+
+ if(FindXScreenCoords(max.second) < 35)
+ {
+ rPnt.drawText(FindXScreenCoords(max.second) + 5, TrY(height() - (10 * (i - skip_max)) ) + 10, maxv ) ;
+ } else {
+ rPnt.drawText(FindXScreenCoords(max.second) - 35 , TrY(height() - (10 * (i - skip_max)) ) + 10, maxv ) ;
+ }
+ } else {
+ skip_max++;
+ }
+
+ rPnt.setFont(oldf);
+ rPnt.setPen(op);
+ }
+
+ rPnt.setPen(op);
+}
+
+inline ChartDrawer::wgtunit_t ChartDrawer::FindXScreenCoords(const double x) const
+{
+ return static_cast<wgtunit_t>((width() / static_cast<double>(mXMax)) * x) ;
+}
+
+inline ChartDrawer::wgtunit_t ChartDrawer::FindYScreenCoords(const double y) const
+{
+ return static_cast<wgtunit_t>(((height()) / static_cast<double>(mYMax)) * y) ;
+}
+
+void ChartDrawer::EnableAutoMax(bool a)
+{
+ mAutoMax = a;
+}
+
+void ChartDrawer::AddValue(const size_t idx, const double val, bool u )
+{
+
+ if( idx >= mEls.size() )
+ {
+ return;
+ }
+
+ ChartDrawerData::val_t::iterator it = mEls[idx].pmVals -> begin();
+
+ while(it != mEls[idx] .pmVals -> end() )
+ {
+ *it = *(it + 1);
+ it++;
+ }
+
+#ifdef USE_SOLARIS
+ if(isnand(val) || (isinf(val)))
+#else
+ if(std::isnan(val) || (std::isinf(val)))
+#endif
+ {
+ *(mEls[idx].pmVals -> end() -1) = 0.0;
+ } else {
+ *(mEls[idx].pmVals -> end() -1) = val;
+ }
+
+ if(mAutoMax)
+ {
+ if( (mMMode == MaxModeTop) && (val > mYMax) )
+ {
+ mYMax = static_cast<wgtsize_t>(val) + 3;
+
+ } else if(mMMode == MaxModeExact) {
+ FindSetMax();
+ }
+ }
+
+ if(u)
+ {
+ update();
+ }
+
+}
+
+void ChartDrawer::AddValues(ChartDrawerData Cdd, const bool max)
+{
+ if(Cdd.pmVals -> size() != mXMax)
+ {
+ Cdd.pmVals -> resize(mXMax, 0.0);
+ }
+
+ mEls.push_back(Cdd);
+ mMarkMax.push_back(max);
+
+ MakeLegendTooltip();
+}
+
+void ChartDrawer::AddValues(ChartDrawerData Cdd, const size_t idx, const bool max)
+{
+ if(Cdd.pmVals -> size() != mXMax)
+ {
+ Cdd.pmVals -> resize(mXMax, 0.0);
+ }
+
+ if(idx >= mEls.size())
+ {
+ mEls.push_back(Cdd);
+ } else {
+ mEls.insert(mEls.begin() + idx, Cdd);
+ }
+
+ if(idx >= mMarkMax.size())
+ {
+ mMarkMax.push_back(max);
+ } else {
+ mMarkMax.insert(mMarkMax.begin() + idx, max);
+ }
+
+ MakeLegendTooltip();
+}
+
+void ChartDrawer::AddValuesCnt(const QString & rN, const bool max)
+{
+ mEls.push_back(ChartDrawerData(mXMax, rN));
+ mMarkMax.push_back(max);
+
+ MakeLegendTooltip();
+}
+
+void ChartDrawer::AddValuesCnt(const QPen & rP, const QString & rN, const bool max)
+{
+ mEls.push_back(ChartDrawerData(rP, mXMax, rN));
+ mMarkMax.push_back(max);
+
+ MakeLegendTooltip();
+}
+
+void ChartDrawer::SetUnitName(const QString & rN)
+{
+ mUnitName = rN;
+}
+
+QString ChartDrawer::GetUnitName() const
+{
+ return mUnitName;
+}
+
+void ChartDrawer::mouseDoubleClickEvent ( QMouseEvent * evt )
+{
+ FindSetMax();
+
+ emit DoubleClicked(evt);
+}
+
+void ChartDrawer::EnableMaxDrawAt(const size_t at, const bool e)
+{
+ if(at >= mMarkMax.size())
+ {
+ return;
+ }
+
+ mMarkMax[at] = e;
+}
+
+void ChartDrawer::RemoveValuesCnt(const size_t idx)
+{
+ if(idx >= mEls.size())
+ {
+ return;
+ }
+
+ mEls.erase(mEls.begin() + idx);
+
+ if(idx <= mMarkMax.size())
+ {
+ mMarkMax.erase(mMarkMax.begin() + idx);
+ }
+
+ MakeLegendTooltip();
+
+}
+
+void ChartDrawer::Zero(const size_t idx)
+{
+ if(idx >= mEls.size())
+ {
+ return;
+ }
+
+ std::fill(mEls[idx].pmVals -> begin(), mEls[idx].pmVals -> end(), 0.0);
+
+ if(mAutoMax)
+ {
+ mYMax = 1;
+ }
+}
+
+void ChartDrawer::MakeLegendTooltip()
+{
+ QToolTip::remove(this);
+
+ QString helpstr(QString("<b>%1:</b><br><br>").arg(i18n("Legend")));
+ QMimeSourceFactory* factory = QMimeSourceFactory::defaultFactory();
+ std::vector<QImage> img;
+
+ for(size_t i = 0; i < mEls.size(); i++)
+ {
+ img.push_back(QImage(16,16, 32));
+ img[i].fill(mEls[i].GetPen() -> color().pixel());
+
+ for(uint8_t px = 0; px < 16; px++)
+ {
+ img[i].setPixel(px, 0, 0); //t
+ img[i].setPixel(0, px, 0); //l
+ img[i].setPixel(px, 15, 0); //b
+ img[i].setPixel(15, px, 0); //r
+ }
+
+ factory->setImage(mEls[i].GetName().replace(' ', '_') + "-" + QString::number(i), img[i]);
+ helpstr += QString("<img src='%1'>&nbsp;&nbsp;-&nbsp;&nbsp;%2<br>").arg(mEls[i].GetName().replace(" ", "_") + "-" + QString::number(i)).arg( mEls[i].GetName() );
+ }
+
+ QToolTip::add(this, helpstr);
+}
+
+void ChartDrawer::FindSetMax()
+{
+ wgtsize_t mymax = 1;
+
+ for(val_t::const_iterator it = mEls.begin(); it != mEls.end(); ++it)
+ {
+ for(ChartDrawerData::val_t::const_iterator subit = it -> pmVals -> begin(); subit != it -> pmVals -> end(); ++subit)
+ {
+ if ( (*subit) > mymax )
+ {
+ mymax = static_cast<wgtsize_t>(*subit) + 3;
+ }
+ }
+ }
+
+ mYMax = mymax;
+}
+
+void ChartDrawer::SetMaxMode(const MaxMode mm)
+{
+ mMMode = mm;
+}
+
+ChartDrawer::MaxMode ChartDrawer::GetMaxMode() const
+{
+ return mMMode;
+}
+
+} //NS end
+
+#include "ChartDrawer.moc"
diff --git a/plugins/stats/ChartDrawer.h b/plugins/stats/ChartDrawer.h
new file mode 100644
index 0000000..741240e
--- /dev/null
+++ b/plugins/stats/ChartDrawer.h
@@ -0,0 +1,281 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef CHARTDRAWER_H_
+#define CHARTDRAWER_H_
+
+#include <qwidget.h>
+#include <qpainter.h>
+#include <qstring.h>
+#include <qtooltip.h>
+#include <qmime.h>
+#include <qimage.h>
+
+#include <klocale.h>
+
+#include <vector>
+#include <cmath>
+#include <algorithm> //fill
+
+#include "ChartDrawerData.h"
+
+namespace kt {
+
+/**
+\brief Widget for drawing line charts
+\author Krzysztof Kundzicz <athantor@gmail.com>
+*/
+class ChartDrawer : public QWidget
+{
+ Q_OBJECT
+
+ public:
+ ///Type used as widget size unit
+ typedef uint32_t wgtsize_t;
+ ///Type used as unit in chart
+ typedef int64_t wgtunit_t;
+ /**
+ \brief Type used for data storing
+ \sa ChartDrawerData
+ */
+ typedef std::vector<ChartDrawerData> val_t;
+ ///Determines max mode
+ enum MaxMode { MaxModeTop, MaxModeExact };
+
+ private:
+ ///Maximum X value
+ wgtsize_t mXMax;
+ ///Maximum Y value
+ wgtsize_t mYMax;
+ ///Auto maximum setting
+ bool mAutoMax;
+ ///Chart data
+ val_t mEls;
+ ///Name of the chart unit
+ QString mUnitName;
+ ///Mark max
+ std::vector<bool> mMarkMax;
+ ///Max mode
+ MaxMode mMMode;
+
+ ///Paint event handler
+ void paintEvent ( QPaintEvent * );
+ /**
+ \brief Draws chart's frame
+ \param rPnt Painter on which things will be drawn
+ */
+ void DrawFrame(QPainter &rPnt);
+ /**
+ \brief Draws chart's scale
+ \param rPnt Painter on which things will be drawn
+ */
+ void DrawScale(QPainter &rPnt);
+ /**
+ \brief Draws chart
+ \param rPnt Painter on which things will be drawn
+ */
+ void DrawChart(QPainter &rPnt);
+
+ /**
+ \brief Gets distance between two values on OY
+ \return Distance
+ */
+ inline wgtsize_t GetYScale() const;
+
+ /**
+ \brief Translates widget Y coord to cartesian
+ \param y Coord
+ \return Coord
+ */
+ inline wgtunit_t TrY(const wgtunit_t y) const;
+ /**
+ \brief Returns charts height
+ \return Height
+
+ Return only height of the chart's inside the frame — not the whole widget's
+ */
+ inline wgtunit_t height() const;
+ /**
+ \brief Returns charts width
+ \return Width
+
+ Return only width of the chart's inside the frame — not the whole widget's
+ */
+ inline wgtunit_t width() const;
+
+ /**
+ \brief Finds screen X coord on the widget
+ \param x Coord
+ \return Screen coord
+ \warning Thera are rounding errors
+ */
+ inline wgtunit_t FindXScreenCoords(const double x) const;
+ /**
+ \brief Finds screen Y coord on the widget
+ \param y Coord
+ \return Screen coord
+ \warning Thera are rounding errors
+ */
+ inline wgtunit_t FindYScreenCoords(const double y) const;
+
+ ///Sets tooltip with legend
+ void MakeLegendTooltip();
+
+ public:
+ /**
+ \brief Widget's constructor
+ \param p Parent
+ \param x_max Maximum X size
+ \param y_max Maximum Y size
+ \param autom Whether athomagically set the maximum Y size
+ \param uname Unit name
+ */
+ ChartDrawer(QWidget *p = 0, wgtsize_t x_max = 2, wgtsize_t y_max = 1, bool autom = true, const QString & uname = "KB/s");
+ ~ChartDrawer();
+
+ /**
+ \brief Gets maximum X
+ \return Maximum X
+ */
+ wgtsize_t GetXMax() const;
+ /**
+ \brief Gets maximum Y
+ \return Maximum Y
+ */
+ wgtsize_t GetYMax() const;
+
+ /**
+ \brief Sets the units name
+ \param rN Name
+
+ \note It'l be drawn on the chart
+ */
+ void SetUnitName(const QString & rN);
+
+ /**
+ \brief Gets unit name
+ \return name
+ */
+ QString GetUnitName() const;
+ /**
+ \brief Doubleclick handler
+ \param evt Mouse event
+ */
+ void mouseDoubleClickEvent ( QMouseEvent * evt );
+
+ /**
+ \brief Gets mode of OY axis maximum drawing
+ \return mode
+ */
+ MaxMode GetMaxMode() const;
+
+
+ public slots:
+ /**
+ \brief Adds value to given dataset
+ \param idx Dataset index
+ \param val Value to add
+ \param update Whether update widget after adding
+ */
+ void AddValue(const size_t idx, const double val, bool update = true);
+ /**
+ \brief Adds dataset
+ \param Cdd Dataset
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValues(ChartDrawerData Cdd, const bool max = true);
+ /**
+ \brief Adds dataset
+ \param Cdd Dataset
+ \param idx Where
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValues(ChartDrawerData Cdd, const size_t idx, const bool max = true);
+ /**
+ \brief Adds empty dataset
+ \param rN Set's data name
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValuesCnt(const QString & rN, const bool max = true);
+ /**
+ \brief Adds empty dataset
+ \param rP Pen that will be used to drawing
+ \param rN Dataset name
+ \param max Whether mark maximum of this dataset
+ */
+ void AddValuesCnt(const QPen & rP, const QString & rN, const bool max = true );
+
+ /**
+ \brief Removes dataset
+ \param idx Dataset index
+ */
+ void RemoveValuesCnt(const size_t idx);
+ /**
+ \brief Zeroes values
+ \param idx Dataset index
+ */
+ void Zero(const size_t idx);
+
+ ///Finds and sets maximum
+ void FindSetMax();
+
+ /**
+ \brief Toggles marking of the maximum Y value on given dataset
+ \param at dataset
+ \param e Toggle?
+ */
+ void EnableMaxDrawAt(const size_t, const bool);
+ /**
+ \brief Toggles automatic max Y scale settin
+ \param a Toggle?
+ */
+ void EnableAutoMax(bool a);
+
+ /**
+ \brief Sets maximum X
+ \param x X size
+ */
+ void SetXMax(const wgtsize_t x);
+ /**
+ \brief Sets maximum Y
+ \param y Y size
+ */
+ void SetYMax(const wgtsize_t x);
+
+ /**
+ \brief Sets mode of max of OY axis
+ \param mm Mode
+ */
+ void SetMaxMode(const MaxMode mm);
+
+
+ signals:
+ /**
+ \brief Emited when widget is doubleclicked
+ \param evt Mouse event
+ */
+ void DoubleClicked(QMouseEvent * evt);
+
+};
+
+}
+
+#endif
+
diff --git a/plugins/stats/ChartDrawerData.cc b/plugins/stats/ChartDrawerData.cc
new file mode 100644
index 0000000..9a49a95
--- /dev/null
+++ b/plugins/stats/ChartDrawerData.cc
@@ -0,0 +1,100 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "ChartDrawerData.h"
+
+namespace kt {
+
+ChartDrawerData::ChartDrawerData(const QString & rN) : pmQp(new QPen("#000", 1, Qt::SolidLine)), pmVals(new val_t(2, 0.0)), mName(rN)
+{
+}
+
+ChartDrawerData::ChartDrawerData(const size_t s, const QString & rN) : pmQp(new QPen("#000", 1, Qt::SolidLine)), pmVals(new val_t(s, 0.0)), mName(rN)
+{
+}
+
+ChartDrawerData::ChartDrawerData(const QPen & rQp, const QString & rN) : pmQp(new QPen(rQp)), pmVals(new val_t(2, 0.0)), mName(rN)
+{
+}
+
+ChartDrawerData::ChartDrawerData(const QPen & rQp, const size_t s, const QString & rN) : pmQp(new QPen(rQp)), pmVals(new val_t(s, 0.0)), mName(rN)
+{
+}
+
+ChartDrawerData::ChartDrawerData(const ChartDrawerData & rS)
+{
+ pmQp = new QPen(*rS.pmQp);
+ pmVals = new val_t(*rS.pmVals);
+ mName = rS.mName;
+}
+
+ChartDrawerData::~ChartDrawerData()
+{
+ delete pmQp;
+ delete pmVals;
+}
+
+const ChartDrawerData::val_t * ChartDrawerData::GetVals() const
+{
+ return pmVals;
+}
+
+const QPen * ChartDrawerData::GetPen() const
+{
+ return pmQp;
+}
+
+void ChartDrawerData::SetPen(const QPen & rQp)
+{
+ delete pmQp;
+ pmQp = new QPen(rQp);
+}
+
+std::pair<double, size_t> ChartDrawerData::Max() const
+{
+
+ double max = 0.0;
+ size_t cpos = 0;
+ size_t maxpos = 0;
+
+ for(val_t::iterator it = pmVals -> begin(); it != pmVals -> end(); it++)
+ {
+ if(max <= *it)
+ {
+ max = *it;
+ maxpos = cpos;
+ }
+
+ cpos++;
+ }
+
+ return std::make_pair(max, maxpos);
+}
+
+QString ChartDrawerData::GetName() const
+{
+ return mName;
+}
+void ChartDrawerData::SetName( const QString & rN )
+{
+ mName = rN;
+}
+
+} // NS end
diff --git a/plugins/stats/ChartDrawerData.h b/plugins/stats/ChartDrawerData.h
new file mode 100644
index 0000000..561e76a
--- /dev/null
+++ b/plugins/stats/ChartDrawerData.h
@@ -0,0 +1,123 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef CHARTDRAWERDATA_H_
+#define CHARTDRAWERDATA_H_
+
+#include <qpen.h>
+#include <vector>
+#include <map>
+
+namespace kt {
+
+class ChartDrawer;
+
+/**
+\brief Container for data used by ChartDrawer
+\author Krzysztof Kundzicz <athantor@gmail.com>
+*/
+class ChartDrawerData
+{
+ friend class ChartDrawer;
+
+ public:
+ ///Type for stroring values
+ typedef std::vector<double> val_t;
+
+ private:
+ ///Pen used for drawing
+ QPen * pmQp;
+ ///Values
+ val_t * pmVals;
+ ///Name of set
+ QString mName;
+
+ public:
+ /**
+ \brief Constructor
+ \param rN Name
+ */
+ ChartDrawerData(const QString & rN);
+ /**
+ \brief Copy constructor
+ \param rS Source
+ */
+ ChartDrawerData(const ChartDrawerData &);
+ /**
+ \brief Constructor
+ \param s Size
+ \param rN Name
+ */
+ ChartDrawerData(const size_t s, const QString & rN);
+ /**
+ \brief Constructor
+ \param rQp Pen used for drawing
+ \param rN Name
+ */
+ ChartDrawerData(const QPen & rQp, const QString & rN);
+ /**
+ \brief Constructor
+ \param rQp Pen used for drawing
+ \param s Size
+ \param rN Name
+ */
+ ChartDrawerData(const QPen & rQp, const size_t s, const QString & rN);
+
+ ///Destructor
+ ~ChartDrawerData();
+
+ /**
+ \brief Gets values
+ \return Pointer to values container
+ */
+ const val_t * GetVals() const;
+ /**
+ \brief Gets pen
+ \return Pointer pen
+ */
+ const QPen * GetPen() const;
+ /**
+ \brief Gets name
+ \return Name
+ */
+ QString GetName() const;
+
+ /**
+ \brief Sets pen
+ \param rQp Pen
+ */
+ void SetPen(const QPen & rQp);
+ /**
+ \brief Sets name
+ \param rN Name
+ */
+ void SetName( const QString & rN );
+
+ /**
+ \brief Finds maximum value
+ \return Pair with value and position
+ */
+ std::pair<double, size_t> Max() const;
+
+};
+
+}
+
+#endif
diff --git a/plugins/stats/Makefile.am b/plugins/stats/Makefile.am
new file mode 100644
index 0000000..e04f417
--- /dev/null
+++ b/plugins/stats/Makefile.am
@@ -0,0 +1,18 @@
+INCLUDES = -I$(top_builddir)/libktorrent -I$(top_builddir)/ktorrent/libktorrent \
+ -I$(srcdir)/../../libktorrent $(all_includes)
+
+METASOURCES = AUTO
+
+kde_module_LTLIBRARIES = ktstatsplugin.la
+
+ktstatsplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KPARTS) $(all_libraries)
+ktstatsplugin_la_SOURCES = ChartDrawerData.cc ChartDrawer.cc statsspdwgt.ui statsconwgt.ui StatsSpd.cc StatsCon.cc sprefwgt.ui statspluginsettings.kcfgc \
+ StatsPluginPrefsPage.cc StatsPluginPrefs.cc statsplugin.cc
+
+ktstatsplugin_la_LIBADD = $(LIB_QT) ../../libktorrent/libktorrent.la
+
+noinst_HEADERS = ChartDrawerData.h ChartDrawer.h StatsSpd.h StatsCon.h StatsPluginPrefsPage.h StatsPluginPrefs.h statsplugin.h
+
+kde_services_DATA = ktstatsplugin.desktop
+kde_kcfg_DATA = ktstatsplugin.kcfg
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/stats/PeerMonitor.cc b/plugins/stats/PeerMonitor.cc
new file mode 100644
index 0000000..a4cf449
--- /dev/null
+++ b/plugins/stats/PeerMonitor.cc
@@ -0,0 +1,187 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "PeerMonitor.h"
+
+namespace kt {
+
+PeerMonitor::PeerMonitor(kt::TorrentInterface * pTi, std::map<bt::SHA1Hash, PeerMonitor *> * pM) : kt::MonitorInterface(), QObject(), pmTorIface(pTi), pmPeerMMgr(pM)
+{
+
+}
+
+PeerMonitor::~PeerMonitor()
+{
+}
+
+void PeerMonitor::peerAdded (kt::PeerInterface *peer)
+{
+ QMutexLocker lock(&mtx);
+
+ mPeers.push_back( peer );
+}
+
+void PeerMonitor::peerRemoved (kt::PeerInterface *peer)
+{
+
+ QMutexLocker lock(&mtx);
+
+ data_t::iterator it = std::find(mPeers.begin(), mPeers.end(), peer);
+
+ if(it != mPeers.end())
+ {
+ mPeers.erase(it);
+ // *it = 0;
+ }
+
+}
+
+void PeerMonitor::downloadStarted (kt::ChunkDownloadInterface *)
+{
+
+}
+
+void PeerMonitor::downloadRemoved (kt::ChunkDownloadInterface *)
+{
+
+}
+
+void PeerMonitor::stopped ()
+{
+ QMutexLocker lock(&mtx);
+
+ std::fill(mPeers.begin(), mPeers.end(), static_cast<PeerInterface*>( 0 ) );
+// mPeers.clear();
+}
+
+void PeerMonitor::destroyed ()
+{
+ if(pmPeerMMgr -> find(pmTorIface -> getInfoHash()) != pmPeerMMgr -> end() )
+ {
+ pmTorIface -> setMonitor(0);
+ pmPeerMMgr -> erase(pmTorIface -> getInfoHash());
+ delete this;
+ }
+
+}
+
+double PeerMonitor::LeechersUpSpeed()
+{
+ QMutexLocker lock(&mtx);
+
+ double spd = 0.0;
+
+ //without it'll segfault/SIGABRT on stop as in meantime the iterator from
+ // mPeers will be invalidated
+
+ for( data_t::const_iterator it = mPeers.begin(); it != mPeers.end(); it++)
+ {
+ if((it != mPeers.end()) && *it && ( (*it) -> getStats().perc_of_file < 100.0) )
+ {
+ spd += (*it) -> getStats().download_rate;
+ }
+ }
+
+ return spd;
+}
+
+double PeerMonitor::LeechersDownSpeed()
+{
+ QMutexLocker lock(&mtx);
+
+ double spd = 0.0;
+
+
+ for( data_t::const_iterator it = mPeers.begin(); it != mPeers.end(); it++)
+ {
+ if((it != mPeers.end()) && *it && ( (*it) -> getStats().perc_of_file < 100.0) )
+ {
+ spd += (*it) -> getStats().upload_rate;
+ }
+ }
+
+ return spd;
+
+}
+
+double PeerMonitor::SeedersUpSpeed()
+{
+ QMutexLocker lock(&mtx);
+
+ double spd = 0.0;
+
+
+ for( data_t::const_iterator it = mPeers.begin(); it != mPeers.end(); it++)
+ {
+ if((it != mPeers.end()) && *it && ( (*it) -> getStats().perc_of_file == 100.0) )
+ {
+ spd += (*it) -> getStats().download_rate;
+ }
+
+ }
+
+ return spd;
+
+}
+
+uint64_t PeerMonitor::GetLeechers()
+{
+ QMutexLocker lock(&mtx);
+
+ uint64_t l = 0;
+
+
+ for( data_t::const_iterator it = mPeers.begin(); it != mPeers.end(); it++)
+ {
+ if((it != mPeers.end()) && *it && ( (*it) -> getStats().perc_of_file != 100.0) )
+ {
+ l++;
+ }
+
+ }
+
+ return l;
+}
+
+uint64_t PeerMonitor::GetSeeders()
+{
+ QMutexLocker lock(&mtx);
+
+ uint64_t s = 0;
+
+
+ for( data_t::const_iterator it = mPeers.begin(); it != mPeers.end(); it++)
+ {
+ if((it != mPeers.end()) && *it && ( (*it) -> getStats().perc_of_file == 100) )
+ {
+ s++;
+ }
+
+ }
+
+ return s;
+}
+
+kt::TorrentInterface * PeerMonitor::GetTorIface() const
+{
+ return pmTorIface;
+}
+
+} //NS end
diff --git a/plugins/stats/PeerMonitor.h b/plugins/stats/PeerMonitor.h
new file mode 100644
index 0000000..d1ef4fc
--- /dev/null
+++ b/plugins/stats/PeerMonitor.h
@@ -0,0 +1,123 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef PEERMONITOR_H_
+#define PEERMONITOR_H_
+
+#include <qmutex.h>
+
+#include <interfaces/monitorinterface.h>
+#include <interfaces/peerinterface.h>
+#include <interfaces/torrentinterface.h>
+#include <util/sha1hash.h>
+
+#include <map>
+#include <list>
+#include <algorithm>
+
+namespace kt {
+
+/**
+\brief Monitors peers
+\author Krzysztof Kundzicz <athantor@gmail.com>
+
+Used for peers statistics
+
+\warning Don't use it, as There Can Be Only One™ and the infowidgetplugin relays on it
+*/
+
+class PeerMonitor : public MonitorInterface, public QObject
+{
+ public:
+ ///Type of conteiner of pointers to peers
+ typedef std::list<PeerInterface *> data_t;
+
+ private:
+ /**
+ \brief Mutex
+
+ Used for locking conteiner with pointers to peers
+ */
+ QMutex mtx;
+ ///Container with pointers to peers
+ data_t mPeers;
+ ///Monitored torrent
+ TorrentInterface * pmTorIface;
+ /**
+ \brief Pointer to PeerMonitor „manager”
+
+ \li \c Key: Monitored torrent hash
+ \li \c Value \c type: Pointer to peer monitor
+ */
+ std::map<bt::SHA1Hash, PeerMonitor *> *pmPeerMMgr;
+
+ public:
+ /**
+ \brief Constructor
+ \param pTi Pointer to monitored torrent
+ \param pM Pointer to PeerMonitor „manager”
+ */
+ PeerMonitor(TorrentInterface * pTi, std::map<bt::SHA1Hash, PeerMonitor *> * pM);
+ virtual ~PeerMonitor();
+
+ virtual void peerAdded (PeerInterface *peer);
+ virtual void peerRemoved (PeerInterface *peer);
+ virtual void downloadStarted (ChunkDownloadInterface *cd);
+ virtual void downloadRemoved (ChunkDownloadInterface *cd);
+ virtual void stopped();
+ virtual void destroyed () ;
+
+ /**
+ \brief Gets speed @ which leechers are uploading to us
+ \return Speed
+ */
+ double LeechersUpSpeed() ;
+ /**
+ \brief Gets speed @ which leechers are downloading from us
+ \return Speed
+ */
+ double LeechersDownSpeed();
+ /**
+ \brief Gets speed @ which seeders are uploading to us
+ \return Speed
+ */
+ double SeedersUpSpeed() ;
+ /**
+ \brief Gets leechers count to which we are connected
+ \return Count
+ */
+ uint64_t GetLeechers() ;
+ /**
+ \brief Gets seeders count to which we are connected
+ \return Count
+ */
+ uint64_t GetSeeders() ;
+
+ /**
+ \brief Gets pointer to monitored torrent
+ \return Pointer to monitored torrent
+ */
+ TorrentInterface * GetTorIface() const;
+
+};
+
+}
+
+#endif
diff --git a/plugins/stats/StatsCon.cc b/plugins/stats/StatsCon.cc
new file mode 100644
index 0000000..069ba75
--- /dev/null
+++ b/plugins/stats/StatsCon.cc
@@ -0,0 +1,113 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "StatsCon.h"
+
+namespace kt {
+
+StatsCon::StatsCon(QWidget * p) : StatsConWgt(p), pmPeersConCht(new ChartDrawer(PeersConGbw, StatsPluginSettings::connectionsMeasurements())),
+ pmDHTCht(new ChartDrawer(DHTGbw, StatsPluginSettings::dHTMeasurements()))
+{
+ PeersConGbw->setColumnLayout(0, Qt::Vertical );
+ PeersConGbw->layout()->setSpacing( 6 );
+ PeersConGbw->layout()->setMargin( 11 );
+
+ pmPeersConLay = new QVBoxLayout(PeersConGbw -> layout());
+
+ DHTGbw->setColumnLayout(0, Qt::Vertical );
+ DHTGbw->layout()->setSpacing( 6 );
+ DHTGbw->layout()->setMargin( 11 );
+
+ pmDHTLay = new QVBoxLayout(DHTGbw -> layout());
+
+ //-------------
+
+ pmPeersConLay -> addWidget(pmPeersConCht);
+ pmDHTLay -> addWidget(pmDHTCht);
+
+ //-----------
+
+ pmPeersConCht -> SetUnitName("n");
+
+ pmPeersConCht -> AddValuesCnt(QPen("#f00"), i18n("Leechers connected"));
+ pmPeersConCht -> AddValuesCnt(QPen("#900"), i18n("Leechers in swarms"));
+ pmPeersConCht -> AddValuesCnt(QPen("#00f"), i18n("Seeders connected"));
+ pmPeersConCht -> AddValuesCnt(QPen("#009"), i18n("Seeders in swarms"));
+ pmPeersConCht -> AddValuesCnt(QPen("#0a0"), i18n("Average connected leechers per torrent"));
+ pmPeersConCht -> AddValuesCnt(QPen("#060"), i18n("Average connected seeders per torrent"));
+ pmPeersConCht -> AddValuesCnt(QPen("#099"), i18n("Average connected leechers per running torrent"));
+ pmPeersConCht -> AddValuesCnt(QPen("#055"), i18n("Average connected seeders per running torrent"));
+
+
+ pmDHTCht -> SetUnitName("n");
+
+ pmDHTCht -> AddValuesCnt(QPen("#f00"), i18n("Nodes"));
+ pmDHTCht -> AddValuesCnt(QPen("#00f"), i18n("Tasks"));
+}
+
+StatsCon::~StatsCon()
+{
+ delete pmPeersConCht;
+ delete pmDHTCht;
+
+ delete pmPeersConLay;
+ delete pmDHTLay;
+}
+
+void StatsCon::AddPeersConVal(const size_t idx, const double val)
+{
+ pmPeersConCht -> AddValue(idx, val , false );
+}
+
+void StatsCon::AddDHTVal(const size_t idx, const double val)
+{
+ pmDHTCht -> AddValue(idx, val, false);
+}
+
+void StatsCon::UpdateCharts()
+{
+ pmPeersConCht -> update();
+ pmDHTCht -> update();
+}
+
+void StatsCon::ZeroPeersConn(const size_t idx)
+{
+ pmPeersConCht -> Zero(idx);
+}
+
+void StatsCon::ChangeConnMsmtCnt(const size_t cnt)
+{
+ pmPeersConCht -> SetXMax(cnt);
+}
+
+void StatsCon::ChangeDHTMsmtCnt(const size_t cnt)
+{
+ pmDHTCht -> SetXMax(cnt);
+}
+
+void StatsCon::ChangeChartsMaxMode(const ChartDrawer::MaxMode mm)
+{
+ pmPeersConCht -> SetMaxMode(mm);
+ pmDHTCht -> SetMaxMode(mm);
+}
+
+} //NS
+
+#include "StatsCon.moc"
diff --git a/plugins/stats/StatsCon.h b/plugins/stats/StatsCon.h
new file mode 100644
index 0000000..9d60048
--- /dev/null
+++ b/plugins/stats/StatsCon.h
@@ -0,0 +1,94 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef STATSCON_H_
+#define STATSCON_H_
+
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+#include <qgroupbox.h>
+
+#include "statspluginsettings.h"
+#include "statsconwgt.h"
+#include "ChartDrawer.h"
+
+namespace kt {
+
+class StatsCon : public StatsConWgt
+{
+ Q_OBJECT
+ private:
+ ///Layout of peers connections
+ QVBoxLayout * pmPeersConLay;
+ ///Layout of DHT stats
+ QVBoxLayout * pmDHTLay;
+
+ ///Chart widget of peers connted
+ ChartDrawer * pmPeersConCht;
+ ///Chart widget of DHT
+ ChartDrawer * pmDHTCht;
+
+ public:
+ StatsCon(QWidget * p = 0);
+ virtual ~StatsCon();
+ /**
+ \brief Adds value to peers connections chart
+ \param idx Dataset index
+ \param val Value
+ */
+ void AddPeersConVal(const size_t idx, const double val);
+ /**
+ \brief Adds value to DHT chart
+ \param idx Dataset index
+ \param val Value
+ */
+ void AddDHTVal(const size_t idx, const double val);
+
+ /**
+ \brief Zeroes data on given idx @ peers connections chart
+ \param idx Dataset index
+ */
+ void ZeroPeersConn(const size_t idx);
+
+ /**
+ \brief Changes connections chart's measurments count
+ \param cnt Measurements
+ */
+ void ChangeConnMsmtCnt(const size_t cnt);
+ /**
+ \brief Changes DHT chart's measurments count
+ \param cnt Measurements
+ */
+ void ChangeDHTMsmtCnt(const size_t cnt);
+ /**
+ \brief Changes charts OY axis maximum mode
+ \param mm Mode
+ */
+ void ChangeChartsMaxMode(const ChartDrawer::MaxMode mm);
+ public slots:
+ ///Updates charts
+ void UpdateCharts();
+
+};
+
+} // NS
+
+#endif
diff --git a/plugins/stats/StatsPluginPrefs.cc b/plugins/stats/StatsPluginPrefs.cc
new file mode 100644
index 0000000..07cfa23
--- /dev/null
+++ b/plugins/stats/StatsPluginPrefs.cc
@@ -0,0 +1,88 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "StatsPluginPrefs.h"
+
+namespace kt {
+
+StatsPluginPrefs::StatsPluginPrefs() : PrefPageInterface(i18n("Statistics"), i18n("Statistics options"), KGlobal::iconLoader()->loadIcon("ktimemon",KIcon::NoGroup)), pmUi(0)
+{
+}
+
+StatsPluginPrefs::~StatsPluginPrefs()
+{
+}
+
+bool StatsPluginPrefs::apply ()
+{
+ StatsPluginSettings::setUpdateChartsEveryGuiUpdates(pmUi -> GuiUpdatesSbw -> value());
+ StatsPluginSettings::setGatherDataEveryMs(pmUi -> DataIvalSbw -> value());
+ StatsPluginSettings::setPeersSpeedDataIval(pmUi -> PeersSpdUpdIvalSbw -> value());
+
+ StatsPluginSettings::setPeersSpeed(pmUi -> PeersSpdCbw -> isChecked());
+ StatsPluginSettings::setDrawSeedersInSwarms(pmUi -> ConnSdrInSwaCbw -> isChecked());
+ StatsPluginSettings::setDrawLeechersInSwarms(pmUi -> ConnLchInSwaCbw -> isChecked());
+
+ StatsPluginSettings::setDownloadMeasurements(pmUi -> DownloadMrmtSbw -> value());
+ StatsPluginSettings::setPeersSpeedMeasurements(pmUi -> PeersSpdMrmtSbw -> value());
+ StatsPluginSettings::setUploadMeasurements(pmUi -> UploadMrmtSbw -> value());
+ StatsPluginSettings::setConnectionsMeasurements(pmUi -> ConnsMrmtSbw -> value());
+ StatsPluginSettings::setDHTMeasurements(pmUi -> DHTMrmtSbw -> value());
+ StatsPluginSettings::setMaxSpdMode(pmUi -> MaxSpdModeCbw -> currentItem());
+
+ StatsPluginSettings::writeConfig();
+
+ emit Applied();
+
+ return true;
+}
+
+void StatsPluginPrefs::createWidget (QWidget *parent)
+{
+ pmUi = new StatsPluginPrefsPage(parent);
+}
+
+void StatsPluginPrefs::updateData ()
+{
+ pmUi -> GuiUpdatesSbw -> setValue(StatsPluginSettings::updateChartsEveryGuiUpdates());
+ pmUi -> DataIvalSbw -> setValue(StatsPluginSettings::gatherDataEveryMs());
+ pmUi -> PeersSpdUpdIvalSbw -> setValue(StatsPluginSettings::peersSpeedDataIval());
+
+ pmUi -> PeersSpdCbw -> setChecked(StatsPluginSettings::peersSpeed());
+ pmUi -> ConnSdrInSwaCbw -> setChecked(StatsPluginSettings::drawSeedersInSwarms());
+ pmUi -> ConnLchInSwaCbw -> setChecked(StatsPluginSettings::drawLeechersInSwarms());
+
+ pmUi -> DownloadMrmtSbw -> setValue(StatsPluginSettings::downloadMeasurements());
+ pmUi -> PeersSpdMrmtSbw -> setValue(StatsPluginSettings::peersSpeedMeasurements());
+ pmUi -> UploadMrmtSbw -> setValue(StatsPluginSettings::uploadMeasurements());
+ pmUi -> ConnsMrmtSbw -> setValue(StatsPluginSettings::connectionsMeasurements());
+ pmUi -> DHTMrmtSbw -> setValue(StatsPluginSettings::dHTMeasurements());
+ pmUi -> MaxSpdModeCbw -> setCurrentItem(StatsPluginSettings::maxSpdMode());
+}
+
+void StatsPluginPrefs::deleteWidget ()
+{
+ delete pmUi;
+}
+
+
+} //NS end
+
+#include "StatsPluginPrefs.moc"
diff --git a/plugins/stats/StatsPluginPrefs.h b/plugins/stats/StatsPluginPrefs.h
new file mode 100644
index 0000000..6d563ec
--- /dev/null
+++ b/plugins/stats/StatsPluginPrefs.h
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef STATSPLUGINPREFS_H_
+#define STATSPLUGINPREFS_H_
+
+#include <qspinbox.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+
+#include <interfaces/prefpageinterface.h>
+
+#include "StatsPluginPrefsPage.h"
+#include "statspluginsettings.h"
+
+namespace kt {
+
+/**
+\brief Prefs page
+\author Krzysztof Kundzicz <athantor@gmail.com>
+*/
+class StatsPluginPrefs : public QObject, public PrefPageInterface
+{
+ Q_OBJECT
+
+ private:
+ ///Widget
+ StatsPluginPrefsPage *pmUi;
+ public:
+ ///Constructor
+ StatsPluginPrefs();
+ ///Destructor
+ virtual ~StatsPluginPrefs();
+
+ virtual bool apply ();
+ virtual void createWidget (QWidget *parent);
+ virtual void updateData ();
+ virtual void deleteWidget ();
+ signals:
+ void Applied();
+};
+
+}
+
+#endif
diff --git a/plugins/stats/StatsPluginPrefsPage.cc b/plugins/stats/StatsPluginPrefsPage.cc
new file mode 100644
index 0000000..1278127
--- /dev/null
+++ b/plugins/stats/StatsPluginPrefsPage.cc
@@ -0,0 +1,29 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "StatsPluginPrefsPage.h"
+
+namespace kt {
+
+StatsPluginPrefsPage::StatsPluginPrefsPage(QWidget *p) : sprefwgt(p)
+{
+}
+
+}// NS END
diff --git a/plugins/stats/StatsPluginPrefsPage.h b/plugins/stats/StatsPluginPrefsPage.h
new file mode 100644
index 0000000..59bd9f1
--- /dev/null
+++ b/plugins/stats/StatsPluginPrefsPage.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef STATSPLUGINPREFSPAGE_H_
+#define STATSPLUGINPREFSPAGE_H_
+
+#include "sprefwgt.h"
+
+namespace kt {
+
+/**
+\brief Prefs widget
+\author Krzysztof Kundzicz <athantor@gmail.com>
+*/
+class StatsPluginPrefsPage : public sprefwgt
+{
+ public:
+ /**
+ \brief Constructor
+ \param p Parent
+ */
+ StatsPluginPrefsPage(QWidget * p = 0);
+};
+
+}
+
+#endif
diff --git a/plugins/stats/StatsSpd.cc b/plugins/stats/StatsSpd.cc
new file mode 100644
index 0000000..e4f9d53
--- /dev/null
+++ b/plugins/stats/StatsSpd.cc
@@ -0,0 +1,138 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "StatsSpd.h"
+
+namespace kt {
+
+StatsSpd::StatsSpd(QWidget *p) : StatsSpdWgt(p),
+ pmDownCht(new ChartDrawer(DownSpeedGbw, StatsPluginSettings::downloadMeasurements())),
+ pmPeersSpdCht(new ChartDrawer(PeersSpdGbw, StatsPluginSettings::peersSpeedMeasurements())),
+ pmUpCht(new ChartDrawer(UpSpeedGbw, StatsPluginSettings::uploadMeasurements()))
+{
+
+ DownSpeedGbw->setColumnLayout(0, Qt::Vertical );
+ DownSpeedGbw->layout()->setSpacing( 6 );
+ DownSpeedGbw->layout()->setMargin( 11 );
+
+ pmDSpdLay = new QVBoxLayout(DownSpeedGbw -> layout());
+
+ UpSpeedGbw->setColumnLayout(0, Qt::Vertical );
+ UpSpeedGbw->layout()->setSpacing( 6 );
+ UpSpeedGbw->layout()->setMargin( 11 );
+
+ pmUSpdLay = new QVBoxLayout(UpSpeedGbw -> layout());
+
+ PeersSpdGbw->setColumnLayout(0, Qt::Vertical );
+ PeersSpdGbw->layout()->setSpacing( 6 );
+ PeersSpdGbw->layout()->setMargin( 11 );
+
+ pmPeersSpdLay = new QVBoxLayout(PeersSpdGbw -> layout());
+
+ //-----------------
+
+ pmUSpdLay -> addWidget(pmUpCht);
+ pmDSpdLay -> addWidget(pmDownCht);
+ pmPeersSpdLay -> addWidget(pmPeersSpdCht);
+
+ // ----------------
+
+ pmUpCht -> AddValuesCnt(QPen("#f00"), i18n("Current"));
+ pmDownCht -> AddValuesCnt(QPen("#f00"), i18n("Current"));
+
+ pmUpCht -> AddValuesCnt(QPen("#00f"), i18n("Average"));
+ pmDownCht -> AddValuesCnt(QPen("#00f"), i18n("Average"));
+
+ pmUpCht -> AddValuesCnt(i18n("Limit"), 0);
+ pmDownCht -> AddValuesCnt(i18n("Limit"), 0);
+
+// pmUpCht -> AddValuesCnt(QPen("#f0f"), i18n("Current torrent"));
+// pmDownCht -> AddValuesCnt(QPen("#f0f"), i18n("Current torrent"));
+//
+
+
+ pmPeersSpdCht -> AddValuesCnt(QPen("#090"), i18n("Average from leecher"));
+ pmPeersSpdCht -> AddValuesCnt(QPen("#f00"), i18n("Average to leecher"));
+ pmPeersSpdCht -> AddValuesCnt(QPen("#00f"), i18n("Average from seeder"));
+ pmPeersSpdCht -> AddValuesCnt(QPen("magenta"), i18n("From leechers"));
+ pmPeersSpdCht -> AddValuesCnt(QPen("orange"), i18n("From seeders"));
+
+}
+
+StatsSpd::~StatsSpd()
+{
+ delete pmUpCht;
+ delete pmDownCht;
+ delete pmPeersSpdCht;
+
+ delete pmUSpdLay;
+ delete pmDSpdLay;
+ delete pmPeersSpdLay;
+
+}
+
+void StatsSpd::AddUpSpdVal(const size_t idx, const double val)
+{
+ pmUpCht -> AddValue(idx, val, false);
+}
+
+void StatsSpd::AddDownSpdVal(const size_t idx, const double val)
+{
+ pmDownCht -> AddValue(idx, val , false);
+}
+
+void StatsSpd::AddPeersSpdVal(const size_t idx, const double val)
+{
+ pmPeersSpdCht -> AddValue(idx, val , false);
+}
+
+void StatsSpd::UpdateCharts()
+{
+ pmUpCht -> update();
+ pmDownCht -> update();
+ pmPeersSpdCht -> update();
+}
+
+void StatsSpd::ChangeDownMsmtCnt(const size_t cnt)
+{
+ pmDownCht -> SetXMax(cnt);
+}
+
+void StatsSpd::ChangePrsSpdMsmtCnt(const size_t cnt)
+{
+ pmPeersSpdCht -> SetXMax(cnt);
+}
+
+void StatsSpd::ChangeUpMsmtCnt(const size_t cnt)
+{
+ pmUpCht -> SetXMax(cnt);
+}
+
+void StatsSpd::ChangeChartsMaxMode(const ChartDrawer::MaxMode mm)
+{
+ pmUpCht -> SetMaxMode(mm);
+ pmDownCht -> SetMaxMode(mm);
+ pmPeersSpdCht -> SetMaxMode(mm);
+}
+
+
+} //NS end
+
+#include "StatsSpd.moc"
diff --git a/plugins/stats/StatsSpd.h b/plugins/stats/StatsSpd.h
new file mode 100644
index 0000000..7ba8d43
--- /dev/null
+++ b/plugins/stats/StatsSpd.h
@@ -0,0 +1,113 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef STATSSPD_H_
+#define STATSSPD_H_
+
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+#include <qgroupbox.h>
+
+#include "statspluginsettings.h"
+#include "statsspdwgt.h"
+#include "ChartDrawer.h"
+
+namespace kt {
+
+/**
+\brief Main widget of stats plugin
+\author Krzysztof Kundzicz <athantor@gmail.com>
+*/
+class StatsSpd : public StatsSpdWgt
+{
+ Q_OBJECT
+
+ private:
+ ///Layout of upload speed
+ QVBoxLayout * pmUSpdLay;
+ ///Layout of down speed
+ QVBoxLayout * pmDSpdLay;
+ ///Layout of peers speed
+ QVBoxLayout * pmPeersSpdLay;
+
+ ///Chart widget of download speed
+ ChartDrawer * pmDownCht;
+ ///Chart widget of peers speed
+ ChartDrawer * pmPeersSpdCht;
+ ///Chart widget of upload speed
+ ChartDrawer * pmUpCht;
+
+ public:
+ /**
+ \brief Constructor
+ \param p Parent
+ */
+ StatsSpd(QWidget *p = 0);
+ ///Destructor
+ virtual ~StatsSpd();
+
+ /**
+ \brief Adds value to upload speed chart
+ \param idx Dataset index
+ \param val Value
+ **/
+ void AddUpSpdVal(const size_t idx, const double val);
+ /**
+ \brief Adds value to download speed chart
+ \param idx Dataset index
+ \param val Value
+ **/
+ void AddDownSpdVal(const size_t idx, const double val);
+ /**
+ \brief Adds value to peers speed chart
+ \param idx Dataset index
+ \param val Value
+ **/
+ void AddPeersSpdVal(const size_t idx, const double val);
+ /**
+ \brief Changes download chart's measurments count
+ \param cnt Measurements
+ */
+ void ChangeDownMsmtCnt(const size_t cnt);
+ /**
+ \brief Changes peers speed chart's measurments count
+ \param cnt Measurements
+ */
+ void ChangePrsSpdMsmtCnt(const size_t cnt);
+ /**
+ \brief Changes upload chart's measurments count
+ \param cnt Measurements
+ */
+ void ChangeUpMsmtCnt(const size_t cnt);
+ /**
+ \brief Changes charts OY axis maximum mode
+ \param mm Mode
+ */
+ void ChangeChartsMaxMode(const ChartDrawer::MaxMode mm);
+
+ public slots:
+ ///Updates charts
+ void UpdateCharts();
+};
+
+}
+
+#endif
diff --git a/plugins/stats/ktstatsplugin.desktop b/plugins/stats/ktstatsplugin.desktop
new file mode 100644
index 0000000..79e620f
--- /dev/null
+++ b/plugins/stats/ktstatsplugin.desktop
@@ -0,0 +1,24 @@
+[Desktop Entry]
+Type=Service
+Name=StatsPlugin
+Name[bg]=Приставка за статистика
+Name[de]=Statistik-Modul
+Name[es]=Complemento de estadísticas
+Name[et]=Statistikaplugin
+Name[it]=Plugin statistiche
+Name[nds]=Statistik-Moduul
+Name[nl]=Statistiekenplugin
+Name[pl]=Wtyczka statystyk
+Name[pt]='Plugin' de Estatísticas
+Name[pt_BR]=Plugin de Estatísticas
+Name[sr]=Прикључак за статистику
+Name[sr@Latn]=Priključak za statistiku
+Name[sv]=Statistikinsticksprogram
+Name[tr]=Arama Eklentisi
+Name[uk]=Втулок статистики
+Name[xx]=xxStatsPluginxx
+Name[zh_CN]=统计插件
+Comment=
+Comment[xx]=xxxx
+ServiceTypes=KTorrent/Plugin
+X-KDE-Library=ktstatsplugin
diff --git a/plugins/stats/ktstatsplugin.kcfg b/plugins/stats/ktstatsplugin.kcfg
new file mode 100644
index 0000000..43c5dd4
--- /dev/null
+++ b/plugins/stats/ktstatsplugin.kcfg
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktinfowidgetpluginrc"/>
+ <group name="general">
+ <entry name="UpdateChartsEveryGuiUpdates" type="UInt">
+ <label>Update charts every</label>
+ <default>4</default>
+ </entry>
+ <entry name="GatherDataEveryMs" type="UInt">
+ <label>Gather data every</label>
+ <default>1000</default>
+ </entry>
+ <entry name="PeersSpeed" type="Bool">
+ <label>Toggle peers speed charts</label>
+ <default>true</default>
+ </entry>
+ <entry name="PeersSpeedDataIval" type="UInt">
+ <label>Interval between getting data about peers speed</label>
+ <default>4</default>
+ </entry>
+ <entry name="DrawLeechersInSwarms" type="Bool">
+ <label>Toggle drawing of leechers in swarms</label>
+ <default>false</default>
+ </entry>
+ <entry name="DrawSeedersInSwarms" type="Bool">
+ <label>Toggle drawing of seeders in swarms</label>
+ <default>false</default>
+ </entry>
+
+ <entry name="DownloadMeasurements" type="UInt">
+ <label>Download mesurments count</label>
+ <default>256</default>
+ </entry>
+ <entry name="PeersSpeedMeasurements" type="UInt">
+ <label>Peers speed mesurments count</label>
+ <default>256</default>
+ </entry>
+ <entry name="UploadMeasurements" type="UInt">
+ <label>Upload mesurments count</label>
+ <default>256</default>
+ </entry>
+ <entry name="ConnectionsMeasurements" type="UInt">
+ <label>Connections mesurments count</label>
+ <default>512</default>
+ </entry>
+ <entry name="DHTMeasurements" type="UInt">
+ <label>DHT mesurments count</label>
+ <default>512</default>
+ </entry>
+
+ <entry name="MaxSpdMode" type="UInt">
+ <label>OY axis max mode</label>
+ <default>1</default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/stats/sprefwgt.ui b/plugins/stats/sprefwgt.ui
new file mode 100644
index 0000000..7b6674a
--- /dev/null
+++ b/plugins/stats/sprefwgt.ui
@@ -0,0 +1,517 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>sprefwgt</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>sprefwgt</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string>Update</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Update charts every</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>GuiUpdatesSbw</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>GuiUpdatesSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>429496729</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>GUI updates</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>GuiUpdatesSbw</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Gather data every</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinBox2</cstring>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>DataIvalSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999999</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="lineStep">
+ <number>250</number>
+ </property>
+ <property name="value">
+ <number>1000</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>miliseconds</string>
+ </property>
+ <property name="buddy" stdset="0">
+ <cstring>spinBox2</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox5</cstring>
+ </property>
+ <property name="title">
+ <string>Maximum</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Maximum speed scale mode:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <item>
+ <property name="text">
+ <string>Top</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Exact</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>MaxSpdModeCbw</cstring>
+ </property>
+ <property name="currentItem">
+ <number>1</number>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>See 'What's this' for more help</string>
+ </property>
+ <property name="whatsThis" stdset="0">
+ <string>Set maximum value on OY scale as:
+- Top: Globally achieved maximum speed
+- Exact: Maximum achieved speed visible on chart</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string>Peers speed</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>PeersSpdCbw</cstring>
+ </property>
+ <property name="text">
+ <string>Peers speed:</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>update every</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>PeersSpdUpdIvalSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999999</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>4</number>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>chart data updates</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3_2</cstring>
+ </property>
+ <property name="text">
+ <string>Gathering data about many connected peers can be CPU consuming.</string>
+ </property>
+ <property name="alignment">
+ <set>WordBreak|AlignVCenter</set>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox11</cstring>
+ </property>
+ <property name="title">
+ <string>Peers connections</string>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string>Large values can obscure charts of connected peers</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>ConnSdrInSwaCbw</cstring>
+ </property>
+ <property name="text">
+ <string>Show seeders in swarms</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>ConnLchInSwaCbw</cstring>
+ </property>
+ <property name="text">
+ <string>Show leechers in swarms</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox8</cstring>
+ </property>
+ <property name="title">
+ <string>Measurements count</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3</cstring>
+ </property>
+ <property name="text">
+ <string>Download</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>DownloadMrmtSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999999</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>256</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout5_2</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3_2</cstring>
+ </property>
+ <property name="text">
+ <string>Peers speed</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>PeersSpdMrmtSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999999</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>256</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout5_3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3_3</cstring>
+ </property>
+ <property name="text">
+ <string>Upload</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>UploadMrmtSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999999</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>256</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="1">
+ <property name="name">
+ <cstring>layout5_5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3_5</cstring>
+ </property>
+ <property name="text">
+ <string>Connections</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>ConnsMrmtSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999999</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>512</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="1">
+ <property name="name">
+ <cstring>layout5_4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_3_4</cstring>
+ </property>
+ <property name="text">
+ <string>DHT</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>DHTMrmtSbw</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999999</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>512</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+</widget>
+<connections>
+ <connection>
+ <sender>PeersSpdCbw</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel2_2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>PeersSpdCbw</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>PeersSpdUpdIvalSbw</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+ <connection>
+ <sender>PeersSpdCbw</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>textLabel1_2</receiver>
+ <slot>setEnabled(bool)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/plugins/stats/statsconwgt.ui b/plugins/stats/statsconwgt.ui
new file mode 100644
index 0000000..07753dc
--- /dev/null
+++ b/plugins/stats/statsconwgt.ui
@@ -0,0 +1,48 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>StatsConWgt</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>StatsConWgt</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>PeersConGbw</cstring>
+ </property>
+ <property name="title">
+ <string>Peers</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>DHTGbw</cstring>
+ </property>
+ <property name="title">
+ <string>DHT</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/plugins/stats/statsplugin.cc b/plugins/stats/statsplugin.cc
new file mode 100644
index 0000000..d3d1b03
--- /dev/null
+++ b/plugins/stats/statsplugin.cc
@@ -0,0 +1,321 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#include "statsplugin.h"
+
+K_EXPORT_COMPONENT_FACTORY(ktstatsplugin, KGenericFactory<kt::StatsPlugin>("ktstatsplugin"))
+
+namespace kt
+{
+
+StatsPlugin::StatsPlugin(QObject* parent, const char* qt_name, const QStringList& args):
+ Plugin(parent, qt_name, args, "Statistics", i18n("Statistics"),"Krzysztof Kundzicz", "athantor@gmail.com", i18n("Shows transfers statistics"),"ktimemon"), pmUiSpd(0), pmUiCon(0), pmPrefsUi(0), pmUpdTmr(0)
+{
+ mUpAvg = std::make_pair(0.0, 0.0);
+ mDownAvg = std::make_pair(0.0, 0.0);
+ mLeechAvg = std::make_pair(0, 0);
+ mRunningLeechAvg = std::make_pair(0, 0);
+ mSeedAvg = std::make_pair(0, 0);
+ mRunningSeedAvg = std::make_pair(0, 0);
+}
+
+StatsPlugin::~StatsPlugin()
+{
+}
+
+void StatsPlugin::load()
+{
+
+ mUpdCtr = 1;
+ mPeerSpdUpdCtr = 1;
+
+ pmUiSpd = new StatsSpd(dynamic_cast<QWidget *>(parent()));
+ pmUiCon = new StatsCon(dynamic_cast<QWidget *>(parent()));
+ pmPrefsUi = new StatsPluginPrefs();
+ pmUpdTmr = new QTimer(this);
+
+ connect(pmUpdTmr, SIGNAL(timeout () ), this, SLOT(UpdateData()));
+ connect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(RestartTimer()));
+ connect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(TogglePeersSpdCht()));
+ connect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ToggleLchInSwmDrawing()));
+ connect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ToggleSdrInSwmDrawing()));
+ connect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ChangeMsmtsCounts()));
+ connect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ChangeMaxMode()));
+
+ TogglePeersSpdCht();
+ ChangeMaxMode();
+
+ pmUpdTmr -> start(StatsPluginSettings::gatherDataEveryMs());
+
+ getGUI() -> addToolWidget(pmUiSpd,"ktimemon" ,i18n("Speed statistics"), GUIInterface::DOCK_BOTTOM);
+ getGUI() -> addToolWidget(pmUiCon,"ktimemon" ,i18n("Connection statistics"), GUIInterface::DOCK_BOTTOM);
+ getGUI() -> addPrefPage (pmPrefsUi);
+
+}
+
+void StatsPlugin::unload()
+{
+ getGUI() -> removeToolWidget(pmUiSpd);
+ getGUI() -> removeToolWidget(pmUiCon);
+ getGUI() -> removePrefPage(pmPrefsUi);
+
+ disconnect(pmUpdTmr, SIGNAL(timeout()), this, SLOT(UpdateData()));
+ disconnect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(RestartTimer()));
+ disconnect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(TogglePeersSpdCht()));
+ disconnect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ToggleLchInSwmDrawing()));
+ disconnect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ToggleSdrInSwmDrawing()));
+ disconnect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ChangeMsmtsCounts()));
+ disconnect(pmPrefsUi, SIGNAL(Applied()), this, SLOT(ChangeMaxMode()));
+
+ delete pmUiSpd;
+ delete pmUiCon;
+ delete pmPrefsUi;
+ delete pmUpdTmr;
+}
+
+bool StatsPlugin::versionCheck(const QString& rVer) const
+{
+ return rVer == KT_VERSION_MACRO;
+}
+
+void StatsPlugin::guiUpdate()
+{
+ if(mUpdCtr >= StatsPluginSettings::updateChartsEveryGuiUpdates())
+ {
+ pmUiSpd -> UpdateCharts();
+ pmUiCon -> UpdateCharts();
+ mUpdCtr = 1;
+
+ } else {
+ mUpdCtr++;
+ }
+}
+
+void StatsPlugin::UpdateData()
+{
+ uint32_t lcon = 0;
+ uint32_t lswa = 0;
+ uint32_t scon = 0;
+ uint32_t sswa = 0;
+ uint32_t rlcon = 0;
+ uint32_t rlswa = 0;
+ uint32_t rscon = 0;
+ uint32_t rsswa = 0;
+
+ uint32_t ld = 0;
+ uint32_t lu = 0;
+ uint32_t sd = 0;
+
+ //---------------------------------------
+
+ mDownAvg.first += getCore() -> getStats() . download_speed;
+ mDownAvg.second++;
+
+ mUpAvg.first += getCore() -> getStats() . upload_speed;
+ mUpAvg.second++;
+
+ pmUiSpd -> AddDownSpdVal(0, getCore() -> getStats() . download_speed / 1024.0);
+ pmUiSpd -> AddUpSpdVal(0, getCore() -> getStats() . upload_speed / 1024.0);
+
+ pmUiSpd -> AddDownSpdVal(1, (mDownAvg.first / mDownAvg.second) / 1024.0 );
+ pmUiSpd -> AddUpSpdVal(1, (mUpAvg.first / mUpAvg.second) / 1024.0 );
+
+ pmUiSpd -> AddDownSpdVal(2, getCore() -> getMaxDownloadSpeed () );
+ pmUiSpd -> AddUpSpdVal(2, getCore() -> getMaxUploadSpeed ());
+
+// if(getGUI()-> getCurrentTorrent())
+// {
+// pmUi -> AddDownSpdVal(3, getGUI()-> getCurrentTorrent() -> getStats() . download_rate / 1024.0);
+// pmUi -> AddUpSpdVal(3, getGUI()-> getCurrentTorrent() -> getStats() . upload_rate / 1024.0);
+// } else {
+// pmUi -> AddDownSpdVal(3, 0.0);
+// pmUi -> AddUpSpdVal(3, 0.0);
+// }
+
+ // ------
+
+ bt::QueueManager::iterator tor = getCore() -> getQueueManager () -> begin();
+
+ while(tor != getCore() -> getQueueManager () -> end())
+ {
+ lcon += (*tor) -> getStats().leechers_connected_to;
+ lswa += (*tor) -> getStats().leechers_total;
+ scon += (*tor) -> getStats().seeders_connected_to;
+ sswa += (*tor) -> getStats().seeders_total;
+
+ mLeechAvg.first += lcon;
+ mLeechAvg.second += lswa;
+ mSeedAvg.first += scon;
+ mSeedAvg.second += sswa;
+
+ if(StatsPluginSettings::peersSpeed() && ( mPeerSpdUpdCtr >= StatsPluginSettings::peersSpeedDataIval() ) )
+ {
+ bt::TorrentControl * tc = dynamic_cast<bt::TorrentControl *>( *tor );
+ const bt::PeerManager * pm = tc->getPeerMgr();
+ if(tc && pm)
+ {
+ for(bt::PeerManager::CItr it = pm -> beginPeerList(); it != pm -> endPeerList (); ++it)
+ {
+ if(it && (*it) )
+ {
+ if(!(*it) -> isSeeder())
+ {
+ ld += (*it) -> getDownloadRate();
+ lu += (*it) -> getUploadRate();
+ } else {
+ sd += (*it) -> getDownloadRate();
+ }
+ }
+ }
+ }
+ }
+
+
+ if( (*tor) -> getStats().started)
+ {
+
+ rlcon += (*tor) -> getStats().leechers_connected_to;
+ rlswa += (*tor) -> getStats().leechers_total;
+ rscon += (*tor) -> getStats().seeders_connected_to;
+ rsswa += (*tor) -> getStats().seeders_total;
+
+ mRunningLeechAvg.first += rlcon;
+ mRunningLeechAvg.second += rlswa;
+ mRunningSeedAvg.first += rscon;
+ mRunningSeedAvg.second += rsswa;
+ }
+
+ tor++;
+ }
+
+ // ------
+
+ if(StatsPluginSettings::peersSpeed() )
+ {
+ if( mPeerSpdUpdCtr >= StatsPluginSettings::peersSpeedDataIval() )
+ {
+ pmUiSpd -> AddPeersSpdVal(0, (ld / (lcon * 1.0)) / 1024.0);
+ pmUiSpd -> AddPeersSpdVal(1, (lu / (lcon * 1.0)) / 1024.0);
+ pmUiSpd -> AddPeersSpdVal(2, (sd / (lswa * 1.0)) / 1024.0);
+ pmUiSpd -> AddPeersSpdVal(3, ld / 1024.0);
+ pmUiSpd -> AddPeersSpdVal(4, sd / 1024.0);
+
+ mPeerSpdUpdCtr = 1;
+ } else {
+ mPeerSpdUpdCtr++;
+ }
+ }
+
+ pmUiCon -> AddPeersConVal(0, lcon);
+ if(StatsPluginSettings::drawLeechersInSwarms())
+ {
+ pmUiCon -> AddPeersConVal(1, lswa);
+ }
+ pmUiCon -> AddPeersConVal(2, scon);
+ if(StatsPluginSettings::drawSeedersInSwarms())
+ {
+ pmUiCon -> AddPeersConVal(3, sswa);
+ }
+
+ double cnt = getCore() -> getQueueManager() -> count() * 1.0;
+ double rcnt = getCore() -> getQueueManager() -> getNumRunning() * 1.0;
+
+ pmUiCon -> AddPeersConVal(4, lcon / cnt );
+ pmUiCon -> AddPeersConVal(5, scon / cnt );
+ pmUiCon -> AddPeersConVal(6, lcon / rcnt);
+ pmUiCon -> AddPeersConVal(7, scon / rcnt );
+
+ // -----
+
+ if( bt::Globals::instance().getDHT().isRunning() )
+ {
+ pmUiCon -> AddDHTVal(0, bt::Globals::instance().getDHT(). getStats().num_peers);
+ pmUiCon -> AddDHTVal(1, bt::Globals::instance().getDHT(). getStats().num_tasks);
+ }
+}
+
+void StatsPlugin::RestartTimer()
+{
+ if( (!pmUpdTmr) || (!pmUpdTmr -> isActive()))
+ {
+ return;
+ }
+
+ pmUpdTmr -> stop();
+ pmUpdTmr -> start(StatsPluginSettings::gatherDataEveryMs());
+}
+
+void StatsPlugin::TogglePeersSpdCht()
+{
+ if(StatsPluginSettings::peersSpeed())
+ {
+ if(pmUiSpd -> PeersSpdGbw -> isHidden())
+ {
+ pmUiSpd -> PeersSpdGbw -> setHidden(false);
+ }
+ } else {
+ if(!pmUiSpd -> PeersSpdGbw -> isHidden())
+ {
+ pmUiSpd -> PeersSpdGbw -> setHidden(true);
+ }
+ }
+}
+
+void StatsPlugin::ToggleLchInSwmDrawing()
+{
+ if(!StatsPluginSettings::drawLeechersInSwarms())
+ {
+ pmUiCon -> ZeroPeersConn(1);
+ }
+}
+
+void StatsPlugin::ToggleSdrInSwmDrawing()
+{
+ if(!StatsPluginSettings::drawSeedersInSwarms())
+ {
+ pmUiCon -> ZeroPeersConn(3);
+ }
+}
+
+void StatsPlugin::ChangeMsmtsCounts()
+{
+ pmUiSpd -> ChangeDownMsmtCnt(StatsPluginSettings::downloadMeasurements());
+ pmUiSpd -> ChangePrsSpdMsmtCnt(StatsPluginSettings::peersSpeedMeasurements());
+ pmUiSpd -> ChangeUpMsmtCnt(StatsPluginSettings::uploadMeasurements());
+ pmUiCon -> ChangeConnMsmtCnt(StatsPluginSettings::connectionsMeasurements());
+ pmUiCon -> ChangeDHTMsmtCnt(StatsPluginSettings::dHTMeasurements());
+}
+
+void StatsPlugin::ChangeMaxMode()
+{
+ if(StatsPluginSettings::maxSpdMode() == 0)
+ {
+ pmUiSpd -> ChangeChartsMaxMode(ChartDrawer::MaxModeTop);
+ pmUiCon -> ChangeChartsMaxMode(ChartDrawer::MaxModeTop);
+
+ } else if (StatsPluginSettings::maxSpdMode() == 1) {
+ pmUiSpd -> ChangeChartsMaxMode(ChartDrawer::MaxModeExact);
+ pmUiCon -> ChangeChartsMaxMode(ChartDrawer::MaxModeExact);
+ }
+}
+
+} // NS end
+
+#include "statsplugin.moc"
diff --git a/plugins/stats/statsplugin.h b/plugins/stats/statsplugin.h
new file mode 100644
index 0000000..14f1fcd
--- /dev/null
+++ b/plugins/stats/statsplugin.h
@@ -0,0 +1,153 @@
+/***************************************************************************
+ * Copyright © 2007 by Krzysztof Kundzicz *
+ * athantor@gmail.com *
+ * *
+ * 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., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef StatsPlugin_H_
+#define StatsPlugin_H_
+
+#include <kgenericfactory.h>
+
+#include <qwidget.h>
+#include <qtimer.h>
+
+#include <interfaces/plugin.h>
+#include <interfaces/guiinterface.h>
+#include <interfaces/coreinterface.h>
+#include <torrent/globals.h>
+#include <kademlia/dhtbase.h>
+#include <torrent/queuemanager.h>
+#include <torrent/torrentcontrol.h>
+#include <torrent/peermanager.h>
+#include <torrent/peer.h>
+
+#include "StatsSpd.h"
+#include "StatsCon.h"
+#include "StatsPluginPrefs.h"
+#include "statspluginsettings.h"
+#include <map> // std::pair
+
+namespace kt {
+
+/**
+\brief Statistics plugin
+\author Krzysztof Kundzicz <athantor@gmail.com>
+\version 200705191548
+*/
+class StatsPlugin : public Plugin
+{
+ Q_OBJECT
+
+ private:
+ ///Speed UI of the plugin
+ StatsSpd * pmUiSpd;
+ ///Connections UI of the plugin
+ StatsCon * pmUiCon;
+ ///UI of the pref page
+ StatsPluginPrefs * pmPrefsUi;
+ /**
+ \brief Average upload speed data
+
+ \li \c first: Total speed
+ \li \c second: Measurements count
+ */
+ std::pair<long double, long double> mUpAvg;
+ /**
+ \brief Average download speed data
+
+ \li \c first: Total speed
+ \li \c second: Measurements count
+ */
+ std::pair<long double, long double> mDownAvg;
+ /**
+ \brief Leechers stats
+
+ \li \c first: connected
+ \li \c second: swarm
+ */
+ std::pair<uint32_t, uint32_t> mLeechAvg;
+ /**
+ \brief Leechers stats on running torrents
+
+ \li \c first: connected
+ \li \c second: swarm
+ */
+ std::pair<uint32_t, uint32_t> mRunningLeechAvg;
+ /**
+ \brief Seeders stats
+
+ \li \c first: connected
+ \li \c second: swarm
+ */
+ std::pair<uint32_t, uint32_t> mSeedAvg;
+ /**
+ \brief Seeders stats on running torrents
+
+ \li \c first: connected
+ \li \c second: swarm
+ */
+ std::pair<uint32_t, uint32_t> mRunningSeedAvg;
+
+ ///Data update timer
+ QTimer * pmUpdTmr;
+
+ ///Update ctr
+ uint32_t mUpdCtr;
+ uint32_t mPeerSpdUpdCtr;
+
+ private slots:
+ ///Updates stat data
+ void UpdateData();
+ /**
+ \brief Restarts timer
+
+ Restarts timer when the interval of data gathering has been changed
+ */
+ void RestartTimer();
+ ///Toggles peers speed chart
+ void TogglePeersSpdCht();
+ ///Toggles drawing of total leechers in swarms
+ void ToggleLchInSwmDrawing();
+ ///Toggles drawing of total seeders in swarms
+ void ToggleSdrInSwmDrawing();
+ ///Changes measurements counts
+ void ChangeMsmtsCounts();
+ ///Changes OY max mode
+ void ChangeMaxMode();
+
+ public:
+ /**
+ \brief Constructor
+ \param parent Parent
+ \param qt_name
+ \param args
+ */
+ StatsPlugin(QObject* parent, const char* qt_name, const QStringList& args);
+ ///Destructor
+ virtual ~StatsPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString&) const;
+ virtual void guiUpdate();
+};
+
+}
+
+#endif
+
diff --git a/plugins/stats/statspluginsettings.kcfgc b/plugins/stats/statspluginsettings.kcfgc
new file mode 100644
index 0000000..d809d30
--- /dev/null
+++ b/plugins/stats/statspluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktstatsplugin.kcfg
+ClassName=StatsPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables
diff --git a/plugins/stats/statsspdwgt.ui b/plugins/stats/statsspdwgt.ui
new file mode 100644
index 0000000..162bf9c
--- /dev/null
+++ b/plugins/stats/statsspdwgt.ui
@@ -0,0 +1,56 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>StatsSpdWgt</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>StatsSpdWgt</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>480</height>
+ </rect>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>DownSpeedGbw</cstring>
+ </property>
+ <property name="title">
+ <string>Download</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>PeersSpdGbw</cstring>
+ </property>
+ <property name="title">
+ <string>Peers</string>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>UpSpeedGbw</cstring>
+ </property>
+ <property name="title">
+ <string>Upload</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/plugins/upnp/Makefile.am b/plugins/upnp/Makefile.am
new file mode 100644
index 0000000..8432f90
--- /dev/null
+++ b/plugins/upnp/Makefile.am
@@ -0,0 +1,38 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+
+libktupnp_la_LDFLAGS = $(all_libraries)
+noinst_LTLIBRARIES = libktupnp.la
+libktupnp_la_SOURCES = soap.cpp upnpdescriptionparser.cpp upnpmcastsocket.cpp\
+ upnprouter.cpp
+
+kde_module_LTLIBRARIES = ktupnpplugin.la
+noinst_HEADERS = upnpplugin.h upnpmcastsocket.h upnprouter.h upnpprefpage.h \
+ upnpprefwidget.h upnpdescriptionparser.h soap.h
+ktupnpplugin_la_SOURCES = upnpplugin.cpp upnpprefpage.cpp upnpwidget.ui \
+ upnpprefwidget.cpp upnppluginsettings.kcfgc
+
+# Libs needed by the plugin
+ktupnpplugin_la_LIBADD = libktupnp.la \
+ $(LIB_KPARTS) ../../libktorrent/libktorrent.la \
+ $(LIB_QT) \
+ $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktupnpplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktsearchplugin
+# plugins_DATA = ktsearchpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktupnpplugin.desktop
+
+kde_kcfg_DATA = ktupnpplugin.kcfg
+
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/upnp/ktupnpplugin.desktop b/plugins/upnp/ktupnpplugin.desktop
new file mode 100644
index 0000000..67948d7
--- /dev/null
+++ b/plugins/upnp/ktupnpplugin.desktop
@@ -0,0 +1,26 @@
+[Desktop Entry]
+Name=UPnPPlugin
+Name[bg]=Приставка UPnP
+Name[br]=Lugent UPnP
+Name[de]=UPnP-Modul
+Name[el]=Πρόσθετο UPnP
+Name[es]=Complemento UPnP
+Name[et]=UPnP plugin
+Name[it]=Plugin UPnP
+Name[nb]=UPnP-modul
+Name[nds]=UPnP-Moduul
+Name[nl]=UPnP-plugin
+Name[pl]=Wtyczka UPnP
+Name[pt]='Plugin' UPnP
+Name[pt_BR]=Plugin UPnP
+Name[sk]=UPnP Plugin
+Name[sr]=Прикључак за UPnP
+Name[sr@Latn]=Priključak za UPnP
+Name[sv]=UPnP-insticksprogram
+Name[tr]=UPnP Eklentisi
+Name[xx]=xxUPnPPluginxx
+Name[zh_CN]=UPnP 插件
+Name[zh_TW]=UPnP外掛程式
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktupnpplugin
diff --git a/plugins/upnp/ktupnpplugin.kcfg b/plugins/upnp/ktupnpplugin.kcfg
new file mode 100644
index 0000000..acce783
--- /dev/null
+++ b/plugins/upnp/ktupnpplugin.kcfg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktupnppluginrc"/>
+ <group name="general">
+ <entry name="defaultDevice" type="String">
+ <label>Default UPnP device to use</label>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/upnp/soap.cpp b/plugins/upnp/soap.cpp
new file mode 100644
index 0000000..b155b55
--- /dev/null
+++ b/plugins/upnp/soap.cpp
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "soap.h"
+
+namespace kt
+{
+
+ QString SOAP::createCommand(const QString & action,const QString & service)
+ {
+ QString comm = QString("<?xml version=\"1.0\"?>\r\n"
+ "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<SOAP-ENV:Body>"
+ "<m:%1 xmlns:m=\"%2\"/>"
+ "</SOAP-ENV:Body></SOAP-ENV:Envelope>"
+ "\r\n").arg(action).arg(service);
+
+ return comm;
+ }
+
+ QString SOAP::createCommand(const QString & action,const QString & service,const QValueList<Arg> & args)
+ {
+ QString comm = QString("<?xml version=\"1.0\"?>\r\n"
+ "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
+ "<SOAP-ENV:Body>"
+ "<m:%1 xmlns:m=\"%2\">").arg(action).arg(service);
+
+ for (QValueList<Arg>::const_iterator i = args.begin();i != args.end();i++)
+ {
+ const Arg & a = *i;
+ comm += "<" + a.element + ">" + a.value + "</" + a.element + ">";
+ }
+
+ comm += QString("</m:%1></SOAP-ENV:Body></SOAP-ENV:Envelope>\r\n").arg(action);
+ return comm;
+ }
+}
diff --git a/plugins/upnp/soap.h b/plugins/upnp/soap.h
new file mode 100644
index 0000000..c11e2ed
--- /dev/null
+++ b/plugins/upnp/soap.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTSOAP_H
+#define KTSOAP_H
+
+#include <qvaluelist.h>
+#include <qstring.h>
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson
+ */
+ class SOAP
+ {
+ public:
+
+ /**
+ * Create a simple UPnP SOAP command without parameters.
+ * @param action The name of the action
+ * @param service The name of the service
+ * @return The command
+ */
+ static QString createCommand(const QString & action,const QString & service);
+
+ struct Arg
+ {
+ QString element;
+ QString value;
+ };
+
+ /**
+ * Create a UPnP SOAP command with parameters.
+ * @param action The name of the action
+ * @param service The name of the service
+ * @param args Arguments for command
+ * @return The command
+ */
+ static QString createCommand(const QString & action,const QString & service,const QValueList<Arg> & args);
+ };
+
+}
+
+#endif
diff --git a/plugins/upnp/upnpdescriptionparser.cpp b/plugins/upnp/upnpdescriptionparser.cpp
new file mode 100644
index 0000000..43afbc3
--- /dev/null
+++ b/plugins/upnp/upnpdescriptionparser.cpp
@@ -0,0 +1,220 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qxml.h>
+#include <qvaluestack.h>
+#include <util/fileops.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "upnprouter.h"
+#include "upnpdescriptionparser.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ class XMLContentHandler : public QXmlDefaultHandler
+ {
+ enum Status
+ {
+ TOPLEVEL,ROOT,DEVICE,SERVICE,FIELD,OTHER
+ };
+
+ QString tmp;
+ UPnPRouter* router;
+ UPnPService curr_service;
+ QValueStack<Status> status_stack;
+ public:
+ XMLContentHandler(UPnPRouter* router);
+ virtual ~XMLContentHandler();
+
+
+ bool startDocument();
+ bool endDocument();
+ bool startElement(const QString &, const QString & localName, const QString &,
+ const QXmlAttributes & atts);
+ bool endElement(const QString & , const QString & localName, const QString & );
+ bool characters(const QString & ch);
+
+ bool interestingDeviceField(const QString & name);
+ bool interestingServiceField(const QString & name);
+ };
+
+
+ UPnPDescriptionParser::UPnPDescriptionParser()
+ {}
+
+
+ UPnPDescriptionParser::~UPnPDescriptionParser()
+ {}
+
+ bool UPnPDescriptionParser::parse(const QString & file,UPnPRouter* router)
+ {
+ bool ret = true;
+ {
+ QFile fptr(file);
+ if (!fptr.open(IO_ReadOnly))
+ return false;
+
+ QXmlInputSource input(&fptr);
+ XMLContentHandler chandler(router);
+ QXmlSimpleReader reader;
+
+ reader.setContentHandler(&chandler);
+ ret = reader.parse(&input,false);
+ }
+
+ if (!ret)
+ {
+ Out(SYS_PNP|LOG_IMPORTANT) << "Error parsing XML" << endl;
+ return false;
+ }
+ return true;
+ }
+
+ /////////////////////////////////////////////////////////////////////////////////
+
+
+ XMLContentHandler::XMLContentHandler(UPnPRouter* router) : router(router)
+ {}
+
+ XMLContentHandler::~XMLContentHandler()
+ {}
+
+
+ bool XMLContentHandler::startDocument()
+ {
+ status_stack.push(TOPLEVEL);
+ return true;
+ }
+
+ bool XMLContentHandler::endDocument()
+ {
+ status_stack.pop();
+ return true;
+ }
+
+ bool XMLContentHandler::interestingDeviceField(const QString & name)
+ {
+ return name == "friendlyName" || name == "manufacturer" || name == "modelDescription" ||
+ name == "modelName" || name == "modelNumber";
+ }
+
+
+ bool XMLContentHandler::interestingServiceField(const QString & name)
+ {
+ return name == "serviceType" || name == "serviceId" || name == "SCPDURL" ||
+ name == "controlURL" || name == "eventSubURL";
+ }
+
+ bool XMLContentHandler::startElement(const QString &, const QString & localName, const QString &,
+ const QXmlAttributes & )
+ {
+ tmp = "";
+ switch (status_stack.top())
+ {
+ case TOPLEVEL:
+ // from toplevel we can only go to root
+ if (localName == "root")
+ status_stack.push(ROOT);
+ else
+ return false;
+ break;
+ case ROOT:
+ // from the root we can go to device or specVersion
+ // we are not interested in the specVersion
+ if (localName == "device")
+ status_stack.push(DEVICE);
+ else
+ status_stack.push(OTHER);
+ break;
+ case DEVICE:
+ // see if it is a field we are interested in
+ if (interestingDeviceField(localName))
+ status_stack.push(FIELD);
+ else
+ status_stack.push(OTHER);
+ break;
+ case SERVICE:
+ if (interestingServiceField(localName))
+ status_stack.push(FIELD);
+ else
+ status_stack.push(OTHER);
+ break;
+ case OTHER:
+ if (localName == "service")
+ status_stack.push(SERVICE);
+ else if (localName == "device")
+ status_stack.push(DEVICE);
+ else
+ status_stack.push(OTHER);
+ break;
+ case FIELD:
+ break;
+ }
+ return true;
+ }
+
+ bool XMLContentHandler::endElement(const QString & , const QString & localName, const QString & )
+ {
+ switch (status_stack.top())
+ {
+ case FIELD:
+ // we have a field so set it
+ status_stack.pop();
+ if (status_stack.top() == DEVICE)
+ {
+ // if we are in a device
+ router->getDescription().setProperty(localName,tmp);
+ }
+ else if (status_stack.top() == SERVICE)
+ {
+ // set a property of a service
+ curr_service.setProperty(localName,tmp);
+ }
+ break;
+ case SERVICE:
+ // add the service
+ router->addService(curr_service);
+ curr_service.clear();
+ // pop the stack
+ status_stack.pop();
+ break;
+ default:
+ status_stack.pop();
+ break;
+ }
+
+ // reset tmp
+ tmp = "";
+ return true;
+ }
+
+
+ bool XMLContentHandler::characters(const QString & ch)
+ {
+ if (ch.length() > 0)
+ {
+ tmp += ch;
+ }
+ return true;
+ }
+
+}
diff --git a/plugins/upnp/upnpdescriptionparser.h b/plugins/upnp/upnpdescriptionparser.h
new file mode 100644
index 0000000..5d4bf1e
--- /dev/null
+++ b/plugins/upnp/upnpdescriptionparser.h
@@ -0,0 +1,49 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTUPNPDESCRIPTIONPARSER_H
+#define KTUPNPDESCRIPTIONPARSER_H
+
+namespace kt
+{
+ class UPnPRouter;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Parses the xml description of a router.
+ */
+ class UPnPDescriptionParser
+ {
+ public:
+ UPnPDescriptionParser();
+ virtual ~UPnPDescriptionParser();
+
+ /**
+ * Parse the xml description.
+ * @param file File it is located in
+ * @param router The router off the xml description
+ * @return true upon success
+ */
+ bool parse(const QString & file,UPnPRouter* router);
+ };
+
+}
+
+#endif
diff --git a/plugins/upnp/upnpmcastsocket.cpp b/plugins/upnp/upnpmcastsocket.cpp
new file mode 100644
index 0000000..47712ea
--- /dev/null
+++ b/plugins/upnp/upnpmcastsocket.cpp
@@ -0,0 +1,312 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kurl.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <arpa/inet.h>
+#include <netinet/ip.h>
+#include <qstringlist.h>
+#include <ksocketdevice.h>
+#include <ksocketaddress.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include <qfile.h>
+#include <qtextstream.h>
+#include "upnpmcastsocket.h"
+
+
+
+using namespace KNetwork;
+using namespace bt;
+
+namespace kt
+{
+
+ UPnPMCastSocket::UPnPMCastSocket(bool verbose) : verbose(verbose)
+ {
+ routers.setAutoDelete(true);
+ QObject::connect(this,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
+ QObject::connect(this,SIGNAL(gotError(int)),this,SLOT(onError(int)));
+ setAddressReuseable(true);
+ setFamily(KNetwork::KResolver::IPv4Family);
+ setBlocking(true);
+ for (Uint32 i = 0;i < 10;i++)
+ {
+ if (!bind(QString::null,QString::number(1900 + i)))
+ Out(SYS_PNP|LOG_IMPORTANT) << "Cannot bind to UDP port 1900" << endl;
+ else
+ break;
+ }
+ setBlocking(false);
+ joinUPnPMCastGroup();
+ }
+
+
+ UPnPMCastSocket::~UPnPMCastSocket()
+ {
+ leaveUPnPMCastGroup();
+ QObject::disconnect(this,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
+ QObject::disconnect(this,SIGNAL(gotError(int)),this,SLOT(onError(int)));
+ }
+
+ void UPnPMCastSocket::discover()
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Trying to find UPnP devices on the local network" << endl;
+
+ // send a HTTP M-SEARCH message to 239.255.255.250:1900
+ const char* data = "M-SEARCH * HTTP/1.1\r\n"
+ "HOST: 239.255.255.250:1900\r\n"
+ "ST:urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n"
+ "MAN:\"ssdp:discover\"\r\n"
+ "MX:3\r\n"
+ "\r\n\0";
+
+ if (verbose)
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Sending : " << endl;
+ Out(SYS_PNP|LOG_NOTICE) << data << endl;
+ }
+
+ KDatagramSocket::send(KNetwork::KDatagramPacket(data,strlen(data),KInetSocketAddress("239.255.255.250",1900)));
+ }
+
+ void UPnPMCastSocket::onXmlFileDownloaded(UPnPRouter* r,bool success)
+ {
+ if (!success)
+ {
+ // we couldn't download and parse the XML file so
+ // get rid of it
+ r->deleteLater();
+ }
+ else
+ {
+ // add it to the list and emit the signal
+ if (!routers.contains(r->getServer()))
+ {
+ routers.insert(r->getServer(),r);
+ discovered(r);
+ }
+ else
+ {
+ r->deleteLater();
+ }
+ }
+ }
+
+ void UPnPMCastSocket::onReadyRead()
+ {
+ if (bytesAvailable() == 0)
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "0 byte UDP packet " << endl;
+ // KDatagramSocket wrongly handles UDP packets with no payload
+ // so we need to deal with it oursleves
+ int fd = socketDevice()->socket();
+ char tmp;
+ read(fd,&tmp,1);
+ return;
+ }
+
+ KNetwork::KDatagramPacket p = KDatagramSocket::receive();
+ if (p.isNull())
+ return;
+
+ if (verbose)
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Received : " << endl;
+ Out(SYS_PNP|LOG_NOTICE) << QString(p.data()) << endl;
+ }
+
+ // try to make a router of it
+ UPnPRouter* r = parseResponse(p.data());
+ if (r)
+ {
+ QObject::connect(r,SIGNAL(xmlFileDownloaded( UPnPRouter*, bool )),
+ this,SLOT(onXmlFileDownloaded( UPnPRouter*, bool )));
+
+ // download it's xml file
+ r->downloadXMLFile();
+ }
+ }
+
+ UPnPRouter* UPnPMCastSocket::parseResponse(const QByteArray & arr)
+ {
+ QStringList lines = QStringList::split("\r\n",QString(arr),false);
+ QString server;
+ KURL location;
+
+ /*
+ Out(SYS_PNP|LOG_DEBUG) << "Received : " << endl;
+ for (Uint32 idx = 0;idx < lines.count(); idx++)
+ Out(SYS_PNP|LOG_DEBUG) << lines[idx] << endl;
+ */
+
+ // first read first line and see if contains a HTTP 200 OK message
+ QString line = lines.first();
+ if (!line.contains("HTTP"))
+ {
+ // it is either a 200 OK or a NOTIFY
+ if (!line.contains("NOTIFY") && !line.contains("200"))
+ return 0;
+ }
+ else if (line.contains("M-SEARCH")) // ignore M-SEARCH
+ return 0;
+
+ // quick check that the response being parsed is valid
+ bool validDevice = false;
+ for (Uint32 idx = 0;idx < lines.count() && !validDevice; idx++)
+ {
+ line = lines[idx];
+ if ((line.contains("ST:") || line.contains("NT:")) && line.contains("InternetGatewayDevice"))
+ {
+ validDevice = true;
+ }
+ }
+ if (!validDevice)
+ {
+ // Out(SYS_PNP|LOG_IMPORTANT) << "Not a valid Internet Gateway Device" << endl;
+ return 0;
+ }
+
+ // read all lines and try to find the server and location fields
+ for (Uint32 i = 1;i < lines.count();i++)
+ {
+ line = lines[i];
+ if (line.startsWith("Location") || line.startsWith("LOCATION") || line.startsWith("location"))
+ {
+ location = line.mid(line.find(':') + 1).stripWhiteSpace();
+ if (!location.isValid())
+ return 0;
+ }
+ else if (line.startsWith("Server") || line.startsWith("server") || line.startsWith("SERVER"))
+ {
+ server = line.mid(line.find(':') + 1).stripWhiteSpace();
+ if (server.length() == 0)
+ return 0;
+
+ }
+ }
+
+ if (routers.contains(server))
+ {
+ return 0;
+ }
+ else
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Detected IGD " << server << endl;
+ // everything OK, make a new UPnPRouter
+ return new UPnPRouter(server,location,verbose);
+ }
+ }
+
+ void UPnPMCastSocket::onError(int)
+ {
+ Out(SYS_PNP|LOG_IMPORTANT) << "UPnPMCastSocket Error : " << errorString() << endl;
+ }
+
+ void UPnPMCastSocket::saveRouters(const QString & file)
+ {
+ QFile fptr(file);
+ if (!fptr.open(IO_WriteOnly))
+ {
+ Out(SYS_PNP|LOG_IMPORTANT) << "Cannot open file " << file << " : " << fptr.errorString() << endl;
+ return;
+ }
+
+ // file format is simple : 2 lines per router,
+ // one containing the server, the other the location
+ QTextStream fout(&fptr);
+ bt::PtrMap<QString,UPnPRouter>::iterator i = routers.begin();
+ while (i != routers.end())
+ {
+ UPnPRouter* r = i->second;
+ fout << r->getServer() << endl;
+ fout << r->getLocation().prettyURL() << endl;
+ i++;
+ }
+ }
+
+ void UPnPMCastSocket::loadRouters(const QString & file)
+ {
+ QFile fptr(file);
+ if (!fptr.open(IO_ReadOnly))
+ {
+ Out(SYS_PNP|LOG_IMPORTANT) << "Cannot open file " << file << " : " << fptr.errorString() << endl;
+ return;
+ }
+
+ // file format is simple : 2 lines per router,
+ // one containing the server, the other the location
+ QTextStream fin(&fptr);
+
+ while (!fin.atEnd())
+ {
+ QString server, location;
+ server = fin.readLine();
+ location = fin.readLine();
+ if (!routers.contains(server))
+ {
+ UPnPRouter* r = new UPnPRouter(server,location);
+ // download it's xml file
+ QObject::connect(r,SIGNAL(xmlFileDownloaded( UPnPRouter*, bool )),this,SLOT(onXmlFileDownloaded( UPnPRouter*, bool )));
+ r->downloadXMLFile();
+ }
+ }
+ }
+
+ void UPnPMCastSocket::joinUPnPMCastGroup()
+ {
+ int fd = socketDevice()->socket();
+ struct ip_mreq mreq;
+
+ memset(&mreq,0,sizeof(struct ip_mreq));
+
+ inet_aton("239.255.255.250",&mreq.imr_multiaddr);
+ mreq.imr_interface.s_addr = htonl(INADDR_ANY);
+
+ if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(struct ip_mreq)) < 0)
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Failed to join multicast group 239.255.255.250" << endl;
+ }
+ }
+
+ void UPnPMCastSocket::leaveUPnPMCastGroup()
+ {
+ int fd = socketDevice()->socket();
+ struct ip_mreq mreq;
+
+ memset(&mreq,0,sizeof(struct ip_mreq));
+
+ inet_aton("239.255.255.250",&mreq.imr_multiaddr);
+ mreq.imr_interface.s_addr = htonl(INADDR_ANY);
+
+ if (setsockopt(fd,IPPROTO_IP,IP_DROP_MEMBERSHIP,&mreq,sizeof(struct ip_mreq)) < 0)
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Failed to leave multicast group 239.255.255.250" << endl;
+ }
+ }
+}
+
+
+
+#include "upnpmcastsocket.moc"
diff --git a/plugins/upnp/upnpmcastsocket.h b/plugins/upnp/upnpmcastsocket.h
new file mode 100644
index 0000000..493c5b9
--- /dev/null
+++ b/plugins/upnp/upnpmcastsocket.h
@@ -0,0 +1,91 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTUPNPMCASTSOCKET_H
+#define KTUPNPMCASTSOCKET_H
+
+#include <util/ptrmap.h>
+#include <kdatagramsocket.h>
+#include <util/constants.h>
+#include "upnprouter.h"
+
+using bt::Uint32;
+
+namespace kt
+{
+ class UPnPRouter;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Socket used to discover UPnP devices. This class will keep track
+ * of all discovered devices.
+ */
+ class UPnPMCastSocket : public KNetwork::KDatagramSocket
+ {
+ Q_OBJECT
+ public:
+ UPnPMCastSocket(bool verbose = false);
+ virtual ~UPnPMCastSocket();
+
+ /// Get the number of routers discovered
+ Uint32 getNumDevicesDiscovered() const {return routers.count();}
+
+ /// Find a router using it's server name
+ UPnPRouter* findDevice(const QString & name) {return routers.find(name);}
+
+ /// Save all routers to a file (for convenience at startup)
+ void saveRouters(const QString & file);
+
+ /// Load all routers from a file
+ void loadRouters(const QString & file);
+
+ public slots:
+ /**
+ * Try to discover a UPnP device on the network.
+ * A signal will be emitted when a device is found.
+ */
+ void discover();
+
+ private slots:
+ void onReadyRead();
+ void onError(int);
+ void onXmlFileDownloaded(UPnPRouter* r,bool success);
+
+ signals:
+ /**
+ * Emitted when a router or internet gateway device is detected.
+ * @param router The router
+ */
+ void discovered(UPnPRouter* router);
+
+ public:
+ UPnPRouter* parseResponse(const QByteArray & arr);
+
+ private:
+ void joinUPnPMCastGroup();
+ void leaveUPnPMCastGroup();
+
+ private:
+ bt::PtrMap<QString,UPnPRouter> routers;
+ bool verbose;
+ };
+}
+
+#endif
diff --git a/plugins/upnp/upnpplugin.cpp b/plugins/upnp/upnpplugin.cpp
new file mode 100644
index 0000000..dbe58b4
--- /dev/null
+++ b/plugins/upnp/upnpplugin.cpp
@@ -0,0 +1,95 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+#include <kglobal.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+#include <kstdaction.h>
+#include <kpopupmenu.h>
+#include <interfaces/guiinterface.h>
+#include <util/fileops.h>
+#include "upnpplugin.h"
+#include "upnpmcastsocket.h"
+#include "upnpprefpage.h"
+
+
+#define NAME "UPnP"
+#define AUTHOR "Joris Guisson"
+#define EMAIL "joris.guisson@gmail.com"
+
+
+
+K_EXPORT_COMPONENT_FACTORY(ktupnpplugin,KGenericFactory<kt::UPnPPlugin>("ktupnpplugin"))
+
+namespace kt
+{
+
+ UPnPPlugin::UPnPPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("UPnP"),AUTHOR,EMAIL,i18n("Uses UPnP to automatically forward ports on your router"),"ktupnp")
+ {
+ sock = 0;
+ pref = 0;
+ }
+
+
+ UPnPPlugin::~UPnPPlugin()
+ {
+ delete sock;
+ delete pref;
+ }
+
+
+ void UPnPPlugin::load()
+ {
+ //KIconLoader* iload = KGlobal::iconLoader();
+ sock = new UPnPMCastSocket();
+ pref = new UPnPPrefPage(sock);
+ this->getGUI()->addPrefPage(pref);
+ // load the routers list
+ QString routers_file = KGlobal::dirs()->saveLocation("data","ktorrent") + "routers";
+ if (bt::Exists(routers_file))
+ sock->loadRouters(routers_file);
+ sock->discover();
+ }
+
+ void UPnPPlugin::unload()
+ {
+ QString routers_file = KGlobal::dirs()->saveLocation("data","ktorrent") + "routers";
+ sock->saveRouters(routers_file);
+ this->getGUI()->removePrefPage(pref);
+ sock->close();
+ delete pref;
+ pref = 0;
+ delete sock;
+ sock = 0;
+ }
+
+ void UPnPPlugin::shutdown(bt::WaitJob* job)
+ {
+ pref->shutdown(job);
+ }
+
+ bool UPnPPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+}
+#include "upnpplugin.moc"
diff --git a/plugins/upnp/upnpplugin.h b/plugins/upnp/upnpplugin.h
new file mode 100644
index 0000000..a6ca78a
--- /dev/null
+++ b/plugins/upnp/upnpplugin.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTSEARCHPLUGIN_H
+#define KTSEARCHPLUGIN_H
+
+#include <interfaces/plugin.h>
+
+namespace kt
+{
+ class UPnPMCastSocket;
+ class UPnPPrefPage;
+
+ /**
+ @author Joris Guisson
+ */
+ class UPnPPlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ UPnPPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~UPnPPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual void shutdown(bt::WaitJob* job);
+ virtual bool versionCheck(const QString& version) const;
+ private:
+ UPnPMCastSocket* sock;
+ UPnPPrefPage* pref;
+ };
+
+}
+
+#endif
diff --git a/plugins/upnp/upnppluginsettings.kcfgc b/plugins/upnp/upnppluginsettings.kcfgc
new file mode 100644
index 0000000..6cab465
--- /dev/null
+++ b/plugins/upnp/upnppluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktupnpplugin.kcfg
+ClassName=UPnPPluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables
diff --git a/plugins/upnp/upnpprefpage.cpp b/plugins/upnp/upnpprefpage.cpp
new file mode 100644
index 0000000..dc50c2f
--- /dev/null
+++ b/plugins/upnp/upnpprefpage.cpp
@@ -0,0 +1,67 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include "upnpprefpage.h"
+#include "upnpprefwidget.h"
+#include "upnprouter.h"
+#include "upnpmcastsocket.h"
+
+namespace kt
+{
+
+ UPnPPrefPage::UPnPPrefPage(UPnPMCastSocket* sock): PrefPageInterface(i18n("UPnP"), i18n("UPnP Devices"),KGlobal::iconLoader()->loadIcon("ktupnp",KIcon::NoGroup)),sock(sock)
+ {
+ widget = 0;
+ }
+
+
+ UPnPPrefPage::~UPnPPrefPage()
+ {}
+
+
+ bool UPnPPrefPage::apply()
+ {
+ return true;
+ }
+
+ void UPnPPrefPage::createWidget(QWidget* parent)
+ {
+ widget = new UPnPPrefWidget(parent);
+ QObject::connect(sock,SIGNAL(discovered(UPnPRouter* )),widget,SLOT(addDevice(UPnPRouter* )));
+ QObject::connect(widget,SIGNAL(rescan()),sock,SLOT(discover()));
+ }
+
+ void UPnPPrefPage::deleteWidget()
+ {
+ delete widget;
+ widget = 0;
+ }
+
+ void UPnPPrefPage::updateData()
+ {
+ }
+
+ void UPnPPrefPage::shutdown(bt::WaitJob* job)
+ {
+ widget->shutdown(job);
+ }
+}
diff --git a/plugins/upnp/upnpprefpage.h b/plugins/upnp/upnpprefpage.h
new file mode 100644
index 0000000..7d5b4f5
--- /dev/null
+++ b/plugins/upnp/upnpprefpage.h
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTUPNPPREFPAGE_H
+#define KTUPNPPREFPAGE_H
+
+#include <interfaces/prefpageinterface.h>
+
+namespace bt
+{
+ class WaitJob;
+}
+
+namespace kt
+{
+ class UPnPMCastSocket;
+ class UPnPPrefWidget;
+
+ /**
+ * @author Joris Guisson
+ *
+ * Page in the preference dialog for the UPnP plugin.
+ */
+ class UPnPPrefPage : public PrefPageInterface
+ {
+ UPnPMCastSocket* sock;
+ UPnPPrefWidget* widget;
+ public:
+ UPnPPrefPage(UPnPMCastSocket* sock);
+ virtual ~UPnPPrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void deleteWidget();
+ virtual void updateData();
+
+ void shutdown(bt::WaitJob* job);
+ };
+
+}
+
+#endif
diff --git a/plugins/upnp/upnpprefwidget.cpp b/plugins/upnp/upnpprefwidget.cpp
new file mode 100644
index 0000000..43e2aec
--- /dev/null
+++ b/plugins/upnp/upnpprefwidget.cpp
@@ -0,0 +1,253 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <klistview.h>
+#include <kmessagebox.h>
+#include <kpushbutton.h>
+#include <torrent/udptrackersocket.h>
+#include <torrent/globals.h>
+#include <torrent/server.h>
+#include <kademlia/dhtbase.h>
+#include "upnpprefwidget.h"
+#include <util/log.h>
+#include <util/error.h>
+#include <util/waitjob.h>
+#include <util/httprequest.h>
+#include <torrent/globals.h>
+#include "upnppluginsettings.h"
+
+using namespace bt;
+
+namespace kt
+{
+ UPnPPrefWidget::UPnPPrefWidget(QWidget* parent, const char* name, WFlags fl)
+ : UPnPWidget(parent,name,fl)
+ {
+ def_router = 0;
+ connect(m_forward_btn,SIGNAL(clicked()),this,SLOT(onForwardBtnClicked()));
+ connect(m_undo_forward_btn,SIGNAL(clicked()),this,SLOT(onUndoForwardBtnClicked()));
+ connect(m_rescan,SIGNAL(clicked()),this,SLOT(onRescanClicked()));
+ bt::Globals::instance().getPortList().setListener(this);
+ }
+
+ UPnPPrefWidget::~UPnPPrefWidget()
+ {
+ bt::Globals::instance().getPortList().setListener(0);
+ }
+
+ void UPnPPrefWidget::shutdown(bt::WaitJob* job)
+ {
+ if (!def_router)
+ return;
+
+ net::PortList & pl = bt::Globals::instance().getPortList();
+ if (pl.count() == 0)
+ return;
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ def_router->undoForward(p,job);
+ }
+ }
+
+
+ void UPnPPrefWidget::addDevice(UPnPRouter* r)
+ {
+ connect(r,SIGNAL(updateGUI()),this,SLOT(updatePortMappings()));
+ KListViewItem* item = new KListViewItem(m_device_list,r->getDescription().friendlyName);
+ item->setMultiLinesEnabled(true);
+ itemmap[item] = r;
+ // if we have discovered the default device or there is none
+ // forward it's ports
+ QString def_dev = UPnPPluginSettings::defaultDevice();
+ if (def_dev == r->getServer() || def_dev.length() == 0)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Doing default port mappings ..." << endl;
+ UPnPPluginSettings::setDefaultDevice(r->getServer());
+ UPnPPluginSettings::writeConfig();
+
+ try
+ {
+ net::PortList & pl = bt::Globals::instance().getPortList();
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ r->forward(p);
+ }
+
+ def_router = r;
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,e.toString());
+ }
+ }
+ }
+
+ void UPnPPrefWidget::onForwardBtnClicked()
+ {
+ KListViewItem* item = (KListViewItem*)m_device_list->currentItem();;
+ if (!item)
+ return;
+
+ UPnPRouter* r = itemmap[item];
+ if (!r)
+ return;
+
+ try
+ {
+ net::PortList & pl = bt::Globals::instance().getPortList();
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ r->forward(p);
+ }
+
+ QString def_dev = UPnPPluginSettings::defaultDevice();
+ if (def_dev != r->getServer())
+ {
+ UPnPPluginSettings::setDefaultDevice(r->getServer());
+ UPnPPluginSettings::writeConfig();
+ def_router = r;
+ }
+
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,e.toString());
+ }
+ }
+
+ void UPnPPrefWidget::onRescanClicked()
+ {
+ // clear the list and emit the signal
+ rescan();
+ }
+
+ void UPnPPrefWidget::onUndoForwardBtnClicked()
+ {
+ KListViewItem* item = (KListViewItem*)m_device_list->currentItem();;
+ if (!item)
+ return;
+
+ UPnPRouter* r = itemmap[item];
+ if (!r)
+ return;
+
+ try
+ {
+ net::PortList & pl = bt::Globals::instance().getPortList();
+
+ for (net::PortList::iterator i = pl.begin(); i != pl.end();i++)
+ {
+ net::Port & p = *i;
+ if (p.forward)
+ r->undoForward(p,false);
+ }
+
+ QString def_dev = UPnPPluginSettings::defaultDevice();
+ if (def_dev == r->getServer())
+ {
+ UPnPPluginSettings::setDefaultDevice(QString::null);
+ UPnPPluginSettings::writeConfig();
+ def_router = 0;
+ }
+ }
+ catch (Error & e)
+ {
+ KMessageBox::error(this,e.toString());
+ }
+ }
+
+
+ void UPnPPrefWidget::updatePortMappings()
+ {
+ // update all port mappings
+ QMap<KListViewItem*,UPnPRouter*>::iterator i = itemmap.begin();
+ while (i != itemmap.end())
+ {
+ UPnPRouter* r = i.data();
+ KListViewItem* item = i.key();
+ QString msg,services;
+ QValueList<UPnPRouter::Forwarding>::iterator j = r->beginPortMappings();
+ while (j != r->endPortMappings())
+ {
+ UPnPRouter::Forwarding & f = *j;
+ if (!f.pending_req)
+ {
+ msg += QString::number(f.port.number) + " (";
+ QString prot = (f.port.proto == net::UDP ? "UDP" : "TCP");
+ msg += prot + ")";
+ if (f.service->servicetype.contains("WANPPPConnection"))
+ services += "PPP";
+ else
+ services += "IP";
+ }
+ j++;
+ if (j != r->endPortMappings())
+ {
+ msg += "\n";
+ services += "\n";
+ }
+ }
+ item->setText(1,msg);
+ item->setText(2,services);
+ i++;
+ }
+ }
+
+
+ void UPnPPrefWidget::portAdded(const net::Port & port)
+ {
+ try
+ {
+ if (def_router && port.forward)
+ def_router->forward(port);
+ }
+ catch (Error & e)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Error : " << e.toString() << endl;
+ }
+ }
+
+ void UPnPPrefWidget::portRemoved(const net::Port & port)
+ {
+ try
+ {
+ if (def_router && port.forward)
+ def_router->undoForward(port,false);
+ }
+ catch (Error & e)
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "Error : " << e.toString() << endl;
+ }
+ }
+}
+
+
+
+#include "upnpprefwidget.moc"
+
diff --git a/plugins/upnp/upnpprefwidget.h b/plugins/upnp/upnpprefwidget.h
new file mode 100644
index 0000000..16fa31b
--- /dev/null
+++ b/plugins/upnp/upnpprefwidget.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UPNPPREFWIDGET_H
+#define UPNPPREFWIDGET_H
+
+#include <qmap.h>
+#include "upnprouter.h"
+#include "upnpwidget.h"
+
+class KListViewItem;
+
+namespace bt
+{
+ class WaitJob;
+}
+
+namespace kt
+{
+
+ /**
+ * Widget for the UPnP pref dialog page.
+ */
+ class UPnPPrefWidget : public UPnPWidget,public net::PortListener
+ {
+ Q_OBJECT
+
+ public:
+ UPnPPrefWidget(QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ virtual ~UPnPPrefWidget();
+
+ void shutdown(bt::WaitJob* job);
+
+
+ public slots:
+ /**
+ * Add a device to the list.
+ * @param r The device
+ */
+ void addDevice(UPnPRouter* r);
+
+ signals:
+ /**
+ * Emitted when the user presses the rescan button.
+ */
+ void rescan();
+
+
+ protected slots:
+ void onForwardBtnClicked();
+ void onUndoForwardBtnClicked();
+ void onRescanClicked();
+ void updatePortMappings();
+
+ private:
+ virtual void portAdded(const net::Port & port);
+ virtual void portRemoved(const net::Port & port);
+
+ private:
+ QMap<KListViewItem*,UPnPRouter*> itemmap;
+ UPnPRouter* def_router;
+ };
+}
+
+#endif
+
diff --git a/plugins/upnp/upnprouter.cpp b/plugins/upnp/upnprouter.cpp
new file mode 100644
index 0000000..617abf5
--- /dev/null
+++ b/plugins/upnp/upnprouter.cpp
@@ -0,0 +1,459 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdlib.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <qstringlist.h>
+#include <kio/netaccess.h>
+#include <kio/job.h>
+#include <torrent/globals.h>
+#include <util/log.h>
+#include <util/array.h>
+#include <util/error.h>
+#include <util/functions.h>
+#include <util/fileops.h>
+#include <util/httprequest.h>
+#include <util/waitjob.h>
+#include "upnprouter.h"
+#include "upnpdescriptionparser.h"
+#include "soap.h"
+
+using namespace bt;
+using namespace net;
+
+namespace kt
+{
+ UPnPService::UPnPService()
+ {
+ }
+
+ UPnPService::UPnPService(const UPnPService & s)
+ {
+ this->servicetype = s.servicetype;
+ this->controlurl = s.controlurl;
+ this->eventsuburl = s.eventsuburl;
+ this->serviceid = s.serviceid;
+ this->scpdurl = s.scpdurl;
+ }
+
+ void UPnPService::setProperty(const QString & name,const QString & value)
+ {
+ if (name == "serviceType")
+ servicetype = value;
+ else if (name == "controlURL")
+ controlurl = value;
+ else if (name == "eventSubURL")
+ eventsuburl = value;
+ else if (name == "SCPDURL")
+ scpdurl = value;
+ else if (name == "serviceId")
+ serviceid = value;
+ }
+
+ void UPnPService::clear()
+ {
+ servicetype = controlurl = eventsuburl = scpdurl = serviceid = "";
+ }
+
+ void UPnPService::debugPrintData()
+ {
+ Out(SYS_PNP|LOG_DEBUG) << " servicetype = " << servicetype << endl;
+ Out(SYS_PNP|LOG_DEBUG) << " controlurl = " << controlurl << endl;
+ Out(SYS_PNP|LOG_DEBUG) << " eventsuburl = " << eventsuburl << endl;
+ Out(SYS_PNP|LOG_DEBUG) << " scpdurl = " << scpdurl << endl;
+ Out(SYS_PNP|LOG_DEBUG) << " serviceid = " << serviceid << endl;
+ }
+
+ UPnPService & UPnPService::operator = (const UPnPService & s)
+ {
+ this->servicetype = s.servicetype;
+ this->controlurl = s.controlurl;
+ this->eventsuburl = s.eventsuburl;
+ this->serviceid = s.serviceid;
+ this->scpdurl = s.scpdurl;
+ return *this;
+ }
+
+ ///////////////////////////////////////
+
+ void UPnPDeviceDescription::setProperty(const QString & name,const QString & value)
+ {
+ if (name == "friendlyName")
+ friendlyName = value;
+ else if (name == "manufacturer")
+ manufacturer = value;
+ else if (name == "modelDescription")
+ modelDescription = value;
+ else if (name == "modelName")
+ modelName = value;
+ else if (name == "modelNumber")
+ modelNumber == value;
+ }
+
+ ///////////////////////////////////////
+
+ UPnPRouter::UPnPRouter(const QString & server,const KURL & location,bool verbose) : server(server),location(location),verbose(verbose)
+ {
+ // make the tmp_file unique, current time * a random number should be enough
+ tmp_file = QString("/tmp/ktorrent_upnp_description-%1.xml").arg(bt::GetCurrentTime() * rand());
+ }
+
+
+ UPnPRouter::~UPnPRouter()
+ {
+ QValueList<HTTPRequest*>::iterator i = active_reqs.begin();
+ while (i != active_reqs.end())
+ {
+ (*i)->deleteLater();
+ i++;
+ }
+ }
+
+ void UPnPRouter::addService(const UPnPService & s)
+ {
+ QValueList<UPnPService>::iterator i = services.begin();
+ while (i != services.end())
+ {
+ UPnPService & os = *i;
+ if (s.servicetype == os.servicetype)
+ return;
+ i++;
+ }
+ services.append(s);
+ }
+
+ void UPnPRouter::downloadFinished(KIO::Job* j)
+ {
+ if (j->error())
+ {
+ Out(SYS_PNP|LOG_IMPORTANT) << "Failed to download " << location << " : " << j->errorString() << endl;
+ return;
+ }
+
+ QString target = tmp_file;
+ // load in the file (target is always local)
+ UPnPDescriptionParser desc_parse;
+ bool ret = desc_parse.parse(target,this);
+ if (!ret)
+ {
+ Out(SYS_PNP|LOG_IMPORTANT) << "Error parsing router description !" << endl;
+ QString dest = KGlobal::dirs()->saveLocation("data","ktorrent") + "upnp_failure";
+ KIO::file_copy(target,dest,-1,true,false,false);
+ }
+ else
+ {
+ if (verbose)
+ debugPrintData();
+ }
+ xmlFileDownloaded(this,ret);
+ bt::Delete(target);
+ }
+
+ void UPnPRouter::downloadXMLFile()
+ {
+ // downlaod XML description into a temporary file in /tmp
+ KIO::Job* job = KIO::file_copy(location,tmp_file,-1,true,false,false);
+ connect(job,SIGNAL(result(KIO::Job *)),this,SLOT(downloadFinished( KIO::Job* )));
+ }
+
+ void UPnPRouter::debugPrintData()
+ {
+ Out(SYS_PNP|LOG_DEBUG) << "UPnPRouter : " << endl;
+ Out(SYS_PNP|LOG_DEBUG) << "Friendly name = " << desc.friendlyName << endl;
+ Out(SYS_PNP|LOG_DEBUG) << "Manufacterer = " << desc.manufacturer << endl;
+ Out(SYS_PNP|LOG_DEBUG) << "Model description = " << desc.modelDescription << endl;
+ Out(SYS_PNP|LOG_DEBUG) << "Model name = " << desc.modelName << endl;
+ Out(SYS_PNP|LOG_DEBUG) << "Model number = " << desc.modelNumber << endl;
+ for (QValueList<UPnPService>::iterator i = services.begin();i != services.end();i++)
+ {
+ UPnPService & s = *i;
+ Out() << "Service : " << endl;
+ s.debugPrintData();
+ Out(SYS_PNP|LOG_DEBUG) << "Done" << endl;
+ }
+ Out(SYS_PNP|LOG_DEBUG) << "Done" << endl;
+ }
+
+
+ void UPnPRouter::forward(UPnPService* srv,const net::Port & port)
+ {
+ // add all the arguments for the command
+ QValueList<SOAP::Arg> args;
+ SOAP::Arg a;
+ a.element = "NewRemoteHost";
+ args.append(a);
+
+ // the external port
+ a.element = "NewExternalPort";
+ a.value = QString::number(port.number);
+ args.append(a);
+
+ // the protocol
+ a.element = "NewProtocol";
+ a.value = port.proto == TCP ? "TCP" : "UDP";
+ args.append(a);
+
+ // the local port
+ a.element = "NewInternalPort";
+ a.value = QString::number(port.number);
+ args.append(a);
+
+ // the local IP address
+ a.element = "NewInternalClient";
+ a.value = "$LOCAL_IP";// will be replaced by our local ip in bt::HTTPRequest
+ args.append(a);
+
+ a.element = "NewEnabled";
+ a.value = "1";
+ args.append(a);
+
+ a.element = "NewPortMappingDescription";
+ static Uint32 cnt = 0;
+ a.value = QString("KTorrent UPNP %1").arg(cnt++); // TODO: change this
+ args.append(a);
+
+ a.element = "NewLeaseDuration";
+ a.value = "0";
+ args.append(a);
+
+ QString action = "AddPortMapping";
+ QString comm = SOAP::createCommand(action,srv->servicetype,args);
+
+ Forwarding fw = {port,0,srv};
+ // erase old forwarding if one exists
+ QValueList<Forwarding>::iterator itr = fwds.begin();
+ while (itr != fwds.end())
+ {
+ Forwarding & fwo = *itr;
+ if (fwo.port == port && fwo.service == srv)
+ itr = fwds.erase(itr);
+ else
+ itr++;
+ }
+
+ fw.pending_req = sendSoapQuery(comm,srv->servicetype + "#" + action,srv->controlurl);
+ fwds.append(fw);
+ }
+
+ void UPnPRouter::forward(const net::Port & port)
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Forwarding port " << port.number << " (" << (port.proto == UDP ? "UDP" : "TCP") << ")" << endl;
+ // first find the right service
+ QValueList<UPnPService>::iterator i = services.begin();
+ while (i != services.end())
+ {
+ UPnPService & s = *i;
+ if (s.servicetype == "urn:schemas-upnp-org:service:WANIPConnection:1" ||
+ s.servicetype == "urn:schemas-upnp-org:service:WANPPPConnection:1")
+ {
+ forward(&s,port);
+ }
+ i++;
+ }
+
+ }
+
+ void UPnPRouter::undoForward(UPnPService* srv,const net::Port & port,bt::WaitJob* waitjob)
+ {
+ // add all the arguments for the command
+ QValueList<SOAP::Arg> args;
+ SOAP::Arg a;
+ a.element = "NewRemoteHost";
+ args.append(a);
+
+ // the external port
+ a.element = "NewExternalPort";
+ a.value = QString::number(port.number);
+ args.append(a);
+
+ // the protocol
+ a.element = "NewProtocol";
+ a.value = port.proto == TCP ? "TCP" : "UDP";
+ args.append(a);
+
+
+ QString action = "DeletePortMapping";
+ QString comm = SOAP::createCommand(action,srv->servicetype,args);
+ bt::HTTPRequest* r = sendSoapQuery(comm,srv->servicetype + "#" + action,srv->controlurl,waitjob != 0);
+
+ if (waitjob)
+ waitjob->addExitOperation(r);
+
+ updateGUI();
+ }
+
+
+ void UPnPRouter::undoForward(const net::Port & port,bt::WaitJob* waitjob)
+ {
+ Out(SYS_PNP|LOG_NOTICE) << "Undoing forward of port " << port.number
+ << " (" << (port.proto == UDP ? "UDP" : "TCP") << ")" << endl;
+
+ QValueList<Forwarding>::iterator itr = fwds.begin();
+ while (itr != fwds.end())
+ {
+ Forwarding & wd = *itr;
+ if (wd.port == port)
+ {
+ undoForward(wd.service,wd.port,waitjob);
+ itr = fwds.erase(itr);
+ }
+ else
+ {
+ itr++;
+ }
+ }
+ }
+
+ bt::HTTPRequest* UPnPRouter::sendSoapQuery(const QString & query,const QString & soapact,const QString & controlurl,bool at_exit)
+ {
+ // if port is not set, 0 will be returned
+ // thanks to Diego R. Brogna for spotting this bug
+ if (location.port()==0)
+ location.setPort(80);
+
+ QString http_hdr = QString(
+ "POST %1 HTTP/1.1\r\n"
+ "HOST: %2:%3\r\n"
+ "Content-length: $CONTENT_LENGTH\r\n"
+ "Content-Type: text/xml\r\n"
+ "SOAPAction: \"%4\"\r\n"
+ "\r\n").arg(controlurl).arg(location.host()).arg(location.port()).arg(soapact);
+
+
+ HTTPRequest* r = new HTTPRequest(http_hdr,query,location.host(),location.port(),verbose);
+ connect(r,SIGNAL(replyError(bt::HTTPRequest* ,const QString& )),
+ this,SLOT(onReplyError(bt::HTTPRequest* ,const QString& )));
+ connect(r,SIGNAL(replyOK(bt::HTTPRequest* ,const QString& )),
+ this,SLOT(onReplyOK(bt::HTTPRequest* ,const QString& )));
+ connect(r,SIGNAL(error(bt::HTTPRequest*, bool )),
+ this,SLOT(onError(bt::HTTPRequest*, bool )));
+ r->start();
+ if (!at_exit)
+ active_reqs.append(r);
+ return r;
+ }
+
+ void UPnPRouter::httpRequestDone(bt::HTTPRequest* r,bool erase_fwd)
+ {
+ QValueList<Forwarding>::iterator i = fwds.begin();
+ while (i != fwds.end())
+ {
+ Forwarding & fw = *i;
+ if (fw.pending_req == r)
+ {
+ fw.pending_req = 0;
+ if (erase_fwd)
+ fwds.erase(i);
+ break;
+ }
+ i++;
+ }
+
+ updateGUI();
+ active_reqs.remove(r);
+ r->deleteLater();
+ }
+
+ void UPnPRouter::onReplyOK(bt::HTTPRequest* r,const QString &)
+ {
+ if (verbose)
+ Out(SYS_PNP|LOG_NOTICE) << "UPnPRouter : OK" << endl;
+
+ httpRequestDone(r,false);
+ }
+
+ void UPnPRouter::onReplyError(bt::HTTPRequest* r,const QString &)
+ {
+ if (verbose)
+ Out(SYS_PNP|LOG_IMPORTANT) << "UPnPRouter : Error" << endl;
+
+ httpRequestDone(r,true);
+
+ }
+
+ void UPnPRouter::onError(bt::HTTPRequest* r,bool)
+ {
+ httpRequestDone(r,true);
+ }
+
+#if 0
+ QValueList<UPnPService>::iterator UPnPRouter::findPortForwardingService()
+ {
+ QValueList<UPnPService>::iterator i = services.begin();
+ while (i != services.end())
+ {
+ UPnPService & s = *i;
+ if (s.servicetype == "urn:schemas-upnp-org:service:WANIPConnection:1" ||
+ s.servicetype == "urn:schemas-upnp-org:service:WANPPPConnection:1")
+ return i;
+ i++;
+ }
+ return services.end();
+ }
+
+
+ void UPnPRouter::getExternalIP()
+ {
+ // first find the right service
+ QValueList<UPnPService>::iterator i = findPortForwardingService();
+ if (i == services.end())
+ throw Error(i18n("Cannot find port forwarding service in the device's description!"));
+
+ UPnPService & s = *i;
+ QString action = "GetExternalIPAddress";
+ QString comm = SOAP::createCommand(action,s.servicetype);
+ sendSoapQuery(comm,s.servicetype + "#" + action,s.controlurl);
+ }
+
+ void UPnPRouter::isPortForwarded(const net::Port & port)
+ {
+ // first find the right service
+ QValueList<UPnPService>::iterator i = findPortForwardingService();
+ if (i == services.end())
+ throw Error(i18n("Cannot find port forwarding service in the device's description!"));
+
+ // add all the arguments for the command
+ QValueList<SOAP::Arg> args;
+ SOAP::Arg a;
+ a.element = "NewRemoteHost";
+ args.append(a);
+
+ // the external port
+ a.element = "NewExternalPort";
+ a.value = QString::number(port.number);
+ args.append(a);
+
+ // the protocol
+ a.element = "NewProtocol";
+ a.value = port.proto == TCP ? "TCP" : "UDP";
+ args.append(a);
+
+ UPnPService & s = *i;
+ QString action = "GetSpecificPortMappingEntry";
+ QString comm = SOAP::createCommand(action,s.servicetype,args);
+ sendSoapQuery(comm,s.servicetype + "#" + action,s.controlurl);
+ }
+#endif
+
+
+}
+
+#include "upnprouter.moc"
diff --git a/plugins/upnp/upnprouter.h b/plugins/upnp/upnprouter.h
new file mode 100644
index 0000000..a4d32b4
--- /dev/null
+++ b/plugins/upnp/upnprouter.h
@@ -0,0 +1,223 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTUPNPROUTER_H
+#define KTUPNPROUTER_H
+
+#include <kurl.h>
+#include <qstringlist.h>
+#include <kstreamsocket.h>
+#include <net/portlist.h>
+
+using bt::Uint16;
+
+namespace bt
+{
+ class HTTPRequest;
+ class WaitJob;
+}
+
+namespace KIO
+{
+ class Job;
+}
+
+namespace kt
+{
+ /**
+ * Structure describing a UPnP service found in an xml file.
+ */
+ struct UPnPService
+ {
+ QString serviceid;
+ QString servicetype;
+ QString controlurl;
+ QString eventsuburl;
+ QString scpdurl;
+
+ UPnPService();
+ UPnPService(const UPnPService & s);
+
+ /**
+ * Set a property of the service.
+ * @param name Name of the property (matches to variable names)
+ * @param value Value of the property
+ */
+ void setProperty(const QString & name,const QString & value);
+
+ /**
+ * Set all strings to empty.
+ */
+ void clear();
+
+ /// Print the data of this service
+ void debugPrintData();
+
+ /**
+ * Assignment operator
+ * @param s The service to copy
+ * @return *this
+ */
+ UPnPService & operator = (const UPnPService & s);
+ };
+
+ /**
+ * Struct to hold the description of a device
+ */
+ struct UPnPDeviceDescription
+ {
+ QString friendlyName;
+ QString manufacturer;
+ QString modelDescription;
+ QString modelName;
+ QString modelNumber;
+
+ /**
+ * Set a property of the description
+ * @param name Name of the property (matches to variable names)
+ * @param value Value of the property
+ */
+ void setProperty(const QString & name,const QString & value);
+ };
+
+ /**
+ * @author Joris Guisson
+ *
+ * Class representing a UPnP enabled router. This class is also used to communicate
+ * with the router.
+ */
+ class UPnPRouter : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ struct Forwarding
+ {
+ net::Port port;
+ bt::HTTPRequest* pending_req;
+ UPnPService* service;
+ };
+ private:
+ QString server;
+ QString tmp_file;
+ KURL location;
+ UPnPDeviceDescription desc;
+ QValueList<UPnPService> services;
+ QValueList<Forwarding> fwds;
+ QValueList<bt::HTTPRequest*> active_reqs;
+ public:
+ /**
+ * Construct a router.
+ * @param server The name of the router
+ * @param location The location of it's xml description file
+ * @param verbose Print lots of debug info
+ */
+ UPnPRouter(const QString & server,const KURL & location,bool verbose = false);
+ virtual ~UPnPRouter();
+
+ /// Get the name of the server
+ QString getServer() const {return server;}
+
+ /// Get the location of it's xml description
+ KURL getLocation() const {return location;}
+
+ /// Get the device description
+ UPnPDeviceDescription & getDescription() {return desc;}
+
+ /// Get the device description (const version)
+ const UPnPDeviceDescription & getDescription() const {return desc;}
+
+ /**
+ * Download the XML File of the router.
+ */
+ void downloadXMLFile();
+
+ /**
+ * Add a service to the router.
+ * @param s The service
+ */
+ void addService(const UPnPService & s);
+
+#if 0
+ /**
+ * See if a port is forwarded
+ * @param port The Port
+ */
+ void isPortForwarded(const net::Port & port);
+
+ /**
+ * Get the external IP address.
+ */
+ void getExternalIP();
+#endif
+
+ /**
+ * Forward a local port
+ * @param port The local port to forward
+ */
+ void forward(const net::Port & port);
+
+ /**
+ * Undo forwarding
+ * @param port The port
+ * @param waitjob When this is set the jobs needs to be added to the waitjob,
+ * so we can wait for their completeion at exit
+ */
+ void undoForward(const net::Port & port,bt::WaitJob* waitjob = 0);
+
+ void debugPrintData();
+
+ QValueList<Forwarding>::iterator beginPortMappings() {return fwds.begin();}
+ QValueList<Forwarding>::iterator endPortMappings() {return fwds.end();}
+
+ private slots:
+ void onReplyOK(bt::HTTPRequest* r,const QString &);
+ void onReplyError(bt::HTTPRequest* r,const QString &);
+ void onError(bt::HTTPRequest* r,bool);
+ void downloadFinished(KIO::Job* j);
+
+
+
+ signals:
+ /**
+ * Tell the GUI that it needs to be updated.
+ */
+ void updateGUI();
+
+ /**
+ * Signal which indicates that the XML was downloaded successfully or not.
+ * @param r The router which emitted the signal
+ * @param success Wether or not it succeeded
+ */
+ void xmlFileDownloaded(UPnPRouter* r,bool success);
+
+ private:
+ QValueList<UPnPService>::iterator findPortForwardingService();
+
+ bt::HTTPRequest* sendSoapQuery(const QString & query,const QString & soapact,const QString & controlurl,bool at_exit = false);
+ bool verbose;
+
+ void forward(UPnPService* srv,const net::Port & port);
+ void undoForward(UPnPService* srv,const net::Port & port,bt::WaitJob* waitjob);
+ void httpRequestDone(bt::HTTPRequest* r,bool erase_fwd);
+ };
+
+}
+
+#endif
diff --git a/plugins/upnp/upnpwidget.ui b/plugins/upnp/upnpwidget.ui
new file mode 100644
index 0000000..a8f0f7a
--- /dev/null
+++ b/plugins/upnp/upnpwidget.ui
@@ -0,0 +1,139 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>UPnPWidget</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>UPnPWidget</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>600</width>
+ <height>561</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>UPnP</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Detected devices:</string>
+ </property>
+ </widget>
+ <widget class="KListView">
+ <column>
+ <property name="text">
+ <string>Device</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Ports Forwarded</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>WAN Connection</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>m_device_list</cstring>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_forward_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Forw&amp;ard Ports</string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>m_undo_forward_btn</cstring>
+ </property>
+ <property name="text">
+ <string>Undo Port Forwarding</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>70</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>m_rescan</cstring>
+ </property>
+ <property name="text">
+ <string>Rescan</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+</widget>
+<customwidgets>
+</customwidgets>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>klistview.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/webinterface/Makefile.am b/plugins/webinterface/Makefile.am
new file mode 100644
index 0000000..17a80d9
--- /dev/null
+++ b/plugins/webinterface/Makefile.am
@@ -0,0 +1,34 @@
+INCLUDES = -I$(top_builddir)/libktorrent -I$(top_builddir)/ktorrent/libktorrent \
+ -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+kde_module_LTLIBRARIES = ktwebinterfaceplugin.la
+noinst_HEADERS = webinterfaceplugin.h httpserver.h php_handler.h \
+ php_interface.h webinterfaceprefwidget.h webinterfaceprefpage.h httpclienthandler.h \
+ httpresponseheader.h
+ktwebinterfaceplugin_la_SOURCES = webinterfaceplugin.cpp httpserver.cpp \
+ php_handler.cpp php_interface.cpp webinterfacepref.ui \
+ webinterfacepluginsettings.kcfgc webinterfaceprefwidget.cpp webinterfaceprefpage.cpp \
+ httpclienthandler.cpp httpresponseheader.cpp
+# Libs needed by the plugin
+ktwebinterfaceplugin_la_LIBADD = ../../libktorrent/libktorrent.la \
+ $(LIB_KHTML) $(LIB_KPARTS) $(LIB_QT) \
+ $(LIB_KDECORE) $(LIB_KDEUI) $(LIB_KFILE)
+
+# LD flags for the plugin
+# -module says: this is a module, i.e. something you're going to dlopen
+# so e.g. it has no version number like a normal shared lib would have.
+ktwebinterfaceplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries)
+
+# rc file containing the GUI for the plugin
+# pluginsdir = $(kde_datadir)/ktsearchplugin
+# plugins_DATA = ktsearchpluginui.rc
+
+# Install the desktop file needed to detect the plugin
+kde_services_DATA = ktwebinterfaceplugin.desktop
+
+kde_kcfg_DATA = ktwebinterfaceplugin.kcfg
+
+ktdatadir = $(kde_datadir)/ktorrent/www
+
+SUBDIRS = www
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/plugins/webinterface/httpclienthandler.cpp b/plugins/webinterface/httpclienthandler.cpp
new file mode 100644
index 0000000..d925466
--- /dev/null
+++ b/plugins/webinterface/httpclienthandler.cpp
@@ -0,0 +1,237 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qsocket.h>
+#include <qhttp.h>
+#include <util/log.h>
+#include <util/mmapfile.h>
+#include "httpserver.h"
+#include "httpclienthandler.h"
+#include "httpresponseheader.h"
+#include "php_handler.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ HttpClientHandler::HttpClientHandler(HttpServer* srv,QSocket* sock) : srv(srv),client(sock),php_response_hdr(200)
+ {
+ state = WAITING_FOR_REQUEST;
+ bytes_read = 0;
+ php = 0;
+ }
+
+
+ HttpClientHandler::~HttpClientHandler()
+ {
+ delete client;
+ delete php;
+ }
+
+ void HttpClientHandler::readyToRead()
+ {
+ if (state == WAITING_FOR_REQUEST)
+ {
+ while (client->canReadLine())
+ {
+ QString line = client->readLine();
+ header_data += line;
+ if (header_data.endsWith("\r\n\r\n"))
+ {
+ // We have got the header, so lets parse it
+ handleRequest();
+ break;
+ }
+ }
+ }
+ else if (state == WAITING_FOR_CONTENT)
+ {
+ Uint32 ba = client->bytesAvailable();
+ if (ba + bytes_read < header.contentLength())
+ {
+ client->readBlock((char*)request_data.data() + bytes_read,ba);
+ bytes_read += ba;
+ }
+ else
+ {
+ Uint32 left = header.contentLength() - bytes_read;
+ client->readBlock((char*)request_data.data() + bytes_read,left);
+ bytes_read += left;
+ srv->handlePost(this,header,request_data);
+
+ header_data = "";
+ request_data.resize(0);
+ state = WAITING_FOR_REQUEST;
+ if (client->bytesAvailable() > 0)
+ readyToRead();
+ }
+ }
+ }
+
+ void HttpClientHandler::handleRequest()
+ {
+ header = QHttpRequestHeader(header_data);
+ // Out(SYS_WEB|LOG_DEBUG) << "Parsing request : " << header.toString() << endl;
+ if (header.method() == "POST")
+ {
+ if (header.hasContentLength())
+ {
+ request_data.resize(header.contentLength());
+ state = WAITING_FOR_CONTENT;
+ bytes_read = 0;
+ if (client->bytesAvailable() > 0)
+ readyToRead();
+ }
+ }
+ else if (header.method() == "GET")
+ {
+ srv->handleGet(this,header);
+ header_data = "";
+ request_data.resize(0);
+ }
+ else
+ {
+ srv->handleUnsupportedMethod(this);
+ }
+ }
+
+ bool HttpClientHandler::sendFile(HttpResponseHeader & hdr,const QString & full_path)
+ {
+ // Out(SYS_WEB|LOG_DEBUG) << "Sending file " << full_path << endl;
+ // first look in cache
+ MMapFile* c = srv->cacheLookup(full_path);
+
+ if (!c)
+ {
+ // not in cache so load it
+ c = new MMapFile();
+ if (!c->open(full_path,MMapFile::READ))
+ {
+ delete c;
+ Out(SYS_WEB|LOG_DEBUG) << "Failed to open file " << full_path << endl;
+ return false;
+ }
+ srv->insertIntoCache(full_path,c);
+ }
+
+ hdr.setValue("Content-Length",QString::number(c->getSize()));
+
+ // Out(SYS_WEB|LOG_DEBUG) << "HTTP header : " << endl;
+ // Out(SYS_WEB|LOG_DEBUG) << hdr.toString() << endl;
+
+ QCString d = hdr.toString().utf8();
+ client->writeBlock(d.data(),d.length());
+
+ Uint32 written = 0;
+ Uint32 total = c->getSize();
+ const char* data = (const char*)c->getDataPointer();
+ while (written < total)
+ {
+ Uint32 w = client->writeBlock(data + written,total - written);
+ written += w;
+ }
+ client->flush();
+ // Out(SYS_WEB|LOG_DEBUG) << "Finished sending " << full_path << " (" << written << " bytes)" << endl;
+ return true;
+ }
+
+#define HTTP_404_ERROR "<html><head><title>404 Not Found</title></head><body>The requested file was not found !</body></html>"
+#define HTTP_500_ERROR "<html><head><title>HTTP/1.1 500 Internal Server Error</title></head><body>HTTP/1.1 Internal Server Error<br>%1</body></html>"
+
+
+ void HttpClientHandler::send404(HttpResponseHeader & hdr,const QString & path)
+ {
+ // Out(SYS_WEB|LOG_DEBUG) << "Sending 404 " << path << endl;
+ QString data = HTTP_404_ERROR;
+ hdr.setValue("Content-Length",QString::number(data.length()));
+
+ QTextStream os(client);
+ os.setEncoding( QTextStream::UnicodeUTF8 );
+ os << hdr.toString();
+ os << data;
+ }
+
+ void HttpClientHandler::send500(HttpResponseHeader & hdr)
+ {
+ // Out(SYS_WEB|LOG_DEBUG) << "Sending 500 " << endl;
+ QString data = QString(HTTP_500_ERROR).arg("An internal server error occured !");
+ hdr.setValue("Content-Length",QString::number(data.length()));
+
+ QTextStream os(client);
+ os.setEncoding( QTextStream::UnicodeUTF8 );
+ os << hdr.toString();
+ os << data;
+ }
+
+ void HttpClientHandler::sendResponse(const HttpResponseHeader & hdr)
+ {
+ // Out(SYS_WEB|LOG_DEBUG) << "Sending response " << hdr.toString() << endl;
+ QTextStream os(client);
+ os.setEncoding( QTextStream::UnicodeUTF8 );
+ os << hdr.toString();
+ }
+
+ void HttpClientHandler::executePHPScript(
+ PhpInterface* php_iface,
+ HttpResponseHeader & hdr,
+ const QString & php_exe,
+ const QString & php_file,
+ const QMap<QString,QString> & args)
+ {
+ // Out(SYS_WEB|LOG_DEBUG) << "Launching PHP script " << php_file << endl;
+ php = new PhpHandler(php_exe,php_iface);
+ if (!php->executeScript(php_file,args))
+ {
+ QString data = QString(HTTP_500_ERROR).arg("Failed to launch PHP executable !");
+ hdr.setResponseCode(500);
+ hdr.setValue("Content-Length",QString::number(data.utf8().length()));
+
+ QTextStream os(client);
+ os.setEncoding( QTextStream::UnicodeUTF8 );
+ os << hdr.toString();
+ os << data;
+ state = WAITING_FOR_REQUEST;
+ }
+ else
+ {
+ php_response_hdr = hdr;
+ connect(php,SIGNAL(finished()),this,SLOT(onPHPFinished()));
+ state = PROCESSING_PHP;
+ }
+ }
+
+ void HttpClientHandler::onPHPFinished()
+ {
+ const QByteArray & output = php->getOutput();
+ php_response_hdr.setValue("Content-Length",QString::number(output.size()));
+
+ QTextStream os(client);
+ os.setEncoding( QTextStream::UnicodeUTF8 );
+ os << php_response_hdr.toString();
+ os.writeRawBytes(output.data(),output.size());
+
+ php->deleteLater();
+ php = 0;
+ state = WAITING_FOR_REQUEST;
+ }
+}
+
+#include "httpclienthandler.moc"
+
diff --git a/plugins/webinterface/httpclienthandler.h b/plugins/webinterface/httpclienthandler.h
new file mode 100644
index 0000000..cacf463
--- /dev/null
+++ b/plugins/webinterface/httpclienthandler.h
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTHTTPCLIENTHANDLER_H
+#define KTHTTPCLIENTHANDLER_H
+
+
+#include <qhttp.h>
+#include <qobject.h>
+#include <util/constants.h>
+#include "httpresponseheader.h"
+
+class QSocket;
+
+
+namespace kt
+{
+ class HttpServer;
+ class PhpHandler;
+ class PhpInterface;
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class HttpClientHandler : public QObject
+ {
+ Q_OBJECT
+ enum State
+ {
+ WAITING_FOR_REQUEST,
+ WAITING_FOR_CONTENT,
+ PROCESSING_PHP
+ };
+ public:
+ HttpClientHandler(HttpServer* srv,QSocket* sock);
+ virtual ~HttpClientHandler();
+
+ void readyToRead();
+ bool sendFile(HttpResponseHeader & hdr,const QString & full_path);
+ void sendResponse(const HttpResponseHeader & hdr);
+ void send404(HttpResponseHeader & hdr,const QString & path);
+ void send500(HttpResponseHeader & hdr);
+
+ void executePHPScript(PhpInterface* php_iface,
+ HttpResponseHeader & hdr,
+ const QString & php_exe,
+ const QString & php_file,
+ const QMap<QString,QString> & args);
+
+ private:
+ void handleRequest();
+
+ private slots:
+ void onPHPFinished();
+
+ private:
+ HttpServer* srv;
+ QSocket* client;
+ State state;
+ QHttpRequestHeader header;
+ QString header_data;
+ QByteArray request_data;
+ bt::Uint32 bytes_read;
+ PhpHandler* php;
+ HttpResponseHeader php_response_hdr;
+ };
+
+}
+
+#endif
diff --git a/plugins/webinterface/httpresponseheader.cpp b/plugins/webinterface/httpresponseheader.cpp
new file mode 100644
index 0000000..da7556f
--- /dev/null
+++ b/plugins/webinterface/httpresponseheader.cpp
@@ -0,0 +1,78 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "httpresponseheader.h"
+
+namespace kt
+{
+ static QString ResponseCodeToString(int r)
+ {
+ switch (r)
+ {
+ case 200: return "OK";
+ case 301: return "Moved Permanently";
+ case 304: return "Not Modified";
+ case 404: return "Not Found";
+ }
+ return QString::null;
+ }
+
+ HttpResponseHeader::HttpResponseHeader(int response_code)
+ : response_code(response_code)
+ {
+ }
+
+ HttpResponseHeader::HttpResponseHeader(const HttpResponseHeader & hdr)
+ {
+ response_code = hdr.response_code;
+ fields = hdr.fields;
+ }
+
+ HttpResponseHeader::~HttpResponseHeader()
+ {
+ }
+
+ void HttpResponseHeader::setResponseCode(int rc)
+ {
+ response_code = rc;
+ }
+
+ void HttpResponseHeader::setValue(const QString & key,const QString & value)
+ {
+ fields[key] = value;
+ }
+
+ QString HttpResponseHeader::toString() const
+ {
+ QString str;
+ str += QString("HTTP/1.1 %1 %2\r\n").arg(response_code).arg(ResponseCodeToString(response_code));
+
+ QMap<QString,QString>::const_iterator itr = fields.begin();
+ while (itr != fields.end())
+ {
+ str += QString("%1: %2\r\n").arg(itr.key()).arg(itr.data());
+ itr++;
+ }
+ str += "\r\n";
+ return str;
+ }
+
+
+
+}
diff --git a/plugins/webinterface/httpresponseheader.h b/plugins/webinterface/httpresponseheader.h
new file mode 100644
index 0000000..9672191
--- /dev/null
+++ b/plugins/webinterface/httpresponseheader.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTHTTPRESPONSEHEADER_H
+#define KTHTTPRESPONSEHEADER_H
+
+
+#include <qmap.h>
+#include <qstring.h>
+
+namespace kt
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class HttpResponseHeader
+ {
+ int response_code;
+ QMap<QString,QString> fields;
+ public:
+ HttpResponseHeader(int response_code);
+ HttpResponseHeader(const HttpResponseHeader & hdr);
+ virtual ~HttpResponseHeader();
+
+ void setResponseCode(int response_code);
+ void setValue(const QString & key,const QString & value);
+
+ QString toString() const;
+ };
+
+
+}
+
+#endif
diff --git a/plugins/webinterface/httpserver.cpp b/plugins/webinterface/httpserver.cpp
new file mode 100644
index 0000000..e2c0eeb
--- /dev/null
+++ b/plugins/webinterface/httpserver.cpp
@@ -0,0 +1,553 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 <qtimer.h>
+#include <qcstring.h>
+#include <qdatetime.h>
+#include <kapplication.h>
+#include <kgenericfactory.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <kmdcodec.h>
+#include <ktempfile.h>
+
+#include <qfileinfo.h>
+#include <qsocket.h>
+#include <qstringlist.h>
+
+#include <interfaces/coreinterface.h>
+#include <interfaces/torrentinterface.h>
+
+#include <util/log.h>
+#include <util/fileops.h>
+#include <util/functions.h>
+#include <util/mmapfile.h>
+#include "ktversion.h"
+#include "httpserver.h"
+#include "httpclienthandler.h"
+#include "httpresponseheader.h"
+#include "php_handler.h"
+#include "php_interface.h"
+#include "webinterfacepluginsettings.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+
+
+ HttpServer::HttpServer(CoreInterface *core, int port) : QServerSocket(port, 5),core(core),cache(10,23)
+ {
+ php_i = new PhpInterface(core);
+ clients.setAutoDelete(true);
+
+ QStringList dirList = KGlobal::instance()->dirs()->findDirs("data", "ktorrent/www");
+ rootDir = *(dirList.begin());
+ Out(SYS_WEB|LOG_DEBUG) << "WWW Root Directory "<< rootDir <<endl;
+ session.logged_in = false;
+ cache.setAutoDelete(true);
+ }
+
+ HttpServer::~HttpServer()
+ {
+ delete php_i;
+ }
+
+ void HttpServer::newConnection(int s)
+ {
+ QSocket* socket = new QSocket(this);
+ socket->setSocket(s);
+
+ connect(socket, SIGNAL(readyRead()), this, SLOT(slotSocketReadyToRead()));
+ connect(socket, SIGNAL(delayedCloseFinished()), this, SLOT(slotConnectionClosed()));
+ connect(socket, SIGNAL(connectionClosed()), this, SLOT(slotConnectionClosed()));
+
+ HttpClientHandler* handler = new HttpClientHandler(this,socket);
+ clients.insert(socket,handler);
+ Out(SYS_WEB|LOG_NOTICE) << "connection from "<< socket->peerAddress().toString() << endl;
+ }
+
+
+ void HttpServer::slotSocketReadyToRead()
+ {
+ QSocket* client = (QSocket*)sender();
+ HttpClientHandler* handler = clients.find(client);
+ if (!handler)
+ {
+ client->deleteLater();
+ return;
+ }
+
+ handler->readyToRead();
+ }
+
+ static int DecodeEscapedChar(QString & password,int idx)
+ {
+ QChar a = password[idx + 1].lower();
+ QChar b = password[idx + 2].lower();
+ if (!a.isNumber() && !(a.latin1() >= 'a' && a.latin1() <= 'f'))
+ return idx + 2; // not a valid hex digit
+
+ if (!b.isNumber() && !(b.latin1() >= 'a' && b.latin1() <= 'f'))
+ return idx + 2; // not a valid hex digit
+
+ // calculate high and low nibble
+ Uint8 h = (a.latin1() - (a.isNumber() ? '0' : 'a')) << 4;
+ Uint8 l = (b.latin1() - (b.isNumber() ? '0' : 'a'));
+ char r = (char) h | l; // combine them and cast to a char
+ password.replace(idx,3,r);
+ return idx + 1;
+ }
+
+ bool HttpServer::checkLogin(const QHttpRequestHeader & hdr,const QByteArray & data)
+ {
+ if (hdr.contentType() != "application/x-www-form-urlencoded")
+ return false;
+
+ QString username;
+ QString password;
+ QStringList params = QStringList::split("&",QString(data));
+ for (QStringList::iterator i = params.begin();i != params.end();i++)
+ {
+ QString t = *i;
+ if (t.section("=",0,0) == "username")
+ username = t.section("=",1,1);
+ else if (t.section("=",0,0) == "password")
+ password = t.section("=",1,1);
+
+ // check for passwords with url encoded stuff in them and decode them if necessary
+ int idx = 0;
+ while ((idx = password.find('%',idx)) > 0)
+ {
+ if (idx + 2 < password.length())
+ {
+ idx = DecodeEscapedChar(password,idx);
+ }
+ else
+ break;
+ }
+ }
+
+ if (!username.isNull() && !password.isNull())
+ {
+ KMD5 context(password.utf8());
+
+ if(username == WebInterfacePluginSettings::username() &&
+ context.hexDigest().data() == WebInterfacePluginSettings::password())
+ {
+ session.logged_in = true;
+ session.sessionId=rand();
+ session.last_access=QTime::currentTime();
+ Out(SYS_WEB|LOG_NOTICE) << "Webgui login succesfull !" << endl;
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ bool HttpServer::checkSession(const QHttpRequestHeader & hdr)
+ {
+ // check session in cookie
+ int session_id = 0;
+ if (hdr.hasKey("Cookie"))
+ {
+ QString cookie = hdr.value("Cookie");
+ int idx = cookie.find("KT_SESSID=");
+ if (idx == -1)
+ return false;
+
+ QString number;
+ idx += QString("KT_SESSID=").length();
+ while (idx < cookie.length())
+ {
+ if (cookie[idx] >= '0' && cookie[idx] <= '9')
+ number += cookie[idx];
+ else
+ break;
+
+ idx++;
+ }
+
+ session_id = number.toInt();
+ }
+
+
+ if (session_id == session.sessionId)
+ {
+ // check if the session hasn't expired yet
+ if(session.last_access.secsTo(QTime::currentTime())<WebInterfacePluginSettings::sessionTTL())
+ {
+ session.last_access=QTime::currentTime();
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ return false;
+
+ return true;
+ }
+
+ static QString ExtensionToContentType(const QString & ext)
+ {
+ if (ext == "html")
+ return "text/html";
+ else if (ext == "css")
+ return "text/css";
+ else if (ext == "js")
+ return "text/javascript";
+ else if (ext == "gif" || ext == "png" || ext == "ico")
+ return "image/" + ext;
+ else
+ return QString::null;
+ }
+
+ // HTTP needs non translated dates
+ static QString days[] = {
+ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
+ };
+
+ static QString months[] = {
+ "Jan","Feb","Mar","Apr",
+ "May","Jun","Jul","Aug",
+ "Sep","Oct","Nov","Dec"
+ };
+
+ static QString DateTimeToString(const QDateTime & now,bool cookie)
+ {
+ if (!cookie)
+ return now.toString("%1, dd %2 yyyy hh:mm:ss UTC")
+ .arg(days[now.date().dayOfWeek() - 1])
+ .arg(months[now.date().month() - 1]);
+ else
+ return now.toString("%1, dd-%2-yyyy hh:mm:ss GMT")
+ .arg(days[now.date().dayOfWeek() - 1])
+ .arg(months[now.date().month() - 1]);
+ }
+
+ void HttpServer::setDefaultResponseHeaders(HttpResponseHeader & hdr,const QString & content_type,bool with_session_info)
+ {
+ hdr.setValue("Server","KTorrent/" KT_VERSION_MACRO);
+ hdr.setValue("Date",DateTimeToString(QDateTime::currentDateTime(Qt::UTC),false));
+ hdr.setValue("Content-Type",content_type);
+ hdr.setValue("Connection","keep-alive");
+ if (with_session_info && session.sessionId && session.logged_in)
+ {
+ hdr.setValue("Set-Cookie",QString("KT_SESSID=%1").arg(session.sessionId));
+ }
+ }
+
+ void HttpServer::redirectToLoginPage(HttpClientHandler* hdlr)
+ {
+ HttpResponseHeader rhdr(301);
+ setDefaultResponseHeaders(rhdr,"text/html",false);
+ rhdr.setValue("Location","/login.html");
+ QString path = rootDir + bt::DirSeparator() + WebInterfacePluginSettings::skin() + "/login.html";
+ if (!hdlr->sendFile(rhdr,path))
+ {
+ HttpResponseHeader nhdr(404);
+ setDefaultResponseHeaders(nhdr,"text/html",false);
+ hdlr->send404(nhdr,path);
+ }
+ Out(SYS_WEB|LOG_NOTICE) << "Redirecting to /login.html" << endl;
+ }
+
+ void HttpServer::handleGet(HttpClientHandler* hdlr,const QHttpRequestHeader & hdr,bool do_not_check_session)
+ {
+ QString file = hdr.path();
+ if (file == "/")
+ file = "/login.html";
+
+ //Out(SYS_WEB|LOG_DEBUG) << "GET " << hdr.path() << endl;
+
+ KURL url;
+ url.setEncodedPathAndQuery(file);
+
+ QString path = rootDir + bt::DirSeparator() + WebInterfacePluginSettings::skin() + url.path();
+ // first check if the file exists (if not send 404)
+ if (!bt::Exists(path))
+ {
+ HttpResponseHeader rhdr(404);
+ setDefaultResponseHeaders(rhdr,"text/html",false);
+ hdlr->send404(rhdr,path);
+ return;
+ }
+
+ QFileInfo fi(path);
+ QString ext = fi.extension();
+
+ // if it is the login page send that
+ if (file == "/login.html" || file == "/")
+ {
+ session.logged_in = false;
+ ext = "html";
+ path = rootDir + bt::DirSeparator() + WebInterfacePluginSettings::skin() + "/login.html";
+ }
+ else if (!session.logged_in && (ext == "html" || ext == "php"))
+ {
+ // for any html or php page, a login is necessary
+ redirectToLoginPage(hdlr);
+ return;
+ }
+ else if (session.logged_in && !do_not_check_session && (ext == "html" || ext == "php"))
+ {
+ // if we are logged in and it's a html or php page, check the session id
+ if (!checkSession(hdr))
+ {
+ session.logged_in = false;
+ // redirect to login page
+ redirectToLoginPage(hdlr);
+ return;
+ }
+ }
+
+ if (ext == "html")
+ {
+ HttpResponseHeader rhdr(200);
+ setDefaultResponseHeaders(rhdr,"text/html",true);
+ if (path.endsWith("login.html"))
+ {
+ // clear cookie in case of login page
+ QDateTime dt = QDateTime::currentDateTime().addDays(-1);
+ QString cookie = QString("KT_SESSID=666; expires=%1 +0000").arg(DateTimeToString(dt,true));
+ rhdr.setValue("Set-Cookie",cookie);
+ }
+
+ if (!hdlr->sendFile(rhdr,path))
+ {
+ HttpResponseHeader nhdr(404);
+ setDefaultResponseHeaders(nhdr,"text/html",false);
+ hdlr->send404(nhdr,path);
+ }
+ }
+ else if (ext == "css" || ext == "js" || ext == "png" || ext == "ico" || ext == "gif" || ext == "jpg")
+ {
+ if (hdr.hasKey("If-Modified-Since"))
+ {
+ QDateTime dt = parseDate(hdr.value("If-Modified-Since"));
+ if (dt.isValid() && dt < fi.lastModified())
+ {
+ HttpResponseHeader rhdr(304);
+ setDefaultResponseHeaders(rhdr,"text/html",true);
+ rhdr.setValue("Cache-Control","max-age=0");
+ rhdr.setValue("Last-Modified",DateTimeToString(fi.lastModified(),false));
+ rhdr.setValue("Expires",DateTimeToString(QDateTime::currentDateTime(Qt::UTC).addSecs(3600),false));
+ hdlr->sendResponse(rhdr);
+ return;
+ }
+ }
+
+
+ HttpResponseHeader rhdr(200);
+ setDefaultResponseHeaders(rhdr,ExtensionToContentType(ext),true);
+ rhdr.setValue("Last-Modified",DateTimeToString(fi.lastModified(),false));
+ rhdr.setValue("Expires",DateTimeToString(QDateTime::currentDateTime(Qt::UTC).addSecs(3600),false));
+ rhdr.setValue("Cache-Control","private");
+ if (!hdlr->sendFile(rhdr,path))
+ {
+ HttpResponseHeader nhdr(404);
+ setDefaultResponseHeaders(nhdr,"text/html",false);
+ hdlr->send404(nhdr,path);
+ }
+ }
+ else if (ext == "php")
+ {
+ bool redirect = false;
+ bool shutdown = false;
+ if (url.queryItems().count() > 0 && session.logged_in)
+ redirect = php_i->exec(url,shutdown);
+
+ if (shutdown)
+ {
+ // first send back login page
+ redirectToLoginPage(hdlr);
+ QTimer::singleShot(1000,kapp,SLOT(quit()));
+ }
+ else if (redirect)
+ {
+ HttpResponseHeader rhdr(301);
+ setDefaultResponseHeaders(rhdr,"text/html",true);
+ rhdr.setValue("Location",url.encodedPathAndQuery());
+
+ hdlr->executePHPScript(php_i,rhdr,WebInterfacePluginSettings::phpExecutablePath(),
+ path,url.queryItems());
+ }
+ else
+ {
+ HttpResponseHeader rhdr(200);
+ setDefaultResponseHeaders(rhdr,"text/html",true);
+
+ hdlr->executePHPScript(php_i,rhdr,WebInterfacePluginSettings::phpExecutablePath(),
+ path,url.queryItems());
+ }
+ }
+ else
+ {
+ HttpResponseHeader rhdr(404);
+ setDefaultResponseHeaders(rhdr,"text/html",false);
+ hdlr->send404(rhdr,path);
+ }
+ }
+
+ void HttpServer::handlePost(HttpClientHandler* hdlr,const QHttpRequestHeader & hdr,const QByteArray & data)
+ {
+ // this is either a file or a login
+ if (hdr.value("Content-Type").startsWith("multipart/form-data"))
+ {
+ handleTorrentPost(hdlr,hdr,data);
+ }
+ else if (!checkLogin(hdr,data))
+ {
+ QHttpRequestHeader tmp = hdr;
+ tmp.setRequest("GET","/login.html",1,1);
+ handleGet(hdlr,tmp);
+ }
+ else
+ {
+ handleGet(hdlr,hdr,true);
+ }
+ }
+
+ void HttpServer::handleTorrentPost(HttpClientHandler* hdlr,const QHttpRequestHeader & hdr,const QByteArray & data)
+ {
+ const char* ptr = data.data();
+ Uint32 len = data.size();
+ int pos = QString(data).find("\r\n\r\n");
+
+ if (pos == -1 || pos + 4 >= len || ptr[pos + 4] != 'd')
+ {
+ HttpResponseHeader rhdr(500);
+ setDefaultResponseHeaders(rhdr,"text/html",false);
+ hdlr->send500(rhdr);
+ return;
+ }
+
+ // save torrent to a temporary file
+ KTempFile tmp_file(locateLocal("tmp", "ktwebgui-"), ".torrent");
+ QDataStream* out = tmp_file.dataStream();
+ if (!out)
+ {
+ HttpResponseHeader rhdr(500);
+ setDefaultResponseHeaders(rhdr,"text/html",false);
+ hdlr->send500(rhdr);
+ return;
+ }
+
+ out->writeRawBytes(ptr + (pos + 4),len - (pos + 4));
+ tmp_file.sync();
+ tmp_file.setAutoDelete(true);
+
+ Out(SYS_WEB|LOG_NOTICE) << "Loading file " << tmp_file.name() << endl;
+ core->loadSilently(KURL::fromPathOrURL(tmp_file.name()));
+
+ handleGet(hdlr,hdr);
+ }
+
+ void HttpServer::handleUnsupportedMethod(HttpClientHandler* hdlr)
+ {
+ HttpResponseHeader rhdr(500);
+ setDefaultResponseHeaders(rhdr,"text/html",false);
+ hdlr->send500(rhdr);
+ }
+
+ void HttpServer::slotConnectionClosed()
+ {
+ QSocket* socket= (QSocket*)sender();
+ clients.erase(socket);
+ }
+
+ QDateTime HttpServer::parseDate(const QString & str)
+ {
+ /*
+ Potential date formats :
+ Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+ Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+ */
+ QStringList sl = QStringList::split(" ",str);
+ if (sl.count() == 6)
+ {
+ // RFC 1123 format
+ QDate d;
+ QString month = sl[2];
+ int m = -1;
+ for (int i = 1;i <= 12 && m < 0;i++)
+ if (QDate::shortMonthName(i) == month)
+ m = i;
+
+ d.setYMD(sl[3].toInt(),m,sl[1].toInt());
+
+ QTime t = QTime::fromString(sl[4],Qt::ISODate);
+ return QDateTime(d,t);
+ }
+ else if (sl.count() == 4)
+ {
+ // RFC 1036
+ QStringList dl = QStringList::split("-",sl[1]);
+ if (dl.count() != 3)
+ return QDateTime();
+
+ QDate d;
+ QString month = dl[1];
+ int m = -1;
+ for (int i = 1;i <= 12 && m < 0;i++)
+ if (QDate::shortMonthName(i) == month)
+ m = i;
+
+ d.setYMD(2000 + dl[2].toInt(),m,dl[0].toInt());
+
+ QTime t = QTime::fromString(sl[2],Qt::ISODate);
+ return QDateTime(d,t);
+ }
+ else if (sl.count() == 5)
+ {
+ // ANSI C
+ QDate d;
+ QString month = sl[1];
+ int m = -1;
+ for (int i = 1;i <= 12 && m < 0;i++)
+ if (QDate::shortMonthName(i) == month)
+ m = i;
+
+ d.setYMD(sl[4].toInt(),m,sl[2].toInt());
+
+ QTime t = QTime::fromString(sl[3],Qt::ISODate);
+ return QDateTime(d,t);
+ }
+ else
+ return QDateTime();
+ }
+
+ bt::MMapFile* HttpServer::cacheLookup(const QString & name)
+ {
+ return cache.find(name);
+ }
+
+ void HttpServer::insertIntoCache(const QString & name,bt::MMapFile* file)
+ {
+ cache.insert(name,file);
+ }
+
+}
+
+#include "httpserver.moc"
diff --git a/plugins/webinterface/httpserver.h b/plugins/webinterface/httpserver.h
new file mode 100644
index 0000000..28be441
--- /dev/null
+++ b/plugins/webinterface/httpserver.h
@@ -0,0 +1,104 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 HTTPSERVER_H
+#define HTTPSERVER_H
+
+#include <qcache.h>
+#include <qhttp.h>
+#include <qdatetime.h>
+#include <qserversocket.h>
+#include <util/ptrmap.h>
+
+class QSocket;
+
+namespace bt
+{
+ class MMapFile;
+}
+
+namespace kt
+{
+ class CoreInterface;
+
+ /**
+ * @author Diego R. Brogna
+ */
+ struct Session
+ {
+ bool logged_in;
+ QTime last_access;
+ int sessionId;
+ };
+
+ struct HeaderField
+ {
+ bool gzip;
+ bool keepAlive;
+ int sessionId;
+ bool ifModifiedSince;
+ };
+
+ class PhpHandler;
+ class PhpInterface;
+ class HttpClientHandler;
+ class HttpResponseHeader;
+
+
+
+ class HttpServer : public QServerSocket
+ {
+ Q_OBJECT
+ public:
+ HttpServer(CoreInterface *core, int port);
+ virtual ~HttpServer();
+
+ void newConnection(int s);
+
+ void handleGet(HttpClientHandler* hdlr,const QHttpRequestHeader & hdr,bool do_not_check_session = false);
+ void handlePost(HttpClientHandler* hdlr,const QHttpRequestHeader & hdr,const QByteArray & data);
+ void handleUnsupportedMethod(HttpClientHandler* hdlr);
+ bt::MMapFile* cacheLookup(const QString & name);
+ void insertIntoCache(const QString & name,bt::MMapFile* file);
+
+ protected slots:
+ void slotSocketReadyToRead();
+ void slotConnectionClosed();
+
+ private:
+ bool checkSession(const QHttpRequestHeader & hdr);
+ bool checkLogin(const QHttpRequestHeader & hdr,const QByteArray & data);
+ void setDefaultResponseHeaders(HttpResponseHeader & hdr,const QString & content_type,bool with_session_info);
+ void handleTorrentPost(HttpClientHandler* hdlr,const QHttpRequestHeader & hdr,const QByteArray & data);
+ QDateTime parseDate(const QString & str);
+ void redirectToLoginPage(HttpClientHandler* hdlr);
+
+ private:
+ QString rootDir;
+ int sessionTTL;
+ PhpInterface *php_i;
+ Session session;
+ bt::PtrMap<QSocket*,HttpClientHandler> clients;
+ CoreInterface *core;
+ QCache<bt::MMapFile> cache;
+ };
+
+
+}
+#endif // HTTPSERVER_H
diff --git a/plugins/webinterface/ktwebinterfaceplugin.desktop b/plugins/webinterface/ktwebinterfaceplugin.desktop
new file mode 100644
index 0000000..f1fc92b
--- /dev/null
+++ b/plugins/webinterface/ktwebinterfaceplugin.desktop
@@ -0,0 +1,22 @@
+[Desktop Entry]
+Name=WebInterface
+Name[bg]=Уеб интерфейс
+Name[da]=Web-grænseflade
+Name[de]=Web-Schnittstelle
+Name[et]=Veebiliides
+Name[it]=Interfaccia Web
+Name[nb]=Internettgrensesnitt
+Name[nds]=Nettkoppelsteed
+Name[nl]=Webinterface
+Name[pl]=Interfejs WWW
+Name[pt]=Interface Web
+Name[sr]=Веб интерфејс
+Name[sr@Latn]=Veb interfejs
+Name[sv]=Webb-gränssnitt
+Name[tr]=Ağ Arayüzü
+Name[uk]=Веб-інтерфейс
+Name[xx]=xxWebInterfacexx
+Name[zh_CN]=Web 界面
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktwebinterfaceplugin
diff --git a/plugins/webinterface/ktwebinterfaceplugin.kcfg b/plugins/webinterface/ktwebinterfaceplugin.kcfg
new file mode 100644
index 0000000..cbfd5e7
--- /dev/null
+++ b/plugins/webinterface/ktwebinterfaceplugin.kcfg
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
+ http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
+
+ <kcfgfile name="ktwebinterfacepluginrc"/>
+ <group name="general">
+ <entry name="port" type="Int">
+ <label>Port number</label>
+ <default>8080</default>
+ </entry>
+
+ <entry name="forward" type="Bool">
+ <label>forward Port</label>
+ <default>false</default>
+ </entry>
+
+ <entry name="sessionTTL" type ="Int">
+ <label>Session time to live</label>
+ <default>3600</default>
+ </entry>
+ <entry name="skin" type ="String">
+ <label>interface skin</label>
+ <default>default</default>
+ </entry>
+ <entry name="phpExecutablePath" type ="String">
+ <label>php executable path</label>
+ <default></default>
+ </entry>
+
+ <entry name="username" type ="String">
+ <label>username</label>
+ <default></default>
+ </entry>
+ <entry name="password" type ="String">
+ <label>password</label>
+ <default></default>
+ </entry>
+ </group>
+</kcfg>
diff --git a/plugins/webinterface/php_handler.cpp b/plugins/webinterface/php_handler.cpp
new file mode 100644
index 0000000..d04c3b6
--- /dev/null
+++ b/plugins/webinterface/php_handler.cpp
@@ -0,0 +1,121 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 "php_handler.h"
+
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <util/log.h>
+#include "php_interface.h"
+
+
+using namespace kt;
+using namespace bt;
+
+namespace kt
+{
+ QMap<QString,QByteArray> PhpHandler::scripts;
+
+ PhpHandler::PhpHandler(const QString & php_exe,PhpInterface *php) : QProcess(php_exe),php_i(php)
+ {
+ connect(this,SIGNAL(readyReadStdout()),this,SLOT(onReadyReadStdout()));
+ connect(this,SIGNAL(processExited()),this,SLOT(onExited()));
+ }
+
+ PhpHandler::~PhpHandler()
+ {
+ }
+
+ bool PhpHandler::executeScript(const QString & path,const QMap<QString,QString> & args)
+ {
+ QByteArray php_s;
+ if (!scripts.contains(path))
+ {
+ QFile fptr(path);
+ if (!fptr.open(IO_ReadOnly))
+ {
+ Out(SYS_WEB|LOG_DEBUG) << "Failed to open " << path << endl;
+ return false;
+ }
+ php_s = fptr.readAll();
+ scripts.insert(path,php_s);
+ }
+ else
+ {
+ php_s = scripts[path];
+ }
+
+ output.resize(0);
+
+ int firstphptag = QCString(php_s).find("<?php");
+ if (firstphptag == -1)
+ return false;
+
+ int off = firstphptag + 6;
+ QByteArray data;
+ QTextStream ts(data,IO_WriteOnly);
+ ts.setEncoding( QTextStream::UnicodeUTF8 );
+ ts.writeRawBytes(php_s.data(),off); // first write the opening tag from the script
+ php_i->globalInfo(ts);
+ php_i->downloadStatus(ts);
+
+ QMap<QString,QString>::const_iterator it;
+
+ for ( it = args.begin(); it != args.end(); ++it )
+ {
+ ts << QString("$_REQUEST['%1']=\"%2\";\n").arg(it.key()).arg(it.data());
+ }
+ ts.writeRawBytes(php_s.data() + off,php_s.size() - off); // the rest of the script
+ ts << flush;
+
+#if 0
+ QFile dinges("output.php");
+ if (dinges.open(IO_WriteOnly))
+ {
+ QTextStream out(&dinges);
+ out.writeRawBytes(data.data(),data.size());
+ dinges.close();
+ }
+#endif
+ return launch(data);
+ }
+
+ void PhpHandler::onExited()
+ {
+ // read remaining data
+ onReadyReadStdout();
+ finished();
+ }
+
+ void PhpHandler::onReadyReadStdout()
+ {
+ QTextStream out(output,IO_WriteOnly|IO_Append);
+ while (canReadLineStdout())
+ {
+ QByteArray d = readStdout();
+ out.writeRawBytes(d.data(),d.size());
+ }
+ }
+
+}
+
+#include "php_handler.moc"
diff --git a/plugins/webinterface/php_handler.h b/plugins/webinterface/php_handler.h
new file mode 100644
index 0000000..b9bfcb6
--- /dev/null
+++ b/plugins/webinterface/php_handler.h
@@ -0,0 +1,57 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 PHP_HANDLER_H
+#define PHP_HANDLER_H
+
+#include <qmap.h>
+#include <kurl.h>
+#include <qprocess.h>
+
+
+namespace kt
+{
+ class PhpInterface;
+
+ class PhpHandler : public QProcess
+ {
+ Q_OBJECT
+ public:
+ PhpHandler(const QString & php_exe,PhpInterface *php);
+ virtual ~PhpHandler();
+
+ bool executeScript(const QString & path,const QMap<QString,QString> & args);
+ const QByteArray & getOutput() const {return output;};
+
+ public slots:
+ void onExited();
+ void onReadyReadStdout();
+
+ signals:
+ void finished();
+
+ private:
+ QByteArray output;
+ PhpInterface *php_i;
+
+ static QMap<QString,QByteArray> scripts;
+ };
+}
+
+#endif
diff --git a/plugins/webinterface/php_interface.cpp b/plugins/webinterface/php_interface.cpp
new file mode 100644
index 0000000..8ee7d0b
--- /dev/null
+++ b/plugins/webinterface/php_interface.cpp
@@ -0,0 +1,486 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 <kio/global.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+#include <net/socketmonitor.h>
+#include <torrent/choker.h>
+#include <torrent/udptrackersocket.h>
+#include <kademlia/dhtbase.h>
+#include <torrent/server.h>
+#include <util/log.h>
+#include <interfaces/functions.h>
+
+#include "php_interface.h"
+
+using namespace bt;
+
+namespace kt
+{
+ extern QString DataDir();
+
+ using bt::FIRST_PRIORITY;
+ using bt::NORMAL_PRIORITY;
+ using bt::LAST_PRIORITY;
+ using bt::EXCLUDED;
+
+
+ QString BytesToString2(Uint64 bytes,int precision = 2)
+ {
+ KLocale* loc = KGlobal::locale();
+ if (bytes >= 1024 * 1024 * 1024)
+ return QString("%1 GB").arg(loc->formatNumber(bytes / TO_GIG,precision < 0 ? 2 : precision));
+ else if (bytes >= 1024*1024)
+ return QString("%1 MB").arg(loc->formatNumber(bytes / TO_MEG,precision < 0 ? 1 : precision));
+ else if (bytes >= 1024)
+ return QString("%1 KB").arg(loc->formatNumber(bytes / TO_KB,precision < 0 ? 1 : precision));
+ else
+ return QString("%1 B").arg(bytes);
+ }
+
+ QString KBytesPerSecToString2(double speed,int precision = 2)
+ {
+ KLocale* loc = KGlobal::locale();
+ return QString("%1 KB/s").arg(loc->formatNumber(speed,precision));
+ }
+
+ /************************
+ *PhpCodeGenerator *
+ ************************/
+ PhpCodeGenerator::PhpCodeGenerator(CoreInterface *c)
+ {
+ core=c;
+ }
+
+ /*Generate php code
+ * function downloadStatus()
+ * {
+ * return array( ... );
+ * }
+ */
+ void PhpCodeGenerator::downloadStatus(QTextStream & out)
+ {
+ TorrentStats stats;
+ //Priority file_priority;
+ QString status;
+ out << "function downloadStatus()\n{\nreturn array(";
+
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if (k > 0)
+ out << ",\n";
+
+ stats=(*i)->getStats();
+ out << QString("\n%1 => array(").arg(k);
+
+ out << QString("\"imported_bytes\" => %1,\n").arg(stats.imported_bytes);
+ out << QString("\"bytes_downloaded\" => \"%1\",\n").arg(BytesToString2(stats.bytes_downloaded));
+ out << QString("\"bytes_uploaded\" => \"%1\",\n").arg(BytesToString2(stats.bytes_uploaded));
+ out << QString("\"bytes_left\" => %1,\n").arg(stats.bytes_left);
+ out << QString("\"bytes_left_to_download\" => %1,\n").arg(stats.bytes_left_to_download);
+ out << QString("\"total_bytes\" => \"%1\",\n").arg(BytesToString2(stats.total_bytes));
+ out << QString("\"total_bytes_to_download\" => %1,\n").arg(stats.total_bytes_to_download);
+ out << QString("\"download_rate\" => \"%1\",\n").arg(KBytesPerSecToString2(stats.download_rate / 1024.0));
+ out << QString("\"upload_rate\" => \"%1\",\n").arg(KBytesPerSecToString2(stats.upload_rate / 1024.0));
+ out << QString("\"num_peers\" => %1,\n").arg(stats.num_peers);
+ out << QString("\"num_chunks_downloading\" => %1,\n").arg(stats.num_chunks_downloading);
+ out << QString("\"total_chunks\" => %1,\n").arg(stats.total_chunks);
+ out << QString("\"num_chunks_downloaded\" => %1,\n").arg(stats.num_chunks_downloaded);
+ out << QString("\"num_chunks_excluded\" => %1,\n").arg(stats.num_chunks_excluded);
+ out << QString("\"chunk_size\" => %1,\n").arg(stats.chunk_size);
+ out << QString("\"seeders_total\" => %1,\n").arg(stats.seeders_total);
+ out << QString("\"seeders_connected_to\" => %1,\n").arg(stats.seeders_connected_to);
+ out << QString("\"leechers_total\" => %1,\n").arg(stats.leechers_total);
+ out << QString("\"leechers_connected_to\" => %1,\n").arg(stats.leechers_connected_to);
+ out << QString("\"status\" => %1,\n").arg(stats.status);
+ out << QString("\"running\" => %1,\n").arg(stats.running);
+ out << QString("\"trackerstatus\" => \"%1\",\n").arg(stats.trackerstatus.replace("\\", "\\\\").replace("\"", "\\\"").replace("$", "\\$"));
+ out << QString("\"session_bytes_downloaded\" => %1,\n").arg(stats.session_bytes_downloaded);
+ out << QString("\"session_bytes_uploaded\" => %1,\n").arg(stats.session_bytes_uploaded);
+ out << QString("\"trk_bytes_downloaded\" => %1,\n").arg(stats.trk_bytes_downloaded);
+ out << QString("\"trk_bytes_uploaded\" => %1,\n").arg(stats.trk_bytes_uploaded);
+ out << QString("\"torrent_name\" => \"%1\",\n").arg(stats.torrent_name.replace("\\", "\\\\").replace("\"", "\\\"").replace("$", "\\$"));
+ out << QString("\"output_path\" => \"%1\",\n").arg(stats.output_path.replace("\\", "\\\\").replace("\"", "\\\"").replace("$", "\\$"));
+ out << QString("\"stopped_by_error\" => \"%1\",\n").arg(stats.stopped_by_error);
+ out << QString("\"completed\" => \"%1\",\n").arg(stats.completed);
+ out << QString("\"user_controlled\" => \"%1\",\n").arg(stats.user_controlled);
+ out << QString("\"max_share_ratio\" => %1,\n").arg(stats.max_share_ratio);
+ out << QString("\"priv_torrent\" => \"%1\",\n").arg(stats.priv_torrent);
+ out << QString("\"num_files\" => \"%1\",\n").arg((*i)->getNumFiles());
+ out << QString("\"files\" => array(");
+ out << flush;
+ if (stats.multi_file_torrent)
+ {
+ //for loop to add each file+status to "files" array
+ for (Uint32 j = 0;j < (*i)->getNumFiles();j++)
+ {
+ if (j > 0)
+ out << ",\n";
+
+ TorrentFileInterface & file = (*i)->getTorrentFile(j);
+ out << QString("\"%1\" => array(\n").arg(j);
+ out << QString("\"name\" => \"%1\",\n").arg(file.getPath());
+ out << QString("\"size\" => \"%1\",\n").arg(KIO::convertSize(file.getSize()));
+ out << QString("\"perc_done\" => \"%1\",\n").arg(file.getDownloadPercentage());
+ out << QString("\"status\" => \"%1\"\n").arg(file.getPriority());
+ out << QString(")\n");
+ out << flush;
+ }
+ }
+
+ out << ")\n";
+ out << ")\n";
+ }
+
+ out << ");\n}\n";
+ }
+
+ /*Generate php code
+ * function globalStatus()
+ * {
+ * return array( ... );
+ * }
+ */
+ void PhpCodeGenerator::globalInfo(QTextStream & out)
+ {
+ out << "function globalInfo()\n{\nreturn array(";
+ CurrentStats stats=core->getStats();
+
+ out << QString("\"download_speed\" => \"%1\",").arg(KBytesPerSecToString2(stats.download_speed / 1024.0));
+ out << QString("\"upload_speed\" => \"%1\",").arg(KBytesPerSecToString2(stats.upload_speed / 1024.0));
+ out << QString("\"bytes_downloaded\" => \"%1\",").arg(stats.bytes_downloaded);
+ out << QString("\"bytes_uploaded\" => \"%1\",").arg(stats.bytes_uploaded);
+ out << QString("\"max_download_speed\" => \"%1\",").arg(core->getMaxDownloadSpeed());
+ out << QString("\"max_upload_speed\" => \"%1\",").arg(core->getMaxUploadSpeed());
+ out << QString("\"max_downloads\" => \"%1\",").arg(Settings::maxDownloads());
+ out << QString("\"max_seeds\"=> \"%1\",").arg(Settings::maxSeeds());
+ out << QString("\"dht_support\" => \"%1\",").arg(Settings::dhtSupport());
+ out << QString("\"use_encryption\" => \"%1\"").arg(Settings::useEncryption());
+ out << ");\n}\n";
+ }
+
+
+ /************************
+ *PhpActionExec *
+ ************************/
+ PhpActionExec::PhpActionExec(CoreInterface *c)
+ {
+ core=c;
+ }
+
+ bool PhpActionExec::exec(KURL & url,bool & shutdown)
+ {
+ bool ret = false;
+ shutdown = false;
+ int separator_loc;
+ QString parse;
+ QString torrent_num;
+ QString file_num;
+ KURL redirected_url;
+ redirected_url.setPath(url.path());
+
+ const QMap<QString, QString> & params = url.queryItems();
+ QMap<QString, QString>::ConstIterator it;
+
+ for ( it = params.begin(); it != params.end(); ++it )
+ {
+ // Out(SYS_WEB| LOG_DEBUG) << "exec " << it.key().latin1() << endl;
+ switch(it.key()[0])
+ {
+ case 'd':
+ if(it.key()=="dht")
+ {
+ if(it.data()=="start")
+ {
+ Settings::setDhtSupport(true);
+ }
+ else
+ {
+ Settings::setDhtSupport(false);
+ }
+
+ dht::DHTBase & ht = Globals::instance().getDHT();
+ if (Settings::dhtSupport() && !ht.isRunning())
+ {
+ ht.start(kt::DataDir() + "dht_table",kt::DataDir() + "dht_key",Settings::dhtPort());
+ ret = true;
+ }
+ else if (!Settings::dhtSupport() && ht.isRunning())
+ {
+ ht.stop();
+ ret = true;
+ }
+ else if (Settings::dhtSupport() && ht.getPort() != Settings::dhtPort())
+ {
+ ht.stop();
+ ht.start(kt::DataDir() + "dht_table",kt::DataDir() + "dht_key",Settings::dhtPort());
+ ret = true;
+ }
+ }
+ break;
+ case 'e':
+ if(it.key()=="encription")
+ {
+ if(it.data()=="start")
+ {
+ Settings::setUseEncryption(true);
+ }
+ else
+ {
+ Settings::setUseEncryption(false);
+ }
+
+ if (Settings::useEncryption())
+ {
+ Globals::instance().getServer().enableEncryption(Settings::allowUnencryptedConnections());
+ }
+ else
+ {
+ Globals::instance().getServer().disableEncryption();
+ }
+ ret = true;
+ }
+ break;
+ case 'f':
+ //parse argument into torrent number and file number
+ separator_loc=it.data().find('-');
+ parse=it.data();
+ torrent_num.append(parse.left(separator_loc));
+ file_num.append(parse.right(parse.length()-(separator_loc+1)));
+
+ if(it.key()=="file_lp")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(LAST_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="file_np")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(NORMAL_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="file_hp")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(FIRST_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="file_stop")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(torrent_num.toInt()==k)
+ {
+ TorrentFileInterface & file = (*i)->getTorrentFile(file_num.toInt());
+ file.setPriority(ONLY_SEED_PRIORITY);
+ ret = true;
+ break;
+ }
+ }
+ }
+ break;
+ case 'g':
+ if(it.key()=="global_connection")
+ {
+ Settings::setMaxTotalConnections(it.data().toInt());
+ PeerManager::setMaxTotalConnections(Settings::maxTotalConnections());
+ ret = true;
+ }
+ break;
+ case 'l':
+ if(it.key()=="load_torrent" && it.data().length() > 0)
+ {
+ core->loadSilently(KURL::decode_string(it.data()));
+ ret = true;
+ }
+ break;
+ case 'm':
+ if(it.key()=="maximum_downloads")
+ {
+ core->setMaxDownloads(it.data().toInt());
+ Settings::setMaxDownloads(it.data().toInt());
+ ret = true;
+ }
+ else if(it.key()=="maximum_seeds")
+ {
+ core->setMaxSeeds(it.data().toInt());
+ Settings::setMaxSeeds(it.data().toInt());
+ ret = true;
+ }
+ else if(it.key()=="maximum_connection_per_torrent")
+ {
+ PeerManager::setMaxConnections(it.data().toInt());
+ Settings::setMaxConnections(it.data().toInt());
+ ret = true;
+ }
+ else if(it.key()=="maximum_upload_rate")
+ {
+ Settings::setMaxUploadRate(it.data().toInt());
+ core->setMaxUploadSpeed(Settings::maxUploadRate());
+ net::SocketMonitor::setUploadCap( Settings::maxUploadRate() * 1024);
+ ret = true;
+ }
+ else if(it.key()=="maximum_download_rate")
+ {
+ Settings::setMaxDownloadRate(it.data().toInt());
+ core->setMaxDownloadSpeed(Settings::maxDownloadRate());
+ net::SocketMonitor::setDownloadCap(Settings::maxDownloadRate()*1024);
+ ret = true;
+ }
+ else if(it.key()=="maximum_share_ratio")
+ {
+ Settings::setMaxRatio(it.data().toInt());
+ ret = true;
+ }
+ break;
+ case 'n':
+ if(it.key()=="number_of_upload_slots")
+ {
+ Settings::setNumUploadSlots(it.data().toInt());
+ Choker::setNumUploadSlots(Settings::numUploadSlots());
+ ret = true;
+ }
+ break;
+ case 'p':
+ if(it.key()=="port")
+ {
+ Settings::setPort(it.data().toInt());
+ core->changePort(Settings::port());
+ }
+ else if(it.key()=="port_udp_tracker")
+ {
+ Settings::setUdpTrackerPort(it.data().toInt());
+ UDPTrackerSocket::setPort(Settings::udpTrackerPort());
+ ret = true;
+ }
+ break;
+ case 'q':
+ if(it.key()=="quit" && !it.data().isEmpty())
+ {
+ shutdown = true;
+ ret = true;
+ }
+ break;
+ case 'r':
+ if(it.key()=="remove")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(it.data().toInt()==k)
+ {
+ core->remove((*i), false);
+ ret = true;
+ break;
+ }
+ }
+ }
+ break;
+ case 's':
+ if(it.key()=="stopall" && !it.data().isEmpty())
+ {
+ core->stopAll(3);
+ }
+ else if(it.key()=="startall" && !it.data().isEmpty())
+ {
+ core->startAll(3);
+ }
+ else if(it.key()=="stop")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(it.data().toInt()==k)
+ {
+ (*i)->stop(true);
+ ret = true;
+ break;
+ }
+ }
+ }
+ else if(it.key()=="start")
+ {
+ QPtrList<TorrentInterface>::iterator i= core->getQueueManager()->begin();
+ for(int k=0; i != core->getQueueManager()->end(); i++, k++)
+ {
+ if(it.data().toInt()==k)
+ {
+ (*i)->start();
+ ret = true;
+ break;
+ }
+ }
+ }
+ break;
+
+ default:
+ // add unknown query items to the redirected url
+ // we don't add the keys above, because if the user presses refresh
+ // the same action will be taken again
+ redirected_url.addQueryItem(it.key(),it.data());
+ break;
+ }
+ Settings::writeConfig();
+ }
+
+ if (ret)
+ url = redirected_url;
+
+ return ret;
+ }
+
+ /************************
+ *PhpInterface *
+ ************************/
+ PhpInterface::PhpInterface(CoreInterface *c):PhpCodeGenerator(c), PhpActionExec(c)
+ {
+
+ }
+
+}
diff --git a/plugins/webinterface/php_interface.h b/plugins/webinterface/php_interface.h
new file mode 100644
index 0000000..be79019
--- /dev/null
+++ b/plugins/webinterface/php_interface.h
@@ -0,0 +1,68 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 PHP_INTERFACE_H
+#define PHP_INTERFACE_H
+
+#include <qstring.h>
+#include <torrent/peermanager.h>
+#include <settings.h>
+#include <torrent/queuemanager.h>
+#include <interfaces/coreinterface.h>
+#include <interfaces/torrentinterface.h>
+#include <interfaces/torrentfileinterface.h>
+
+ /**
+ * @author Diego R. Brogna
+ */
+namespace kt
+{
+ class PhpCodeGenerator
+ {
+ public:
+ PhpCodeGenerator(CoreInterface *c);
+ virtual ~PhpCodeGenerator(){}
+
+ void downloadStatus(QTextStream & out);
+ void globalInfo(QTextStream & out);
+ private:
+ CoreInterface *core;
+ };
+
+ class PhpActionExec
+ {
+ public:
+ PhpActionExec(CoreInterface *c);
+ virtual ~PhpActionExec(){};
+
+ bool exec(KURL & url,bool & shutdown);
+ private:
+ CoreInterface *core;
+ };
+
+ class PhpInterface: public PhpCodeGenerator, public PhpActionExec
+ {
+ public:
+ PhpInterface(CoreInterface *c);
+ //~PhpInterface{};
+ };
+}
+
+#endif
diff --git a/plugins/webinterface/webinterfaceplugin.cpp b/plugins/webinterface/webinterfaceplugin.cpp
new file mode 100644
index 0000000..bce4115
--- /dev/null
+++ b/plugins/webinterface/webinterfaceplugin.cpp
@@ -0,0 +1,128 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+#include <kglobal.h>
+
+#include <util/log.h>
+#include <interfaces/coreinterface.h>
+#include <interfaces/guiinterface.h>
+#include <interfaces/torrentinterface.h>
+#include <torrent/globals.h>
+#include <net/portlist.h>
+#include "webinterfaceprefpage.h"
+#include "webinterfaceplugin.h"
+#include "httpserver.h"
+#include "webinterfacepluginsettings.h"
+
+#define NAME "Web Interface"
+#define AUTHOR "Diego R. Brogna"
+#define EMAIL "dierbro@gmail.com"
+
+K_EXPORT_COMPONENT_FACTORY(ktwebinterfaceplugin,KGenericFactory<kt::WebInterfacePlugin>("ktwebinterfaceplugin"))
+
+using namespace bt;
+namespace kt
+{
+ WebInterfacePlugin::WebInterfacePlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name, args,NAME,i18n("Web Interface"),AUTHOR,EMAIL,i18n("Allow to control ktorrent through browser"),"toggle_log")
+ {
+ http_server = 0;
+ pref=0;
+ }
+
+ WebInterfacePlugin::~WebInterfacePlugin()
+ {
+
+ }
+
+ void WebInterfacePlugin::load()
+ {
+ initServer();
+
+ pref = new WebInterfacePrefPage(this);
+ getGUI()->addPrefPage(pref);
+
+ }
+
+ void WebInterfacePlugin::unload()
+ {
+ if (http_server)
+ {
+ bt::Globals::instance().getPortList().removePort(http_server->port(),net::TCP);
+ delete http_server;
+ http_server = 0;
+ }
+
+ getGUI()->removePrefPage(pref);
+ delete pref;
+ pref = 0;
+ }
+
+ void WebInterfacePlugin::initServer()
+ {
+ bt::Uint16 port = WebInterfacePluginSettings::port();
+ bt::Uint16 i = 0;
+
+ while (i < 10)
+ {
+ http_server = new HttpServer(getCore(),port + i);
+ if (!http_server->ok())
+ {
+ delete http_server;
+ http_server = 0;
+ }
+ else
+ break;
+ i++;
+ }
+
+ if (http_server)
+ {
+ if(WebInterfacePluginSettings::forward())
+ bt::Globals::instance().getPortList().addNewPort(http_server->port(),net::TCP,true);
+ Out(SYS_WEB|LOG_ALL) << "Web server listen on port "<< http_server->port() << endl;
+ }
+ else
+ {
+ Out(SYS_WEB|LOG_ALL) << "Cannot bind to port " << port <<" or the 10 following ports. WebInterface plugin cannot be loaded." << endl;
+ return;
+ }
+ }
+
+ void WebInterfacePlugin::preferencesUpdated()
+ {
+ if( http_server && http_server->port() != WebInterfacePluginSettings::port())
+ {
+ //stop and delete http server
+ bt::Globals::instance().getPortList().removePort(http_server->port(),net::TCP);
+ delete http_server;
+ http_server = 0;
+ // reinitialize server
+ initServer();
+ }
+ }
+
+ bool WebInterfacePlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+}
+
+#include "webinterfaceplugin.moc"
diff --git a/plugins/webinterface/webinterfaceplugin.h b/plugins/webinterface/webinterfaceplugin.h
new file mode 100644
index 0000000..469fda2
--- /dev/null
+++ b/plugins/webinterface/webinterfaceplugin.h
@@ -0,0 +1,54 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 KTWEBINTERFACEPLUGIN_H
+#define KTWEBINTERFACEPLUGIN_H
+
+#include <interfaces/plugin.h>
+
+namespace kt
+{
+ /**
+ * @author Diego R. Brogna
+ */
+ class HttpServer;
+
+ class WebInterfacePlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ WebInterfacePlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~WebInterfacePlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+
+ void preferencesUpdated();
+ private:
+ void initServer();
+
+ WebInterfacePrefPage* pref;
+ HttpServer* http_server;
+ };
+
+}
+
+#endif
diff --git a/plugins/webinterface/webinterfacepluginsettings.kcfgc b/plugins/webinterface/webinterfacepluginsettings.kcfgc
new file mode 100644
index 0000000..fd5aebf
--- /dev/null
+++ b/plugins/webinterface/webinterfacepluginsettings.kcfgc
@@ -0,0 +1,7 @@
+# Code generation options for kconfig_compiler
+File=ktwebinterfaceplugin.kcfg
+ClassName=WebInterfacePluginSettings
+Namespace=kt
+Singleton=true
+Mutators=true
+# will create the necessary code for setting those variables
diff --git a/plugins/webinterface/webinterfacepref.ui b/plugins/webinterface/webinterfacepref.ui
new file mode 100644
index 0000000..63d368b
--- /dev/null
+++ b/plugins/webinterface/webinterfacepref.ui
@@ -0,0 +1,256 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>WebInterfacePreference</class>
+<widget class="QWidget">
+ <property name="name">
+ <cstring>WebInterfacePreference</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>666</width>
+ <height>883</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>500</width>
+ <height>350</height>
+ </size>
+ </property>
+ <property name="caption">
+ <string>Search Preferences</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup" row="0" column="0">
+ <property name="name">
+ <cstring>buttonGroup1</cstring>
+ </property>
+ <property name="title">
+ <string>Web Server</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Port:</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>port</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>8080</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>forward</cstring>
+ </property>
+ <property name="text">
+ <string>Forward port</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>54</width>
+ <height>21</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Session TTL (in sec):</string>
+ </property>
+ </widget>
+ <widget class="KIntSpinBox">
+ <property name="name">
+ <cstring>sessionTTL</cstring>
+ </property>
+ <property name="maxValue">
+ <number>100000</number>
+ </property>
+ <property name="minValue">
+ <number>1</number>
+ </property>
+ <property name="lineStep">
+ <number>100</number>
+ </property>
+ <property name="value">
+ <number>3600</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="1" column="0">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="text">
+ <string>Select interface:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>interfaceSkinBox</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="3" column="0">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="text">
+ <string>Username:</string>
+ </property>
+ </widget>
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>username</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QPushButton" row="0" column="1">
+ <property name="name">
+ <cstring>btnPassword</cstring>
+ </property>
+ <property name="text">
+ <string>Change password ...</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Php executable path:</string>
+ </property>
+ </widget>
+ <widget class="KURLRequester">
+ <property name="name">
+ <cstring>phpExecutablePath</cstring>
+ </property>
+ </widget>
+ <widget class="KLed">
+ <property name="name">
+ <cstring>kled</cstring>
+ </property>
+ <property name="toolTip" stdset="0">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>btnPassword</sender>
+ <signal>clicked()</signal>
+ <receiver>WebInterfacePreference</receiver>
+ <slot>btnUpdate_clicked()</slot>
+ </connection>
+ <connection>
+ <sender>phpExecutablePath</sender>
+ <signal>textChanged(const QString&amp;)</signal>
+ <receiver>WebInterfacePreference</receiver>
+ <slot>changeLedState()</slot>
+ </connection>
+</connections>
+<slots>
+ <slot>btnUpdate_clicked()</slot>
+ <slot>changeLedState()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>knuminput.h</includehint>
+ <includehint>knuminput.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kurlrequester.h</includehint>
+ <includehint>klineedit.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kled.h</includehint>
+</includehints>
+</UI>
diff --git a/plugins/webinterface/webinterfaceprefpage.cpp b/plugins/webinterface/webinterfaceprefpage.cpp
new file mode 100644
index 0000000..20dbc97
--- /dev/null
+++ b/plugins/webinterface/webinterfaceprefpage.cpp
@@ -0,0 +1,60 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 "webinterfaceprefpage.h"
+#include "webinterfaceplugin.h"
+namespace kt
+{
+
+ WebInterfacePrefPage::WebInterfacePrefPage(WebInterfacePlugin* plugin)
+ : PrefPageInterface(i18n("WebInterface"), i18n("WebInterface Options"),
+ KGlobal::iconLoader()->loadIcon("toggle_log",KIcon::NoGroup))
+ {
+ m_widget = 0;
+ w_plugin=plugin;
+ }
+
+
+ WebInterfacePrefPage::~WebInterfacePrefPage()
+ {}
+
+ bool WebInterfacePrefPage::apply()
+ {
+ if(m_widget)
+ m_widget->apply();
+ w_plugin->preferencesUpdated();
+ return true;
+ }
+
+ void WebInterfacePrefPage::createWidget(QWidget* parent)
+ {
+ m_widget = new WebInterfacePrefWidget(parent);
+ }
+
+ void WebInterfacePrefPage::updateData()
+ {
+ }
+
+ void WebInterfacePrefPage::deleteWidget()
+ {
+ if(m_widget)
+ delete m_widget;
+ }
+}
diff --git a/plugins/webinterface/webinterfaceprefpage.h b/plugins/webinterface/webinterfaceprefpage.h
new file mode 100644
index 0000000..a10f1c9
--- /dev/null
+++ b/plugins/webinterface/webinterfaceprefpage.h
@@ -0,0 +1,55 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 WEBINTERFACEPREFPAGE_H
+#define WEBINTERFACEPREFPAGE_H
+#include <interfaces/prefpageinterface.h>
+#include "webinterfaceprefwidget.h"
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+namespace kt
+{
+
+ /**
+ * WebInterface plugin preferences page
+ * @author Diego R. Brogna <dierbro@gmail.com>
+ */
+ class WebInterfacePlugin;
+ class WebInterfacePrefPage : public PrefPageInterface
+ {
+ public:
+ WebInterfacePrefPage(WebInterfacePlugin* plugin);
+ virtual ~WebInterfacePrefPage();
+
+ virtual bool apply();
+ virtual void createWidget(QWidget* parent);
+ virtual void updateData();
+ virtual void deleteWidget();
+
+ private:
+ WebInterfacePrefWidget* m_widget;
+ WebInterfacePlugin* w_plugin;
+ };
+
+}
+
+#endif
diff --git a/plugins/webinterface/webinterfaceprefwidget.cpp b/plugins/webinterface/webinterfaceprefwidget.cpp
new file mode 100644
index 0000000..fc11d89
--- /dev/null
+++ b/plugins/webinterface/webinterfaceprefwidget.cpp
@@ -0,0 +1,137 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 "webinterfaceprefwidget.h"
+#include "webinterfacepluginsettings.h"
+
+#include <klocale.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kstandarddirs.h>
+
+#include <qwidget.h>
+#include <qstring.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <knuminput.h>
+#include <kurlrequester.h>
+#include <klineedit.h>
+#include <kpassdlg.h>
+#include <kmdcodec.h>
+#include <kled.h>
+#include <qtooltip.h>
+
+#include <net/portlist.h>
+#include <torrent/globals.h>
+using namespace bt;
+namespace kt
+{
+
+WebInterfacePrefWidget::WebInterfacePrefWidget(QWidget *parent, const char *name):WebInterfacePreference(parent,name)
+{
+ port->setValue(WebInterfacePluginSettings::port());
+ forward->setChecked(WebInterfacePluginSettings::forward());
+ sessionTTL->setValue(WebInterfacePluginSettings::sessionTTL());
+
+ QStringList dirList=KGlobal::instance()->dirs()->findDirs("data", "ktorrent/www");
+ QDir d(*(dirList.begin()));
+ QStringList skinList=d.entryList(QDir::Dirs);
+ for ( QStringList::Iterator it = skinList.begin(); it != skinList.end(); ++it ){
+ if(*it=="." || *it=="..")
+ continue;
+ interfaceSkinBox->insertItem(*it);
+ }
+
+ interfaceSkinBox->setCurrentText (WebInterfacePluginSettings::skin());
+
+ if(WebInterfacePluginSettings::phpExecutablePath().isEmpty()){
+ QString phpPath=KStandardDirs::findExe("php");
+ if(phpPath==QString::null)
+ phpPath=KStandardDirs::findExe("php-cli");
+
+ if(phpPath==QString::null)
+ phpExecutablePath->setURL (i18n("Php executable is not in default path, please enter the path manually"));
+ else
+ phpExecutablePath->setURL (phpPath);
+ }
+ else
+ phpExecutablePath->setURL (WebInterfacePluginSettings::phpExecutablePath());
+
+ username->setText(WebInterfacePluginSettings::username());
+}
+
+bool WebInterfacePrefWidget::apply()
+{
+ if(WebInterfacePluginSettings::port()==port->value()){
+ if(forward->isChecked())
+ bt::Globals::instance().getPortList().addNewPort(port->value(),net::TCP,true);
+ else
+ bt::Globals::instance().getPortList().removePort(port->value(),net::TCP);
+ }
+ WebInterfacePluginSettings::setPort(port->value () );
+ WebInterfacePluginSettings::setForward(forward->isChecked());
+ WebInterfacePluginSettings::setSessionTTL(sessionTTL->value () );
+ WebInterfacePluginSettings::setSkin(interfaceSkinBox->currentText());
+ WebInterfacePluginSettings::setPhpExecutablePath(phpExecutablePath->url () );
+ if(!username->text().isEmpty() && !password.isEmpty()){
+ WebInterfacePluginSettings::setUsername(username->text() );
+ KMD5 context(password);
+ WebInterfacePluginSettings::setPassword(context.hexDigest().data());
+ }
+
+ WebInterfacePluginSettings::writeConfig();
+ return true;
+}
+
+void WebInterfacePrefWidget::btnUpdate_clicked()
+{
+ QCString passwd;
+ int result = KPasswordDialog::getNewPassword(passwd, i18n("Please enter a new password for the web interface."));
+ if (result == KPasswordDialog::Accepted)
+ password=passwd;
+
+}
+
+void WebInterfacePrefWidget::changeLedState()
+{
+ QFileInfo fi(phpExecutablePath->url());
+ if(fi.isExecutable() && (fi.isFile() || fi.isSymLink())){
+ QToolTip::add( kled, i18n("%1 exists and it is executable").arg(phpExecutablePath->url()));
+ kled->setColor(green);
+ }
+ else if (!fi.exists()){
+ QToolTip::add( kled, i18n("%1 does not exist").arg(phpExecutablePath->url()) );
+ kled->setColor(red);
+ }
+ else if (!fi.isExecutable()){
+ QToolTip::add( kled, i18n("%1 is not executable").arg(phpExecutablePath->url()) );
+ kled->setColor(red);
+ }
+ else if (fi.isDir()){
+ QToolTip::add( kled, i18n("%1 is a directory").arg(phpExecutablePath->url()) );
+ kled->setColor(red);
+ }
+ else{
+ QToolTip::add( kled, i18n("%1 is not php executable path").arg(phpExecutablePath->url()) );
+ kled->setColor(red);
+ }
+}
+}
+#include "webinterfaceprefwidget.moc"
diff --git a/plugins/webinterface/webinterfaceprefwidget.h b/plugins/webinterface/webinterfaceprefwidget.h
new file mode 100644
index 0000000..b328efe
--- /dev/null
+++ b/plugins/webinterface/webinterfaceprefwidget.h
@@ -0,0 +1,41 @@
+ /***************************************************************************
+ * Copyright (C) 2006 by Diego R. Brogna *
+ * dierbro@gmail.com *
+ * *
+ * 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 WEBINTERFACEPREFWIDGET_H
+#define WEBINTERFACEPREFWIDGET_H
+
+#include "webinterfacepref.h"
+namespace kt
+{
+
+ class WebInterfacePrefWidget:public WebInterfacePreference
+ {
+ Q_OBJECT
+ public:
+ WebInterfacePrefWidget(QWidget *parent = 0, const char *name = 0);
+ bool apply();
+ QCString password;
+ public slots:
+ void btnUpdate_clicked();
+ void changeLedState();
+ };
+
+}
+#endif
diff --git a/plugins/webinterface/www/Makefile.am b/plugins/webinterface/www/Makefile.am
new file mode 100644
index 0000000..8a92573
--- /dev/null
+++ b/plugins/webinterface/www/Makefile.am
@@ -0,0 +1,5 @@
+METASOURCES = AUTO
+SUBDIRS = default mobile coldmilk
+
+
+
diff --git a/plugins/webinterface/www/coldmilk/Makefile.am b/plugins/webinterface/www/coldmilk/Makefile.am
new file mode 100644
index 0000000..d6a5f08
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/Makefile.am
@@ -0,0 +1,8 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/coldmilk
+
+ktdata_DATA = favicon.ico icon.png interface.js interface.php login.html page_update.js rest.php shutdown.php style.css
+
+SUBDIRS= icons
diff --git a/plugins/webinterface/www/coldmilk/favicon.ico b/plugins/webinterface/www/coldmilk/favicon.ico
new file mode 100644
index 0000000..3213b23
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/favicon.ico
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icon.png b/plugins/webinterface/www/coldmilk/icon.png
new file mode 100644
index 0000000..6cb2185
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icon.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/16x16/Makefile.am b/plugins/webinterface/www/coldmilk/icons/16x16/Makefile.am
new file mode 100644
index 0000000..7380c25
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/16x16/Makefile.am
@@ -0,0 +1,6 @@
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/coldmilk/icons/16x16/
+
+ktdata_DATA = edit_user.png high_priority.png low_priority.png normal_priority.png only_seed.png
+
diff --git a/plugins/webinterface/www/coldmilk/icons/16x16/edit_user.png b/plugins/webinterface/www/coldmilk/icons/16x16/edit_user.png
new file mode 100644
index 0000000..9e5173f
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/16x16/edit_user.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/16x16/high_priority.png b/plugins/webinterface/www/coldmilk/icons/16x16/high_priority.png
new file mode 100644
index 0000000..bcde52b
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/16x16/high_priority.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/16x16/low_priority.png b/plugins/webinterface/www/coldmilk/icons/16x16/low_priority.png
new file mode 100644
index 0000000..966e22b
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/16x16/low_priority.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/16x16/normal_priority.png b/plugins/webinterface/www/coldmilk/icons/16x16/normal_priority.png
new file mode 100644
index 0000000..d39228b
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/16x16/normal_priority.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/16x16/only_seed.png b/plugins/webinterface/www/coldmilk/icons/16x16/only_seed.png
new file mode 100644
index 0000000..254d74a
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/16x16/only_seed.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/22x22/Makefile.am b/plugins/webinterface/www/coldmilk/icons/22x22/Makefile.am
new file mode 100644
index 0000000..2bd411f
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/22x22/Makefile.am
@@ -0,0 +1,6 @@
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/coldmilk/icons/22x22/
+
+ktdata_DATA = exit.png ktstart_all.png ktstop_all.png remove.png start.png stop.png
+
diff --git a/plugins/webinterface/www/coldmilk/icons/22x22/exit.png b/plugins/webinterface/www/coldmilk/icons/22x22/exit.png
new file mode 100644
index 0000000..7ca3753
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/22x22/exit.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/22x22/ktstart_all.png b/plugins/webinterface/www/coldmilk/icons/22x22/ktstart_all.png
new file mode 100644
index 0000000..1c55069
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/22x22/ktstart_all.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/22x22/ktstop_all.png b/plugins/webinterface/www/coldmilk/icons/22x22/ktstop_all.png
new file mode 100644
index 0000000..8086b69
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/22x22/ktstop_all.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/22x22/remove.png b/plugins/webinterface/www/coldmilk/icons/22x22/remove.png
new file mode 100644
index 0000000..3da332f
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/22x22/remove.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/22x22/start.png b/plugins/webinterface/www/coldmilk/icons/22x22/start.png
new file mode 100644
index 0000000..c7995a0
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/22x22/start.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/22x22/stop.png b/plugins/webinterface/www/coldmilk/icons/22x22/stop.png
new file mode 100644
index 0000000..5b59e46
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/22x22/stop.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/32x32/Makefile.am b/plugins/webinterface/www/coldmilk/icons/32x32/Makefile.am
new file mode 100644
index 0000000..a2b93df
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/32x32/Makefile.am
@@ -0,0 +1,6 @@
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/coldmilk/icons/32x32/
+
+ktdata_DATA = configure.png extender_opened.png fileopen.png folder1.png
+
diff --git a/plugins/webinterface/www/coldmilk/icons/32x32/configure.png b/plugins/webinterface/www/coldmilk/icons/32x32/configure.png
new file mode 100644
index 0000000..b45d80a
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/32x32/configure.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/32x32/extender_opened.png b/plugins/webinterface/www/coldmilk/icons/32x32/extender_opened.png
new file mode 100644
index 0000000..b8e652b
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/32x32/extender_opened.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/32x32/fileopen.png b/plugins/webinterface/www/coldmilk/icons/32x32/fileopen.png
new file mode 100644
index 0000000..e4064bb
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/32x32/fileopen.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/32x32/folder1.png b/plugins/webinterface/www/coldmilk/icons/32x32/folder1.png
new file mode 100644
index 0000000..f1a0279
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/32x32/folder1.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/48x48/Makefile.am b/plugins/webinterface/www/coldmilk/icons/48x48/Makefile.am
new file mode 100644
index 0000000..9318a0c
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/48x48/Makefile.am
@@ -0,0 +1,6 @@
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/coldmilk/icons/48x48/
+
+ktdata_DATA = exit.png switchuser.png
+
diff --git a/plugins/webinterface/www/coldmilk/icons/48x48/exit.png b/plugins/webinterface/www/coldmilk/icons/48x48/exit.png
new file mode 100644
index 0000000..fd44eb0
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/48x48/exit.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/48x48/switchuser.png b/plugins/webinterface/www/coldmilk/icons/48x48/switchuser.png
new file mode 100644
index 0000000..e85c801
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/48x48/switchuser.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/64x64/Makefile.am b/plugins/webinterface/www/coldmilk/icons/64x64/Makefile.am
new file mode 100644
index 0000000..3ff3ae0
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/64x64/Makefile.am
@@ -0,0 +1,6 @@
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/coldmilk/icons/64x64/
+
+ktdata_DATA = down.png folder1_man.png looknfeel.png
+
diff --git a/plugins/webinterface/www/coldmilk/icons/64x64/down.png b/plugins/webinterface/www/coldmilk/icons/64x64/down.png
new file mode 100644
index 0000000..a855ecc
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/64x64/down.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/64x64/folder1_man.png b/plugins/webinterface/www/coldmilk/icons/64x64/folder1_man.png
new file mode 100644
index 0000000..a0951d6
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/64x64/folder1_man.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/64x64/looknfeel.png b/plugins/webinterface/www/coldmilk/icons/64x64/looknfeel.png
new file mode 100644
index 0000000..2d2bba2
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/64x64/looknfeel.png
Binary files differ
diff --git a/plugins/webinterface/www/coldmilk/icons/Makefile.am b/plugins/webinterface/www/coldmilk/icons/Makefile.am
new file mode 100644
index 0000000..cbe7db5
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/icons/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= 16x16 22x22 32x32 48x48 64x64
diff --git a/plugins/webinterface/www/coldmilk/interface.js b/plugins/webinterface/www/coldmilk/interface.js
new file mode 100644
index 0000000..2f361a5
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/interface.js
@@ -0,0 +1,44 @@
+ function validate(action)
+ {
+ var msg;
+ if (action == "remove_torrent") {
+ msg = "Are you sure that you want remove this torrent?";
+ }
+ else if (action == "quit_program") {
+ msg = "Are you sure you want to quit ktorrent?";
+ }
+ else {
+ msg = "Do it?";
+ }
+ return confirm(msg);
+ };
+
+ function show(id)
+ {
+ var items = new Array();
+ items[0] = "torrent_list";
+ items[1] = "torrents_details";
+ items[2] = "preferences";
+ items[3] = "torrent_add";
+ items[4] = "action";
+
+ hide_divs(items);
+
+
+ // Show selected
+ var item_show = document.getElementById(id);
+ item_show.style.display = "";
+
+ };
+
+ function hide_divs(items) {
+ for (var i in items) {
+ var item_hide = document.getElementById(items[i]);
+ if (item_hide != null && !item_hide.style.display) { // not means it's showing..
+ item_hide.style.display = "none";
+ }
+ }
+ return true;
+ }
+
+
diff --git a/plugins/webinterface/www/coldmilk/interface.php b/plugins/webinterface/www/coldmilk/interface.php
new file mode 100644
index 0000000..246f347
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/interface.php
@@ -0,0 +1,251 @@
+<?php
+ $refresh_rate = 5;
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <title>ktorrent web interface</title>
+ <link rel="stylesheet" href="style.css" type="text/css" />
+ <meta name="GENERATOR" content="Quanta Plus" />
+ <meta http-equiv="Content-Type" content="text/html"/>
+ <script type="text/javascript" src="page_update.js"></script>
+ <script type="text/javascript" src="interface.js"></script>
+
+</head>
+<body onload="update_interval(<?php echo $refresh_rate; ?>);">
+
+
+<div id="header">
+ <div id="logout">
+ <img src="icons/16x16/edit_user.png" alt="logout" /> <a href="login.html">Sign out</a>
+ </div>
+
+ <a href="interface.php">
+ <img src="icon.png" alt="reload" title="reload"
+ id="header_icon" />
+ </a>
+
+ <ul>
+ <li>
+ <img src="icons/32x32/folder1.png" alt="icon" />
+ <a href="javascript:show('torrent_list');">Torrents</a>
+ </li>
+ <li>
+ <img src="icons/32x32/configure.png" alt="icon" />
+ <a href="javascript:show('preferences');">Preferences</a>
+ </li>
+
+ <li>
+ <img src="icons/32x32/fileopen.png" alt="icon" />
+ <a href="javascript:show('torrent_add');">Add torrent</a>
+ </li>
+ <li>
+ <img src="icons/32x32/extender_opened.png" alt="exit" />
+ <a href="javascript:show('action');">Action</a>
+ </li>
+ </ul>
+
+ <div id="status_bar">
+ <table id="status_bar_table"><tr><td></td></tr></table>
+ </div>
+</div>
+
+
+<!-- Torrents -->
+<div id="torrent_list">
+ <table id="torrent_list_table" class="list_table">
+ <tr><td></td></tr><!--let's be XHTML valid-->
+ </table>
+
+ <div id="bottom-menu">
+ <ul>
+ <li>
+ <img src="icons/22x22/ktstart_all.png" alt="" />
+ <span>
+ <a href="interface.php?startall=true">Start all</a>
+ </span>
+ </li>
+ <li>
+ <img src="icons/22x22/ktstop_all.png" alt="" />
+ <span>
+ <a href="interface.php?stopall=true">Stop all</a>
+ </span>
+ </li>
+ </ul>
+
+ </div>
+
+</div>
+<!-- end torrents -->
+
+
+<!-- Torrent's details -->
+<div id="torrents_details" style="display : none;">
+ <table id="torrents_details_files" class="list_table">
+ <tr><td></td></tr><!--let's be XHTML valid-->
+ </table>
+</div>
+<!-- end torrent's details -->
+
+
+<!-- Preferences -->
+<div id="preferences" style="display : none;">
+ <h2>Preferences</h2>
+ <form action="interface.php" method="get">
+ <div class="simple_form">
+ <img src="icons/64x64/down.png" alt="" />
+
+ <h2>Downloads</h2>
+
+ <?php $globalinfo = globalinfo() ?>
+ <div class="item" style="margin-top : 0em;">
+ Upload speed:
+ <div class="option">
+ <input type="text" name="maximum_upload_rate"
+ value="<?php echo $globalinfo['max_upload_speed']; ?>" />
+ </div>
+ </div>
+
+ <div class="item">
+ Download speed:
+ <div class="option">
+ <input type="text" name="maximum_download_rate"
+ value="<?php echo $globalinfo['max_download_speed']; ?>" />
+ </div>
+ </div>
+
+ <div class="item">
+ Max downloads:
+ <div class="option">
+ <input type="text" name="maximum_downloads"
+ value="<?php echo $globalinfo['max_downloads']; ?>" />
+ </div>
+ </div>
+
+ <div class="item">
+ Max seeds
+ <div class="option">
+ <div style="display : inline;">
+ <input type="text" name="maximum_seeds"
+ value="<?php echo $globalinfo['max_seeds']; ?>" />
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="simple_form" style="margin-top : 1em;" >
+ <img src="icons/64x64/looknfeel.png" alt="" />
+
+ <h2>Web interface</h2>
+
+ <div class="hints">
+ Note: Disabled for now. If you insist, change $refresh_rate in the file interface.php
+ </div>
+
+ <div class="item">
+ <?php
+ $refresh_options = array(
+ '2' => '2 seconds',
+ '3' => '3 seconds',
+ '5' => '5 seconds',
+ '10' => '10 seconds',
+ '30' => '30 seconds',
+ '0' => 'never'
+ );
+ echo 'Update rate:';
+ echo '<div class="option">';
+ echo '<select name="refresh_rate" disabled="disabled">';
+ foreach(array_keys($refresh_options) as $value) {
+ echo '<option value="'.$value.'"';
+ if ($refresh_rate == $value) {
+ echo ' selected="selected"';
+ }
+ echo '>'.$refresh_options[$value].'</option>';
+ }
+ echo '</select>';
+ echo '</div>';
+ ?>
+ </div>
+
+ </div>
+
+ <div style="margin-top : 1em; float : left; clear : both;">
+ <input type="submit" value="Submit preferences" class="buttons"/>
+ </div>
+ </form>
+</div>
+<!-- end preferences -->
+
+
+<!-- Add Torrent -->
+<div id="torrent_add" style="display : none;">
+ <h2>Add a torrent</h2>
+
+ <div class="simple_form">
+ <img src="icons/64x64/folder1_man.png" alt="" />
+ <h3>Load a torrent</h3>
+
+ <form action="interface.php" method="get">
+ <div class="item">
+ URL:
+ <div class="option">
+ <input type="text" name="load_torrent" style="width : 240px;" />
+ <br /><span>Example: http://ktorrent.org/down/latest.torrent</span>
+
+ <div style="margin-top : 1em;">
+ <input type="submit" value="Load Torrent" />
+ </div>
+ </div>
+ </div>
+ </form>
+
+ <h3 style="margin-top : 6em;">Upload a torrent</h3>
+
+ <form action="interface.php" method="post" enctype="multipart/form-data">
+ <div class="item" style="min-height : 5em;">
+ File path:
+ <div class="option">
+ <div style="display : inline;">
+ <input type="file" name="load_torrent" style="width:240px;" />
+ </div>
+
+ <div style="margin-top : 1em;">
+ <input type="submit" name="Upload Torrent" value="Upload Torrent" />
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+</div>
+<!-- end add torrent -->
+
+
+<!-- Action -->
+<div id="action" style="display : none;">
+ <h2 style="margin-top : 0; padding-top : 0;">Actions</h2>
+ <ul>
+ <li>
+ <img src="icons/48x48/switchuser.png" alt="sign out" />
+ <span style="margin-left : 52px;">
+ <a href="login.html">Sign out</a></span>
+
+
+ </li>
+
+ <li>
+ <img src="icons/48x48/exit.png" alt="quit" />
+ <span style="margin-left : 52px;">
+ <a href="shutdown.php?quit=quit" onclick="return validate('quit_program')">
+ Quit program
+ </a></span>
+ </li>
+
+ </ul>
+
+</div>
+<!-- end action -->
+
+
+</body>
+</html>
diff --git a/plugins/webinterface/www/coldmilk/login.html b/plugins/webinterface/www/coldmilk/login.html
new file mode 100644
index 0000000..fa95faf
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/login.html
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <title>ktorrent - web interface</title>
+ <link rel="stylesheet" href="style.css" type="text/css" />
+ <meta name="GENERATOR" content="Quanta Plus" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+ <script type="text/javascript">
+ function focus_login() {
+ document.forms["login_form"].elements["username"].focus();
+ }
+ </script>
+</head>
+<body onload="focus_login();">
+
+
+
+<form action="interface.php" method="post" id="login_form">
+<div class="simple_form">
+
+ <img src="icon.png" alt="logo"
+ id="icon_right" />
+
+ <h2>Log in</h2>
+
+
+ <div class="item" style="margin-top : 0em;">
+ Username:
+ <div class="option">
+ <input type="text" name="username" />
+ </div>
+ </div>
+
+ <div class="item" style="min-height : 6em;">
+ Password:
+ <div class="option">
+ <div style="display : inline;">
+ <input type="password" name="password" />
+ </div>
+
+ <div style="margin-top : 1em;">
+ <input type="submit" name="Login" value="Sign in" />
+ </div>
+ </div>
+ </div>
+
+
+
+</div>
+</form>
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/webinterface/www/coldmilk/page_update.js b/plugins/webinterface/www/coldmilk/page_update.js
new file mode 100644
index 0000000..c004456
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/page_update.js
@@ -0,0 +1,429 @@
+ /***************************************************************************
+ * Copyright (C) 2007 by Dagur Valberg Johannsson *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+var details_of_torrent = null; //id of torrent which details are displayed
+
+function update_interval(time) {
+ update_all();
+ if (!time) {
+ return;
+ }
+ var seconds = time * 1000;
+ window.setInterval(update_all, seconds);
+}
+
+function update_all() {
+ fetch_xml("rest.php?global_status", new Array("update_status_bar", "update_title"));
+ fetch_xml("rest.php?download_status", new Array("update_torrent_table"));
+}
+
+function fetch_xml(url, callback_functions) {
+ var request = false;
+
+ if (window.XMLHttpRequest) { // most browsers
+ request = new XMLHttpRequest();
+// if (request.overrideMimeType) {
+// request.overrideMimeType('text/xml');
+// }
+ }
+
+ else if (window.ActiveXObject) { //ie
+ try {
+ request = new ActiveXObject("Msxml2.XMLHTTP");
+ }
+ catch(e) {
+ try { request = new ActiveXObject("Microsoft.XMLHTTP"); }
+ catch(e) { }
+ }
+ }
+
+ if (!request) {
+ // Browser doesn't support XMLHttpRequest
+ return false;
+ }
+ request.onreadystatechange = function() {
+ if (request.readyState == 4) {
+ if (request.status == 200) {
+ //overrideMimeType didn't work in Konqueror,
+ //so we'll have to parse the response into XML
+ //object ourselfs. responseXML won't work.
+ var xmlstring = request.responseText;
+ var xmldoc;
+ if (window.DOMParser) {
+ xmldoc = (new DOMParser())
+ .parseFromString(xmlstring, "text/xml");
+ }
+ else if (window.ActiveXObject) { //ie
+ xmldoc = new ActiveXObject("Microsoft.XMLDOM");
+ xmldoc.async = false;
+ xmldoc.loadXML(xmlstring);
+ }
+
+ for (var i in callback_functions) {
+ eval(callback_functions[i] + "(xmldoc)");
+ }
+
+ }
+ else {
+ // could not fetch
+ }
+ }
+ }
+
+ request.open('GET', url, true);
+ request.send(null);
+}
+
+function update_title(xmldoc) {
+ var down = _get_text(xmldoc, 'download_speed').data;
+ var up = _get_text(xmldoc, 'upload_speed').data;
+ var new_title = "(D: " + down + ") (U: " + up + ") - ktorrent web interface";
+ document.title = new_title;
+}
+
+function update_status_bar(xmldoc) {
+ var newtable = document.createElement('table');
+ newtable.setAttribute('id', 'status_bar_table');
+
+
+ //dht and encryption
+ {
+ var row = newtable.insertRow(0);
+ var cell = row.insertCell(0);
+ var dht = _get_text_from_attribute(xmldoc, 'dht', 'status').data;
+ var encryption = _get_text_from_attribute(xmldoc, 'encryption', 'status').data;
+ cell.appendChild(
+ document.createTextNode("DHT : " +dht));
+ cell = row.insertCell(1);
+ cell.appendChild(
+ document.createTextNode("Encryption : " + encryption));
+ }
+ //speed down/up
+ {
+ var row = newtable.insertRow(1);
+ var cell = row.insertCell(0);
+ cell.appendChild(
+ document.createTextNode("Speed"));
+
+ cell = row.insertCell(1);
+ var down = _get_text(xmldoc, 'download_speed').data;
+ var up = _get_text(xmldoc, 'upload_speed').data;
+ cell.appendChild(
+ document.createTextNode("down: " + down + " / up: " + up));
+ }
+ //transferred
+ {
+ var row = newtable.insertRow(2);
+ var cell = row.insertCell(0);
+ cell.appendChild(
+ document.createTextNode("Transferred"));
+
+ cell = row.insertCell(1);
+ var down = _get_text(xmldoc, 'downloaded_total').data;
+ var up = _get_text(xmldoc, 'uploaded_total').data;
+ cell.appendChild(
+ document.createTextNode("down: " + down + " / up: " + up));
+ }
+ var oldtable = document.getElementById('status_bar_table');
+ oldtable.parentNode.replaceChild(newtable, oldtable);
+}
+
+function update_torrent_table(xmldoc) {
+
+ var newtable = document.createElement('table');
+ newtable.setAttribute('id', 'torrent_list_table');
+ newtable.className='list_table';
+
+ var torrents = xmldoc.getElementsByTagName('torrent');
+ var i = 0;
+ while (torrents[i]) {
+ _torrent_table_row(torrents[i], newtable, i);
+ i++;
+ }
+ _torrent_table_header(newtable.insertRow(0));
+
+ var oldtable = document.getElementById('torrent_list_table');
+ oldtable.parentNode.replaceChild(newtable, oldtable);
+}
+
+function _torrent_table_row(torrent, table, i) {
+ var row = table.insertRow(i);
+ var row_color = (i % 2) ?
+ "#ffffff" : "#dce4f9";
+ row.setAttribute("style", "background-color : " + row_color);
+
+ //actions
+ {
+ var cell = row.insertCell(0);
+ var can_start = (_get_text(torrent, 'running').data) ? 0 : 1; //if torrent is running we can't start it
+ var can_stop = (can_start==1) ? 0 : 1; //opposite of can_start
+ var start_button = _create_action_button('Start', 'start.png', (can_start==1) ? 'start='+i : '');
+ var stop_button = _create_action_button('Stop', 'stop.png', (can_stop==1) ? 'stop='+i : '');
+ var remove_button = _create_action_button('Remove', 'remove.png', 'remove='+i);
+ remove_button.setAttribute("onclick", "return validate('remove_torrent')");
+
+ cell.appendChild(start_button);
+ cell.appendChild(stop_button);
+ cell.appendChild(remove_button);
+ }
+
+ //file
+ {
+ var cell = row.insertCell(1);
+ var file = document.createElement('a');
+ file.setAttribute('href', '#');
+ file.appendChild(_get_text(torrent, 'name'));
+ file.onclick = function()
+ {
+ show('torrents_details');
+ fetch_xml("rest.php?torrents_details="+i, new Array("get_torrents_details"));
+ details_of_torrent = i;
+ };
+ cell.appendChild(file);
+ }
+
+ //status
+ {
+ var cell = row.insertCell(2);
+ cell.appendChild(
+ _get_text(torrent, 'status'));
+ }
+
+ //speed
+ {
+ var cell = row.insertCell(3);
+
+ cell.appendChild(
+ _get_text(torrent, 'download_rate'));
+ cell.appendChild(document.createElement('br'));
+ cell.appendChild(
+ _get_text(torrent, 'upload_rate'));
+ }
+
+ //size
+ {
+ var cell = row.insertCell(4);
+ cell.appendChild(
+ _get_text(torrent, 'size'));
+ }
+
+ //peers
+ {
+ var cell = row.insertCell(5);
+ cell.appendChild(
+ _get_text(torrent, 'peers'));
+ }
+
+ //transferred
+ {
+ var cell = row.insertCell(6);
+
+ cell.appendChild(
+ _get_text(torrent, 'downloaded'));
+ cell.appendChild(document.createElement('br'));
+ cell.appendChild(
+ _get_text(torrent, 'uploaded'));
+ }
+
+ //done
+ {
+ var cell = row.insertCell(7);
+ cell.setAttribute("style", "padding-right : 2px;");
+
+ var percent_done
+ = _get_text_from_attribute(torrent, 'downloaded', 'percent').data;
+
+ var bar = document.createElement('div');
+ bar.setAttribute("class", "percent_bar");
+ bar.setAttribute("style", "width : " + percent_done + "%;");
+ cell.appendChild(bar);
+
+ var bar_text = document.createElement('div');
+ bar_text.appendChild(
+ document.createTextNode(percent_done + "%"));
+
+ bar.appendChild(bar_text);
+ }
+}
+
+//function called after changing file priority to refresh list of files (and priorities)
+function just_refresh_details(xmldoc) {
+ if (details_of_torrent!=null)
+ fetch_xml("rest.php?torrents_details="+details_of_torrent, new Array("get_torrents_details"));
+}
+
+function get_torrents_details(xmldoc) {
+ var newtable = document.createElement('table');
+ newtable.setAttribute('id', 'torrents_details_files');
+ newtable.className='list_table';
+
+ var id = xmldoc.getElementsByTagName('torrents_details')[0].getAttribute('id');
+ var files = xmldoc.getElementsByTagName('file');
+ for(var i=0; i<files.length; i++)
+ {
+ var row = newtable.insertRow(i);
+ row.style.backgroundColor=(i % 2) ? '#ffffff' : '#dce4f9';
+ var cell = row.insertCell(-1);
+
+ var file_status = _get_text(files[i], 'status').data;
+ var command; //we call ?file_xx - this call is detected by server and priority is being changed
+
+ command = (file_status==50)?'':'rest.php?file_hp='+id+'-'+i;
+ var high_prior = _create_file_action_button('/icons/16x16/high_priority.png', 'High Priority', command);
+ cell.appendChild(high_prior);
+
+ command = (file_status==40)?'':'rest.php?file_np='+id+'-'+i;
+ var normal_prior = _create_file_action_button('/icons/16x16/normal_priority.png', 'Normal Priority', command);
+ cell.appendChild(normal_prior);
+
+ command = (file_status==30)?'':'rest.php?file_lp='+id+'-'+i;
+ var low_prior = _create_file_action_button('/icons/16x16/low_priority.png', 'Low Priority', command);
+ cell.appendChild(low_prior);
+
+ command = (file_status==20 || file_status==10)?'':'rest.php?file_stop='+id+'-'+i;
+ var dnd = _create_file_action_button('/icons/16x16/only_seed.png', 'Stop downloading (Only Seed Priority)', command);
+ cell.appendChild(dnd);
+
+ var cell = row.insertCell(-1);
+ cell.appendChild(_get_text(files[i], 'name'));
+ var cell = row.insertCell(-1);
+ cell.appendChild(_get_text(files[i], 'size'));
+ var cell = row.insertCell(-1);
+
+ if (_get_text(files[i], 'perc_done').data!='')
+ cell.appendChild(_get_text(files[i], 'perc_done'));
+ else
+ cell.appendChild(document.createTextNode("0"));
+ cell.appendChild(document.createTextNode("%"));
+ var cell = row.insertCell(-1);
+
+ cell.appendChild(document.createTextNode(_get_file_status_name(file_status)));
+ }
+
+ _torrents_details_header(newtable.insertRow(0));
+
+ /*var torrents = xmldoc.getElementsByTagName('torrent');
+ var i = 0;
+ while (torrents[i]) {
+ _torrent_table_row(torrents[i], newtable, i);
+ i++;
+ }
+ _torrent_table_header(newtable.insertRow(0));*/
+
+ var oldtable = document.getElementById('torrents_details_files');
+ oldtable.parentNode.replaceChild(newtable, oldtable);
+}
+
+function _create_action_button(button_name, image_src, command) {
+ var image = document.createElement("img");
+ image.setAttribute("src", "icons/22x22/" + image_src);
+ image.setAttribute("alt", button_name);
+ image.setAttribute("title", button_name);
+ if (command != '')
+ {
+ var a = document.createElement("a");
+ a.setAttribute("href", "interface.php?" + command);
+ a.appendChild(image);
+ return a;
+ }
+ else
+ return image;
+}
+
+function _create_file_action_button(img_src, img_alt, command) {
+ var image = document.createElement("img");
+ image.setAttribute("src", img_src);
+ image.setAttribute("alt", img_alt);
+ image.setAttribute("title", img_alt);
+ if (command != '')
+ {
+ var a = document.createElement("a");
+ a.setAttribute("href", "#");
+ a.onclick = function()
+ {
+ fetch_xml(command, new Array("just_refresh_details"));
+ };
+ a.appendChild(image);
+ return a;
+ }
+ else
+ return image;
+}
+
+// gets element with given tag and crates text node from it
+function _get_text(element, tag) {
+ var text_node;
+ try {
+ text_node = document.createTextNode(
+ element.getElementsByTagName(tag)[0].firstChild.data);
+ }
+ catch (e) {
+ text_node = document.createTextNode('');
+ }
+ return text_node;
+}
+
+function _get_text_from_attribute(element, tag, attribute) {
+ var text_node;
+ try {
+ text_node = document.createTextNode(
+ element.getElementsByTagName(tag)[0].getAttribute(attribute));
+ }
+ catch (e) {
+ text_node = document.createTextNode('');
+ }
+ return text_node;
+}
+
+function _get_file_status_name(status_id)
+{
+ if (status_id==60) return 'PREVIEW_PRIORITY';
+ else if (status_id==50) return 'Download First';
+ else if (status_id==40) return 'Download Normally';
+ else if (status_id==30) return 'Download Last';
+ else if (status_id==20) return 'Only Seed';
+ else if (status_id==10) return 'Do Not Download';
+ else return 'Not supported file status';
+}
+
+function _torrents_details_header(row) {
+ headers = new Array("Actions", "File", "Size", "Perc done", "Status");
+ for (var i in headers) {
+ var header = document.createElement("th");
+ header.appendChild(document.createTextNode(headers[i]));
+ row.appendChild(header);
+ }
+ return row;
+}
+
+function _torrent_table_header(row) {
+ headers = new Array(
+ "Actions", "File", "Status",
+ "Speed", "Size", "Peers",
+ "Transferred", "% done"
+ );
+
+ for (var i in headers) {
+ var header = document.createElement("th");
+ header.appendChild(
+ document.createTextNode(headers[i]));
+ row.appendChild(header);
+ }
+ return row;
+}
diff --git a/plugins/webinterface/www/coldmilk/rest.php b/plugins/webinterface/www/coldmilk/rest.php
new file mode 100644
index 0000000..bab7e68
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/rest.php
@@ -0,0 +1,265 @@
+<?php
+
+ /***************************************************************************
+ * Copyright (C) 2007 by Dagur Valberg Johannsson *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+/**
+ * Simple REST interface.
+ */
+
+$rest_commands = array(
+ "global_status",
+ "download_status",
+ "torrents_details"
+);
+
+if (!array_keys($_REQUEST)) {
+ header("Content-Type: text/html");
+ print "<html><body>
+ Usage: rest.php?command<br />
+ Available commands: ";
+ foreach ($rest_commands as $command)
+ print "$command ";
+
+ print "</body></html>";
+}
+
+else {
+ header("Content-Type: text/xml");
+ $rest = new RestInterface();
+ foreach($_REQUEST as $command=>$arg)
+ {
+ if (in_array($command, $rest_commands))
+ print $rest->$command($arg);
+ else
+ print "Unknown command " . htmlentities($command) . "<br />";
+
+ }
+}
+
+// classes
+
+class RestInterface {
+ public function global_status() {
+ $info = globalinfo();
+ $common = new Common();
+
+ $down_speed = $info['download_speed'];
+ $up_speed = $info['upload_speed'];
+
+ $down_total
+ = $common->bytes_to_readable($info['bytes_downloaded']);
+ $up_total
+ = $common->bytes_to_readable($info['bytes_uploaded']);
+
+ $dht = $info['dht_support'] ? "on" : "off";
+ $encryption = $info['use_encryption'] ? "on" : "off";
+
+ $xml = new KTorrentXML('status_bar');
+
+ $elements = array(
+ $xml->new_element('download_speed' , $down_speed),
+ $xml->new_element('upload_speed' , $up_speed),
+ $xml->new_element('downloaded_total', $down_total),
+ $xml->new_element('uploaded_total', $up_total),
+
+ $xml->new_element('dht', null, array('status' => $dht)),
+ $xml->new_element('encryption', null, array('status' => $encryption)),
+ );
+
+ foreach($elements as $element) {
+ $xml->append_to_root($element);
+ }
+
+ return $xml->saveXML();
+
+ }
+
+ public function download_status() {
+ $download_status = downloadstatus();
+ $xml = new KTorrentXML('download_status');
+ foreach($download_status as $torrent) {
+ $torrent_xml = $xml->new_element('torrent');
+ $xml->append_to_root($torrent_xml);
+
+// foreach(array_keys($torrent) as $key) {
+// $torrent_xml->appendChild(
+// $xml->new_element("raw_$key", $torrent[$key]));
+// }
+
+ $status = $torrent['status'];
+ $done = $torrent['bytes_downloaded'];
+ $total_bytes = $torrent['total_bytes_to_download'];
+ $bytes_left = $torrent['bytes_left_to_download'];
+ $elements = array(
+
+ $xml->new_element('name',
+ $this->_clean_name($torrent['torrent_name'])),
+
+ $xml->new_element('status',
+ $this->_torrent_status($status), array('id' => $status)),
+
+ $xml->new_element('running', $torrent['running']),
+ $xml->new_element('download_rate', $torrent['download_rate']." down"),
+ $xml->new_element('upload_rate', $torrent['upload_rate']." up"),
+ $xml->new_element('size', $torrent['total_bytes']),
+ $xml->new_element('peers', $torrent['num_peers']),
+ $xml->new_element('uploaded', $torrent['bytes_uploaded']." uploaded"),
+
+
+ $xml->new_element('downloaded',
+ "$done downloaded",
+ array('percent' => $this->_get_percent_done($total_bytes, $bytes_left))),
+ );
+
+ foreach($elements as $element) {
+ $torrent_xml->appendChild($element);
+ }
+ }
+
+ return $xml->saveXML();
+
+ }
+
+ public function torrents_details($torrent_id) {
+ $xml = new KTorrentXML('torrents_details', null, array('id'=>$torrent_id));
+ $download_status = downloadstatus();
+ if (isset($download_status[$torrent_id]))
+ foreach($download_status[$torrent_id]['files'] as $id=>$info)
+ {
+ $file_xml = $xml->new_element('file', '', array('id'=>$id));
+ $xml->append_to_root($file_xml);
+ foreach($info as $key=>$val)
+ $file_xml->appendChild($xml->new_element($key, $val));
+ }
+ return $xml->saveXML();
+ }
+
+ // Helper function for download_status
+ private function _torrent_status($status_id) {
+ $status = array(
+ 0 => "Not started",
+ 1 => "Seeding Complete",
+ 2 => "Download Complete",
+ 3 => "Seeding",
+ 4 => "Downloading",
+ 5 => "Stalled",
+ 6 => "Stopped",
+ 7 => "Allocating Diskspace",
+ 8 => "Error",
+ 9 => "Queued",
+ 10 => "Checking Data"
+ );
+
+ return $status[$status_id];
+ }
+
+
+ // Truncate long torrent name, and HTML escape it.
+ // This is a helper function for download_status.
+ private function _clean_name($name) {
+ $name = str_replace("'", "\'", $name);
+ if (strlen($name) > 30) {
+ $name = substr($name, 0, 27);
+ $name .= "...";
+ }
+ $name = htmlspecialchars($name);
+ return $name;
+ }
+
+ // Calculate percent done.
+ // Helper function for download_status
+ private function _get_percent_done($bytes_total, $bytes_left) {
+ if($bytes_total) {
+ $perc_done = round(100.0 - ($bytes_left / $bytes_total) * 100);
+ return $perc_done;
+ }
+ else {
+ return 0;
+ }
+ }
+}
+
+
+/**
+ * Class to build a xml tree
+ */
+class KTorrentXML extends DomDocument {
+ private $root_element;
+ public function __construct($root, $value = null, $attributes = null) {
+ parent::__construct('1.0');
+ $this->root_element = $this->createElement($root);
+ $this->appendChild($this->root_element);
+ $this->formatOutput = true;
+
+ if ($attributes)
+ foreach($attributes as $key=>$val)
+ $this->root_element->setAttribute($key, $val);
+ }
+
+ // Creates an element, and returns it.
+ public function new_element($name, $value = null, $attributes = null) {
+ $element = $this->createElement($name);
+ if ($value) {
+ $element->appendChild($this->createTextNode($value));
+ }
+ if ($attributes) {
+ foreach(array_keys($attributes) as $key) {
+ $element->setAttribute($key, $attributes[$key]);
+ }
+ }
+ return $element;
+ }
+
+ // Append a given element to the root element of the xml file.
+ public function append_to_root($element) {
+ $this->root_element->appendChild($element);
+ }
+
+}
+
+/**
+ * Generic functions
+ */
+class Common {
+ function bytes_to_readable($bytes) {
+ if ($bytes < 1024) {
+ return round($bytes, 2) . " bytes";
+ }
+
+ else if (($kb = ($bytes / 1024)) < 1024) {
+ return round($kb, 2) . " KB";
+ }
+
+ else if (($mb = ($kb / 1024)) < 1024) {
+ return round($mb, 2) . " MB";
+ }
+
+ else {
+ $gb = round($mb / 1024, 2);
+ return "$gb GB";
+ }
+ }
+
+ function kb_to_readable($kbytes) {
+ return Common::bytes_to_readable($kbytes * 1024);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/plugins/webinterface/www/coldmilk/shutdown.php b/plugins/webinterface/www/coldmilk/shutdown.php
new file mode 100644
index 0000000..92862c4
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/shutdown.php
@@ -0,0 +1,21 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+ <title>ktorrent - web interface</title>
+ <link rel="stylesheet" href="style.css" type="text/css" />
+ <meta name="GENERATOR" content="Quanta Plus" />
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+
+</head>
+<body>
+
+
+<div id="action" style="min-height : 130px;">
+ <img src="icon.png" alt="" style="float : left; border : 0px solid;" />
+ <span style="font-size : x-large; margin-left : 50px;">Goodbye!</span>
+</div>
+
+</form>
+</body>
+</html>
diff --git a/plugins/webinterface/www/coldmilk/style.css b/plugins/webinterface/www/coldmilk/style.css
new file mode 100644
index 0000000..69010dc
--- /dev/null
+++ b/plugins/webinterface/www/coldmilk/style.css
@@ -0,0 +1,212 @@
+body {
+ font-family : sans-serif;
+ color : black;
+ background-color : white;
+ }
+
+A:link { color : blue; }
+A:visited { color : blue; }
+A:active { color : blue; }
+
+
+
+#header {
+ min-height : 130px;
+ }
+
+
+#header #logout {
+ position : absolute;
+ top : 1px;
+ right : 0.5em;
+ }
+
+
+#header #header_icon {
+ float : left;
+ margin-left : 1em;
+ border : 0px solid;
+ }
+
+#header ul {
+ display : inline;
+ font-size : large;
+ list-style-type : none;
+}
+
+
+#header li {
+ display : inline;
+ margin-right : 0.5em;
+ }
+
+
+#header #status_bar {
+ font-family : monospace;
+ font-size : small;
+ color : #636363;
+ border : 1px solid;
+ border-color : silver;
+ background-color : white;
+ }
+
+
+.list_table {
+ border-collapse : collapse;
+ width : 100%;
+ }
+
+
+.list_table th {
+ text-align : left;
+ }
+
+
+.list_table img {
+ border : 0px solid;
+ padding : 2px;
+ }
+
+
+.list_table .percent_bar {
+ background-color : #a5d3b4;
+ float : left;
+ position : relative;
+ color : inherit;
+}
+
+.list_table img {
+ opacity: 0.4;
+}
+
+.list_table a img {
+ opacity: 1.0;
+}
+
+#bottom-menu {
+ margin-top : 1em;
+ }
+
+
+#bottom-menu ul {
+ list-style-type : none;
+ padding : 0;
+ margin : 0;
+ }
+
+
+#bottom-menu li {
+ padding : 0.5em;
+ border : 1px solid;
+ border-color : silver;
+ display : inline;
+ position : relative;
+ background-color : #f5f5f5;
+ margin-right : 0.5em;
+ color : blue;
+}
+
+
+#bottom-menu img {
+ position : absolute;
+ top : 0.2em;
+ left : 0.5em;
+ }
+
+
+#bottom-menu span {
+ vertical-align : middle;
+ margin-left : 30px;
+ }
+
+
+.simple_form {
+ border : 1px solid;
+ border-color : silver;
+ width : 60%;
+ float : left;
+ padding : 1em;
+ background-color : #f5f5f5;
+ clear : left;
+ color : black;
+ }
+
+.simple_form h2, .simple_form h3 {
+ margin : 0 0 0.5em 0;
+ padding : 0;
+}
+
+
+.simple_form img {
+ float : right;
+ margin-right : 1em;
+ border : 0px solid;
+ }
+
+
+.simple_form .item {
+ position : relative;
+ margin-top : 0.5em;
+ }
+
+
+.simple_form .item .option {
+ position : absolute;
+ top : 0px;
+ left: 30%;
+ }
+
+
+.simple_form .item .option span {
+ font-size : small;
+ color : #333333;
+ background-color : inherit;
+ }
+
+.simple_form .hints {
+ font-size : small;
+ background-color : #FDFDFD;
+ color : inherit;
+}
+
+#action {
+ border : 1px solid;
+ border-color : silver;
+ clear : both;
+ width : 60%;
+ margin-left : 20%;
+ padding : 1em;
+ background-color : #f5f5f5;
+ color : inherit;
+}
+
+#action ul {
+ list-style-type : none;
+ margin : 0;
+ padding-left : 0;
+ padding-bottom : 1em;
+}
+
+#action li {
+ margin-top : 0.25em;
+ margin-bottom : 0.25em;
+ border : 1px solid;
+ border-color : silver;
+ min-height : 48px;
+ padding : 0.5em;
+ background-color : #FDFDFD;
+ color : inherit;
+
+}
+
+#action li span {
+ font-size : x-large;
+ vertical-align : middle;
+ padding-top : 20px;
+}
+
+#action img {
+ float : left;
+ clear : both;
+ border : 0px solid;
+} \ No newline at end of file
diff --git a/plugins/webinterface/www/default/Makefile.am b/plugins/webinterface/www/default/Makefile.am
new file mode 100644
index 0000000..01f09df
--- /dev/null
+++ b/plugins/webinterface/www/default/Makefile.am
@@ -0,0 +1,9 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/default
+
+ktdata_DATA = details.php only_seed.png favicon.ico grad1.jpg grad2.jpg menu_bg.png \
+ header_tile.png high_priority.png icon.png interface.php ktorrentwebinterfacelogo.png \
+ login.html low_priority.png normal_priority.png remove.png shutdown.php start.png \
+ stop.png style.css stylen.css wz_tooltip.js
diff --git a/plugins/webinterface/www/default/details.php b/plugins/webinterface/www/default/details.php
new file mode 100644
index 0000000..a19d57e
--- /dev/null
+++ b/plugins/webinterface/www/default/details.php
@@ -0,0 +1,89 @@
+<?php
+$stats=downloadStatus();
+$num_torrent=$_REQUEST['torrent'];
+
+function cut_name_if_long($string)
+{
+ if(strlen($string)>30) return substr($string, 0, 30).'...';
+ else return $string;
+}
+
+function get_file_status_name($status_id)
+{
+ $table = array(
+ 60 => 'PREVIEW_PRIORITY',
+ 50 => 'Download First',
+ 40 => 'Download Normally',
+ 30 => 'Download Last',
+ 20 => 'Only Seed',
+ 10 => 'Do Not Download'
+ );
+ if (array_key_exists($status_id, $table)) return $table[$status_id];
+ else return 'Not supported file status';
+}
+
+function generate_file_prior_button_code($img, $alt, $href='')
+{
+ $img = '<img src="'.htmlspecialchars($img).'" alt="'.htmlspecialchars($alt).'" />';
+ if (empty($href)) return $img;
+ else return '<a href="'.htmlspecialchars($href).'">'.$img.'</a>';
+}
+
+$display_name=cut_name_if_long($stats[$num_torrent]['torrent_name']);
+
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<style type="text/css" media="all">
+ @import "stylen.css";
+</style>
+<meta http-equiv="Content-Type" content="text/html" />
+<link rel="icon" href="favicon.ico" type="image/x-icon" />
+<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
+<title><?php echo 'KTorrent: Details for '.$display_name; ?></title>
+</head>
+<body>
+ <div id="top_bar">WebInterface KTorrent plugin</div>
+ <div id="icon"><img src="icon.png" alt="" /></div>
+ <div id="header">
+ <strong>KTorrent WebInterface</strong>
+ <br />
+ <small>BitTorrent client for KDE</small>
+ </div>
+ <ul id="menu">
+ <li><a href="interface.php" title="BACK">Back</a></li>
+ <li><a href="login.html" title="LOGOUT">Logout</a></li>
+ </ul>
+ <div id="content">
+ <table>
+ <tr>
+ <th>Actions</th>
+ <th>File</th>
+ <th>Status</th>
+ <th>Size</th>
+ <th>Complete</th>
+ </tr>
+<?php
+ foreach($stats[$num_torrent]['files'] as $id => $file)
+ {
+ echo "\t\t".'<tr>'."\n\t\t\t";
+ echo '<td class="actions">';
+ echo generate_file_prior_button_code('/high_priority.png', 'High Priority', $file['status']==50?'':"details.php?file_hp=$num_torrent-$id&torrent=$num_torrent");
+ echo generate_file_prior_button_code('/normal_priority.png', 'Normal Priority', $file['status']==40?'':"details.php?file_np=$num_torrent-$id&torrent=$num_torrent");
+ echo generate_file_prior_button_code('/low_priority.png', 'Low Priority', $file['status']==30?'':"details.php?file_lp=$num_torrent-$id&torrent=$num_torrent");
+ echo generate_file_prior_button_code('/only_seed.png', 'Stop downloading (Only Seed Priority)', ($file['status']==20||$file['status']==10)?'':"details.php?file_stop=$num_torrent-$id&torrent=$num_torrent");
+ echo '</td>';
+ echo '<td>'.htmlspecialchars(cut_name_if_long($file['name'])).'</td>';
+ echo '<td>'.get_file_status_name($file['status']).'</td>';
+ echo '<td style="text-align:right;">'.$file['size'].'</td>';
+ echo '<td style="text-align:right;">'.round($file['perc_done'], 2).' %</td>';
+ echo "\n\t\t".'</tr>'."\n";
+ }
+ ?>
+ </table>
+ </div>
+ <div id="footer">&#169; 2006 WebInterface KTorrent plugin</div>
+</body>
+</html>
diff --git a/plugins/webinterface/www/default/favicon.ico b/plugins/webinterface/www/default/favicon.ico
new file mode 100644
index 0000000..3213b23
--- /dev/null
+++ b/plugins/webinterface/www/default/favicon.ico
Binary files differ
diff --git a/plugins/webinterface/www/default/grad1.jpg b/plugins/webinterface/www/default/grad1.jpg
new file mode 100644
index 0000000..762baa0
--- /dev/null
+++ b/plugins/webinterface/www/default/grad1.jpg
Binary files differ
diff --git a/plugins/webinterface/www/default/grad2.jpg b/plugins/webinterface/www/default/grad2.jpg
new file mode 100644
index 0000000..bc4d77e
--- /dev/null
+++ b/plugins/webinterface/www/default/grad2.jpg
Binary files differ
diff --git a/plugins/webinterface/www/default/header_tile.png b/plugins/webinterface/www/default/header_tile.png
new file mode 100644
index 0000000..0bad736
--- /dev/null
+++ b/plugins/webinterface/www/default/header_tile.png
Binary files differ
diff --git a/plugins/webinterface/www/default/high_priority.png b/plugins/webinterface/www/default/high_priority.png
new file mode 100644
index 0000000..bcde52b
--- /dev/null
+++ b/plugins/webinterface/www/default/high_priority.png
Binary files differ
diff --git a/plugins/webinterface/www/default/icon.png b/plugins/webinterface/www/default/icon.png
new file mode 100644
index 0000000..6cb2185
--- /dev/null
+++ b/plugins/webinterface/www/default/icon.png
Binary files differ
diff --git a/plugins/webinterface/www/default/interface.php b/plugins/webinterface/www/default/interface.php
new file mode 100644
index 0000000..6432798
--- /dev/null
+++ b/plugins/webinterface/www/default/interface.php
@@ -0,0 +1,152 @@
+<?php
+$globalinfo=globalInfo();
+$stats=downloadStatus();
+
+function get_torrent_status_name($status_id)
+{
+ $table = array(
+ 0 => 'Not Started',
+ 1 => 'Seeding Complete',
+ 2 => 'Download Complete',
+ 3 => 'Seeding',
+ 4 => 'Downloading',
+ 5 => 'Stalled',
+ 6 => 'Stopped',
+ 7 => 'Allocating Diskspace',
+ 8 => 'Error',
+ 9 => 'Queued',
+ 10 => 'Checking Data'
+ );
+ if (array_key_exists($status_id, $table)) return $table[$status_id];
+ else return 'Not supported Status';
+}
+
+function generate_button_code($img, $alt, $href='')
+{
+ $img = '<img src="'.htmlspecialchars($img).'" alt="'.htmlspecialchars($alt).'" />';
+ if (empty($href)) return $img;
+ else return '<a href="'.htmlspecialchars($href).'">'.$img.'</a>';
+}
+?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<style type="text/css" media="all">
+ @import "stylen.css";
+</style>
+<meta http-equiv="Content-Type" content="text/html" />
+<link rel="icon" href="favicon.ico" type="image/x-icon" />
+<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
+<title><?php echo '(D:'.$globalinfo['download_speed'].') (U:'.$globalinfo['upload_speed'].') KTorrent'; ?></title>
+<script type="text/javascript">
+ function validate()
+ {
+ msg = "Are you absolutely sure that you want to remove this torrent?";
+ return confirm(msg);
+ }
+ function validate_shutdown()
+ {
+ msg = "Are you absolutely sure that you want to shutdown KTorrent?";
+ return confirm(msg);
+ }
+</script>
+</head>
+<body>
+ <div id="top_bar">WebInterface KTorrent plugin</div>
+ <div id="icon"><img src="icon.png" alt="" /></div>
+ <div id="header">
+ <strong>KTorrent WebInterface</strong>
+ <br />
+ <small>BitTorrent client for KDE</small>
+ </div>
+ <ul id="menu">
+ <li><a href="shutdown.php?quit=quit" class="shutdown" title="Shutdown KTorrent" onclick="return validate_shutdown()">Shutdown</a></li>
+ <li><a href="interface.php" title="REFRESH">Refresh</a></li>
+ <li><a href="login.html" title="LOGOUT">Logout</a></li>
+ </ul>
+ <div id="sidebar">
+ <div class="box">
+ <h2>Torrent control</h2>
+ <form action="interface.php" method="get" style="text-align: center;">
+ <input type="submit" name="startall" value="Start All" />
+ </form>
+ <hr />
+ <form action="interface.php" method="get" style="text-align: center;">
+ <input type="submit" name="stopall" value="Stop All" />
+ </form>
+ </div>
+ <div class="box">
+ <h2>Settings</h2>
+ <form action="interface.php" method="get">
+ <label>Upload speed <input type="text" name="maximum_upload_rate" value="<?php echo $globalinfo['max_upload_speed']; ?>" class="settingsInput" /></label>
+ <label>Download speed <input type="text" name="maximum_download_rate" value="<?php echo $globalinfo['max_download_speed']; ?>" class="settingsInput" /></label>
+ <label>Maximum downloads <input type="text" name="maximum_downloads" value="<?php echo $globalinfo['max_downloads']; ?>" class="settingsInput" /></label>
+ <label>Maximum seeds <input type="text" name="maximum_seeds" value="<?php echo $globalinfo['max_seeds']; ?>" class="settingsInput" /></label>
+ <input type="submit" value="Submit settings" />
+ </form>
+ </div>
+ <div class="box">
+ <h2>Load torrents</h2>
+ <form action="interface.php" method="get">
+ <label class="wide">Torrent URL: <input type="text" name="load_torrent" /></label>
+ <input type="submit" value="Load Torrent" />
+ </form>
+ <hr />
+ <form method="post" enctype="multipart/form-data" action="interface.php">
+ <label class="wide">Local File:<input type="file" name="load_torrent" /></label>
+ <input type="submit" name="Upload Torrent" value="Upload Torrent" />
+ </form>
+ </div>
+ </div>
+ <div id="content">
+ <table>
+ <tr>
+ <th>Actions</th>
+ <th>File</th>
+ <th>Status</th>
+ <th>Downloaded</th>
+ <th>Size</th>
+ <th>Uploaded</th>
+ <th>Down Speed</th>
+ <th>Up Speed</th>
+ <th>Peers</th>
+ <th>Complete</th>
+ </tr>
+<?php
+ $a = 0;
+ foreach ($stats as $torrent) {
+ echo "\t\t".'<tr>'."\n\t\t\t";
+
+ $torrent_name = str_replace("'", "\'", $torrent['torrent_name']);
+ if($torrent['total_bytes_to_download']!=0) $perc = round(100.0 - ($torrent['bytes_left_to_download'] / $torrent['total_bytes_to_download']) * 100.0, 2);
+ else $perc = 0;
+ if(strlen($torrent['torrent_name'])>30) $display_name=substr($torrent['torrent_name'], 0, 30)." ...";
+ else $display_name=$torrent['torrent_name'];
+ if ($torrent['num_files']>1) $file_td_content = '<a href="details.php?torrent='.$a.'">'.$display_name.'</a>';
+ else $file_td_content = $display_name;
+
+ echo '<td class="actions">';
+ echo generate_button_code('/stop.png', 'stop', ($torrent['running'])?'interface.php?stop='.$a:'');
+ echo generate_button_code('/start.png', 'start', ($torrent['running'])?'':'interface.php?start='.$a);
+ echo '<a href="interface.php?remove='.$a.'" onclick="return validate()"><img src="/remove.png" alt="remove" /></a>';
+ echo '</td>';
+ echo "<td style=\"text-align:left;\" onmouseover=\"this.T_TITLE='$torrent_name';return escape('Download speed:&lt;strong&gt;{$torrent['download_rate']}&lt;/strong&gt;&lt;br /&gt; Upload speed:&lt;strong&gt;{$torrent['upload_rate']}&lt;/strong&gt;&lt;/td&gt;')\">$file_td_content</td>";
+ echo '<td>'.get_torrent_status_name($torrent['status']).'</td>';
+ echo '<td style="text-align:right;">'.$torrent['bytes_downloaded'].'</td>';
+ echo '<td style="text-align:right; padding-left:8px;">'.$torrent['total_bytes'].'</td>';
+ echo '<td style="text-align:right; padding-left:8px;">'.$torrent['bytes_uploaded'].'</td>';
+ echo '<td style="text-align:right;">'.$torrent['download_rate'].'</td>';
+ echo '<td style="text-align:right;">'.$torrent['upload_rate'].'</td>';
+ echo '<td>'.$torrent['num_peers'].'</td>';
+ echo '<td style="text-align:right;">'.$perc.'% </td>';
+ echo "\n\t\t".'</tr>'."\n";
+ $a++;
+ }
+ ?>
+ </table>
+ </div>
+ <div id="footer">&#169; 2006 WebInterface KTorrent plugin</div>
+ <script type="text/javascript" src="wz_tooltip.js"></script>
+</body>
+</html>
diff --git a/plugins/webinterface/www/default/ktorrentwebinterfacelogo.png b/plugins/webinterface/www/default/ktorrentwebinterfacelogo.png
new file mode 100644
index 0000000..bc235b5
--- /dev/null
+++ b/plugins/webinterface/www/default/ktorrentwebinterfacelogo.png
Binary files differ
diff --git a/plugins/webinterface/www/default/login.html b/plugins/webinterface/www/default/login.html
new file mode 100644
index 0000000..93ac1e6
--- /dev/null
+++ b/plugins/webinterface/www/default/login.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<title>KTorrent WebInterface - Login</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<link rel="stylesheet" type="text/css" href="style.css" />
+<script type="text/javascript">
+ var was_focused = false;
+ function try_focus_form()
+ {
+ if (!was_focused)
+ {
+ document.forms["loginForm"].elements["username"].focus();
+ was_focused = true;
+ }
+ }
+</script>
+</head>
+<body onload="try_focus_form();">
+ <form id="loginForm" action="interface.php" method="post">
+ <table style="padding-left:100px; padding-top: 350px;">
+ <tr><td>Username:</td><td><input type="text" name="username" onfocus="was_focused = true;" /></td></tr>
+ <tr><td>Password:</td><td><input type="password" name="password" /></td></tr>
+ <tr><td></td><td><input type="submit" value="Login" /></td></tr>
+ </table>
+ </form>
+</body>
+</html>
diff --git a/plugins/webinterface/www/default/low_priority.png b/plugins/webinterface/www/default/low_priority.png
new file mode 100644
index 0000000..966e22b
--- /dev/null
+++ b/plugins/webinterface/www/default/low_priority.png
Binary files differ
diff --git a/plugins/webinterface/www/default/menu_bg.png b/plugins/webinterface/www/default/menu_bg.png
new file mode 100644
index 0000000..d33169a
--- /dev/null
+++ b/plugins/webinterface/www/default/menu_bg.png
Binary files differ
diff --git a/plugins/webinterface/www/default/normal_priority.png b/plugins/webinterface/www/default/normal_priority.png
new file mode 100644
index 0000000..d39228b
--- /dev/null
+++ b/plugins/webinterface/www/default/normal_priority.png
Binary files differ
diff --git a/plugins/webinterface/www/default/only_seed.png b/plugins/webinterface/www/default/only_seed.png
new file mode 100644
index 0000000..254d74a
--- /dev/null
+++ b/plugins/webinterface/www/default/only_seed.png
Binary files differ
diff --git a/plugins/webinterface/www/default/remove.png b/plugins/webinterface/www/default/remove.png
new file mode 100644
index 0000000..5d40f9f
--- /dev/null
+++ b/plugins/webinterface/www/default/remove.png
Binary files differ
diff --git a/plugins/webinterface/www/default/shutdown.php b/plugins/webinterface/www/default/shutdown.php
new file mode 100644
index 0000000..f87a199
--- /dev/null
+++ b/plugins/webinterface/www/default/shutdown.php
@@ -0,0 +1,13 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>Shutdown page</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+</head>
+<body bgcolor="#a2d2b1">
+
+<center><strong>KTorrent closed successfully</strong></center>
+
+</body>
+</html>
diff --git a/plugins/webinterface/www/default/start.png b/plugins/webinterface/www/default/start.png
new file mode 100644
index 0000000..3aac1a5
--- /dev/null
+++ b/plugins/webinterface/www/default/start.png
Binary files differ
diff --git a/plugins/webinterface/www/default/stop.png b/plugins/webinterface/www/default/stop.png
new file mode 100644
index 0000000..530639f
--- /dev/null
+++ b/plugins/webinterface/www/default/stop.png
Binary files differ
diff --git a/plugins/webinterface/www/default/style.css b/plugins/webinterface/www/default/style.css
new file mode 100644
index 0000000..3af4bb5
--- /dev/null
+++ b/plugins/webinterface/www/default/style.css
@@ -0,0 +1,13 @@
+/* styles for login.html */
+
+body {
+ background: url(ktorrentwebinterfacelogo.png) no-repeat 120px 120px;
+ font-family: verdana, arial, sans-serif;
+ color: #000000;
+ font-size: 12px;
+}
+
+input, textarea {
+ border: 1px solid #000000;
+ width: 120px;
+}
diff --git a/plugins/webinterface/www/default/stylen.css b/plugins/webinterface/www/default/stylen.css
new file mode 100644
index 0000000..68966fd
--- /dev/null
+++ b/plugins/webinterface/www/default/stylen.css
@@ -0,0 +1,164 @@
+/* styles for interface.php and details.php */
+
+html, body {
+ background-color: #a2d2b1;
+ font-family: sans-serif;
+ font-size: 12px;
+}
+html, body, h1, h2, h3, h4, form {
+ margin: 0;
+ padding: 0;
+}
+img {
+ border: 0;
+}
+h2 {
+ font-size: 12px;
+ min-height: 18px;
+ padding-top: 2px;
+ margin-bottom: 10px;
+ background-image: url(grad1.jpg);
+ font-weight: bold;
+ border-bottom: 1px solid #000;
+ text-align: center;
+}
+form {
+ text-align: right;
+}
+label {
+ display: block;
+ text-align: right;
+ margin: 4px 0 4px 0;
+}
+input {
+ margin: 0 5% 0 1%;
+ width: 30%;
+}
+label.wide {
+ text-align: left;
+ padding-left: 5%;
+}
+label.wide input {
+ margin: 0 0 0 0;
+ width: 95%;
+}
+input[type="submit"] {
+ width: auto;
+}
+th {
+ padding: 2px;
+ text-align: left;
+}
+a {
+ color: #0C45FF;
+ text-decoration: none;
+}
+a:visited {
+ color: #0C45FF;
+}
+a:hover {
+ color: #FFFFFF;
+ text-decoration: none;
+}
+
+
+.actions img {
+ width: 16px;
+ height: 16px;
+ margin: 2px;
+}
+
+
+.box {
+ width: 254px;
+ margin: 0 auto;
+ border: 1px solid black;
+ background-color: #d5d5d5;
+ padding-bottom: 10px;
+ margin-bottom: 10px;
+ text-align: center;
+}
+
+
+#top_bar {
+ background-color: #b72916;
+ border: 1px solid #868686;
+ text-align: right;
+}
+
+
+#icon {
+ position: absolute;
+ left: 5px;
+ top: 2px;
+}
+
+
+#header {
+ background-color: #42ac64;
+ padding: 15px 0 5px 140px;
+ font-size: 45px;
+}
+#header strong {
+ text-shadow: 3px 3px 5px #bbb;
+}
+#header small {
+ font-size: 13px;
+}
+
+
+#menu {
+ list-style-type: none;
+ margin: 0;
+ padding: 0 0 0 140px;
+ background-image: url(menu_bg.png);
+ height: 24px;
+}
+#menu li {
+ display: inline;
+ margin-right: 10px;
+}
+#menu a {
+ color: #fff;
+ font-size: 16px;
+}
+#menu a:hover {
+ color: #000;
+ text-decoration: none;
+}
+#menu .shutdown {
+ margin-right: 290px;
+}
+
+
+#sidebar {
+ background: #42AC64;
+ float: right;
+ width: 280px;
+ border-left: 1px solid #000;
+ border-bottom: 1px solid #000;
+ padding: 10px 0 5px 0;
+}
+#sidebar a:hover {
+ color: #000;
+}
+
+
+#content {
+ background: #a2d2b1;
+ text-align: left;
+ margin-right: 280px;
+ padding: 10px;
+}
+#content img { opacity: 0.4; }
+#content a img { opacity: 1.0; }
+
+
+#footer {
+ clear: both;
+ background: #b72916;
+ min-height: 25px;
+ text-align: center;
+ font-size: 14px;
+ padding-top: 5px;
+}
diff --git a/plugins/webinterface/www/default/wz_tooltip.js b/plugins/webinterface/www/default/wz_tooltip.js
new file mode 100644
index 0000000..1329a1b
--- /dev/null
+++ b/plugins/webinterface/www/default/wz_tooltip.js
@@ -0,0 +1,509 @@
+/* This notice must be untouched at all times.
+
+wz_tooltip.js v. 3.45
+
+The latest version is available at
+http://www.walterzorn.com
+or http://www.devira.com
+or http://www.walterzorn.de
+
+Copyright (c) 2002-2005 Walter Zorn. All rights reserved.
+Created 1. 12. 2002 by Walter Zorn (Web: http://www.walterzorn.com )
+Last modified: 22. 1. 2007
+
+Cross-browser tooltips working even in Opera 5 and 6,
+as well as in NN 4, Gecko-Browsers, IE4+, Opera 7+ and Konqueror.
+No onmouseouts required.
+Appearance of tooltips can be individually configured
+via commands within the onmouseovers.
+
+LICENSE: LGPL
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License (LGPL) as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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.
+
+For more details on the GNU Lesser General Public License,
+see http://www.gnu.org/copyleft/lesser.html
+*/
+
+
+
+//////////////// GLOBAL TOOPTIP CONFIGURATION /////////////////////
+var ttAbove = false; // tooltip above mousepointer? Alternative: true
+var ttBgColor = "#D5D5D5";
+var ttBgImg = ""; // path to background image;
+var ttBorderColor = "#D00000";
+var ttBorderWidth = 1;
+var ttDelay = 350; // time span until tooltip shows up [milliseconds]
+var ttClickClose = false;
+var ttFontColor = "#000000";
+var ttFontFace = "arial,helvetica,sans-serif";
+var ttFontSize = "11px";
+var ttFontWeight = "normal"; // alternative: "bold";
+var ttLeft = false; // tooltip on the left of the mouse? Alternative: true
+var ttOffsetX = 12; // horizontal offset of left-top corner from mousepointer
+var ttOffsetY = 15; // vertical offset "
+var ttOpacity = 70; // opacity of tooltip in percent (must be integer between 0 and 100)
+var ttPadding = 3; // spacing between border and content
+var ttShadowColor = "";
+var ttShadowWidth = 0;
+var ttStatic = false; // tooltip NOT move with the mouse? Alternative: true
+var ttSticky = false; // do NOT hide tooltip on mouseout? Alternative: true
+var ttTemp = 0; // time span after which the tooltip disappears; 0 (zero) means "infinite timespan"
+var ttTextAlign = "left";
+var ttTitleColor = "#ffffff"; // color of caption text
+var ttWidth = 300;
+//////////////////// END OF TOOLTIP CONFIG ////////////////////////
+
+
+
+////////////// TAGS WITH TOOLTIP FUNCTIONALITY ////////////////////
+// List may be extended or shortened:
+var tt_tags = new Array("a","area","b","big","caption","center","code","dd","div","dl","dt","em","h1","h2","h3","h4","h5","h6","i","img","input","li","map","ol","p","pre","s", "select", "small","span","strike","strong","sub","sup","table","td","textarea","th","tr","tt","u","var","ul","layer");
+/////////////////////////////////////////////////////////////////////
+
+
+
+///////// DON'T CHANGE ANYTHING BELOW THIS LINE /////////////////////
+var tt_obj = null, // current tooltip
+tt_ifrm = null, // iframe to cover windowed controls in IE
+tt_objW = 0, tt_objH = 0, // width and height of tt_obj
+tt_objX = 0, tt_objY = 0,
+tt_offX = 0, tt_offY = 0,
+xlim = 0, ylim = 0, // right and bottom borders of visible client area
+tt_sup = false, // true if T_ABOVE cmd
+tt_sticky = false, // tt_obj sticky?
+tt_wait = false,
+tt_act = false, // tooltip visibility flag
+tt_sub = false, // true while tooltip below mousepointer
+tt_u = "undefined",
+tt_mf = null, // stores previous mousemove evthandler
+// Opera: disable href when hovering <a>
+tt_tag = null; // stores hovered dom node, href and previous statusbar txt
+
+
+var tt_db = (document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body? document.body : null,
+tt_n = navigator.userAgent.toLowerCase(),
+tt_nv = navigator.appVersion;
+// Browser flags
+var tt_op = !!(window.opera && document.getElementById),
+tt_op6 = tt_op && !document.defaultView,
+tt_op7 = tt_op && !tt_op6,
+tt_ie = tt_n.indexOf("msie") != -1 && document.all && tt_db && !tt_op,
+tt_ie7 = tt_ie && typeof document.body.style.maxHeight != tt_u,
+tt_ie6 = tt_ie && !tt_ie7 && parseFloat(tt_nv.substring(tt_nv.indexOf("MSIE")+5)) >= 5.5,
+tt_n4 = (document.layers && typeof document.classes != tt_u),
+tt_n6 = (!tt_op && document.defaultView && typeof document.defaultView.getComputedStyle != tt_u),
+tt_w3c = !tt_ie && !tt_n6 && !tt_op && document.getElementById,
+tt_ce = document.captureEvents && !tt_n6;
+
+function tt_Int(t_x)
+{
+ var t_y;
+ return isNaN(t_y = parseInt(t_x))? 0 : t_y;
+}
+function wzReplace(t_x, t_y)
+{
+ var t_ret = "",
+ t_str = this,
+ t_xI;
+ while((t_xI = t_str.indexOf(t_x)) != -1)
+ {
+ t_ret += t_str.substring(0, t_xI) + t_y;
+ t_str = t_str.substring(t_xI + t_x.length);
+ }
+ return t_ret+t_str;
+}
+String.prototype.wzReplace = wzReplace;
+function tt_N4Tags(tagtyp, t_d, t_y)
+{
+ t_d = t_d || document;
+ t_y = t_y || new Array();
+ var t_x = (tagtyp=="a")? t_d.links : t_d.layers;
+ for(var z = t_x.length; z--;) t_y[t_y.length] = t_x[z];
+ for(z = t_d.layers.length; z--;) t_y = tt_N4Tags(tagtyp, t_d.layers[z].document, t_y);
+ return t_y;
+}
+function tt_Htm(tt, t_id, txt)
+{
+ var t_bgc = (typeof tt.T_BGCOLOR != tt_u)? tt.T_BGCOLOR : ttBgColor,
+ t_bgimg = (typeof tt.T_BGIMG != tt_u)? tt.T_BGIMG : ttBgImg,
+ t_bc = (typeof tt.T_BORDERCOLOR != tt_u)? tt.T_BORDERCOLOR : ttBorderColor,
+ t_bw = (typeof tt.T_BORDERWIDTH != tt_u)? tt.T_BORDERWIDTH : ttBorderWidth,
+ t_ff = (typeof tt.T_FONTFACE != tt_u)? tt.T_FONTFACE : ttFontFace,
+ t_fc = (typeof tt.T_FONTCOLOR != tt_u)? tt.T_FONTCOLOR : ttFontColor,
+ t_fsz = (typeof tt.T_FONTSIZE != tt_u)? tt.T_FONTSIZE : ttFontSize,
+ t_fwght = (typeof tt.T_FONTWEIGHT != tt_u)? tt.T_FONTWEIGHT : ttFontWeight,
+ t_opa = (typeof tt.T_OPACITY != tt_u)? tt.T_OPACITY : ttOpacity,
+ t_padd = (typeof tt.T_PADDING != tt_u)? tt.T_PADDING : ttPadding,
+ t_shc = (typeof tt.T_SHADOWCOLOR != tt_u)? tt.T_SHADOWCOLOR : (ttShadowColor || 0),
+ t_shw = (typeof tt.T_SHADOWWIDTH != tt_u)? tt.T_SHADOWWIDTH : (ttShadowWidth || 0),
+ t_algn = (typeof tt.T_TEXTALIGN != tt_u)? tt.T_TEXTALIGN : ttTextAlign,
+ t_tit = (typeof tt.T_TITLE != tt_u)? tt.T_TITLE : "",
+ t_titc = (typeof tt.T_TITLECOLOR != tt_u)? tt.T_TITLECOLOR : ttTitleColor,
+ t_w = (typeof tt.T_WIDTH != tt_u)? tt.T_WIDTH : ttWidth;
+ if(t_shc || t_shw)
+ {
+ t_shc = t_shc || "#c0c0c0";
+ t_shw = t_shw || 5;
+ }
+ if(tt_n4 && (t_fsz == "10px" || t_fsz == "11px")) t_fsz = "12px";
+
+ var t_optx = (tt_n4? '' : tt_n6? ('-moz-opacity:'+(t_opa/100.0)) : tt_ie? ('filter:Alpha(opacity='+t_opa+')') : ('opacity:'+(t_opa/100.0))) + ';';
+ var t_y = '<div id="'+t_id+'" style="position:absolute;z-index:1010;';
+ t_y += 'left:0px;top:0px;width:'+(t_w+t_shw)+'px;visibility:'+(tt_n4? 'hide' : 'hidden')+';'+t_optx+'">' +
+ '<table border="0" cellpadding="0" cellspacing="0"'+(t_bc? (' bgcolor="'+t_bc+'" style="background:'+t_bc+';"') : '')+' width="'+t_w+'">';
+ if(t_tit)
+ {
+ t_y += '<tr><td style="padding-left:3px;padding-right:3px;" align="'+t_algn+'"><font color="'+t_titc+'" face="'+t_ff+'" ' +
+ 'style="color:'+t_titc+';font-family:'+t_ff+';font-size:'+t_fsz+';"><b>' +
+ (tt_n4? '&nbsp;' : '')+t_tit+'</b></font></td></tr>';
+ }
+ t_y += '<tr><td><table border="0" cellpadding="'+t_padd+'" cellspacing="'+t_bw+'" width="100%">' +
+ '<tr><td'+(t_bgc? (' bgcolor="'+t_bgc+'"') : '')+(t_bgimg? ' background="'+t_bgimg+'"' : '')+' style="text-align:'+t_algn+';';
+ if(tt_n6) t_y += 'padding:'+t_padd+'px;';
+ t_y += '" align="'+t_algn+'"><font color="'+t_fc+'" face="'+t_ff+'"' +
+ ' style="color:'+t_fc+';font-family:'+t_ff+';font-size:'+t_fsz+';font-weight:'+t_fwght+';">';
+ if(t_fwght == 'bold') t_y += '<b>';
+ t_y += txt;
+ if(t_fwght == 'bold') t_y += '</b>';
+ t_y += '</font></td></tr></table></td></tr></table>';
+ if(t_shw)
+ {
+ var t_spct = Math.round(t_shw*1.3);
+ if(tt_n4)
+ {
+ t_y += '<layer bgcolor="'+t_shc+'" left="'+t_w+'" top="'+t_spct+'" width="'+t_shw+'" height="0"></layer>' +
+ '<layer bgcolor="'+t_shc+'" left="'+t_spct+'" align="bottom" width="'+(t_w-t_spct)+'" height="'+t_shw+'"></layer>';
+ }
+ else
+ {
+ t_optx = tt_n6? '-moz-opacity:0.85;' : tt_ie? 'filter:Alpha(opacity=85);' : 'opacity:0.85;';
+ t_y += '<div id="'+t_id+'R" style="position:absolute;background:'+t_shc+';left:'+t_w+'px;top:'+t_spct+'px;width:'+t_shw+'px;height:1px;overflow:hidden;'+t_optx+'"></div>' +
+ '<div style="position:relative;background:'+t_shc+';left:'+t_spct+'px;top:0px;width:'+(t_w-t_spct)+'px;height:'+t_shw+'px;overflow:hidden;'+t_optx+'"></div>';
+ }
+ }
+ return(t_y+'</div>');
+}
+function tt_EvX(t_e)
+{
+ var t_y = tt_Int(t_e.pageX || t_e.clientX || 0) +
+ tt_Int(tt_ie? tt_db.scrollLeft : 0) +
+ tt_offX;
+ if(t_y > xlim) t_y = xlim;
+ var t_scr = tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0);
+ if(t_y < t_scr) t_y = t_scr;
+ return t_y;
+}
+function tt_EvY(t_e)
+{
+ var t_y2;
+
+ var t_y = tt_Int(t_e.pageY || t_e.clientY || 0) +
+ tt_Int(tt_ie? tt_db.scrollTop : 0);
+ if(tt_sup && (t_y2 = t_y - (tt_objH + tt_offY - 15)) >= tt_Int(window.pageYOffset || (tt_db? tt_db.scrollTop : 0) || 0))
+ t_y -= (tt_objH + tt_offY - 15);
+ else if(t_y > ylim || !tt_sub && t_y > ylim-24)
+ {
+ t_y -= (tt_objH + 5);
+ tt_sub = false;
+ }
+ else
+ {
+ t_y += tt_offY;
+ tt_sub = true;
+ }
+ return t_y;
+}
+function tt_ReleasMov()
+{
+ if(document.onmousemove == tt_Move)
+ {
+ if(!tt_mf && tt_ce) document.releaseEvents(Event.MOUSEMOVE);
+ document.onmousemove = tt_mf;
+ }
+}
+function tt_ShowIfrm(t_x)
+{
+ if(!tt_obj || !tt_ifrm) return;
+ if(t_x)
+ {
+ tt_ifrm.style.width = tt_objW+'px';
+ tt_ifrm.style.height = tt_objH+'px';
+ tt_ifrm.style.display = "block";
+ }
+ else tt_ifrm.style.display = "none";
+}
+function tt_GetDiv(t_id)
+{
+ return(
+ tt_n4? (document.layers[t_id] || null)
+ : tt_ie? (document.all[t_id] || null)
+ : (document.getElementById(t_id) || null)
+ );
+}
+function tt_GetDivW()
+{
+ return tt_Int(
+ tt_n4? tt_obj.clip.width
+ : (tt_obj.style.pixelWidth || tt_obj.offsetWidth)
+ );
+}
+function tt_GetDivH()
+{
+ return tt_Int(
+ tt_n4? tt_obj.clip.height
+ : (tt_obj.style.pixelHeight || tt_obj.offsetHeight)
+ );
+}
+
+// Compat with DragDrop Lib: Ensure that z-index of tooltip is lifted beyond toplevel dragdrop element
+function tt_SetDivZ()
+{
+ var t_i = tt_obj.style || tt_obj;
+ if(t_i)
+ {
+ if(window.dd && dd.z)
+ t_i.zIndex = Math.max(dd.z+1, t_i.zIndex);
+ if(tt_ifrm) tt_ifrm.style.zIndex = t_i.zIndex-1;
+ }
+}
+function tt_SetDivPos(t_x, t_y)
+{
+ var t_i = tt_obj.style || tt_obj;
+ var t_px = (tt_op6 || tt_n4)? '' : 'px';
+ t_i.left = (tt_objX = t_x) + t_px;
+ t_i.top = (tt_objY = t_y) + t_px;
+ // window... to circumvent the FireFox Alzheimer Bug
+ if(window.tt_ifrm)
+ {
+ tt_ifrm.style.left = t_i.left;
+ tt_ifrm.style.top = t_i.top;
+ }
+}
+function tt_ShowDiv(t_x)
+{
+ tt_ShowIfrm(t_x);
+ if(tt_n4) tt_obj.visibility = t_x? 'show' : 'hide';
+ else tt_obj.style.visibility = t_x? 'visible' : 'hidden';
+ tt_act = t_x;
+}
+function tt_DeAlt(t_tag)
+{
+ if(t_tag)
+ {
+ if(t_tag.alt) t_tag.alt = "";
+ if(t_tag.title) t_tag.title = "";
+ var t_c = t_tag.children || t_tag.childNodes || null;
+ if(t_c)
+ {
+ for(var t_i = t_c.length; t_i; )
+ tt_DeAlt(t_c[--t_i]);
+ }
+ }
+}
+function tt_OpDeHref(t_e)
+{
+ var t_tag;
+ if(t_e)
+ {
+ t_tag = t_e.target;
+ while(t_tag)
+ {
+ if(t_tag.hasAttribute("href"))
+ {
+ tt_tag = t_tag
+ tt_tag.t_href = tt_tag.getAttribute("href");
+ tt_tag.removeAttribute("href");
+ tt_tag.style.cursor = "hand";
+ tt_tag.onmousedown = tt_OpReHref;
+ tt_tag.stats = window.status;
+ window.status = tt_tag.t_href;
+ break;
+ }
+ t_tag = t_tag.parentElement;
+ }
+ }
+}
+function tt_OpReHref()
+{
+ if(tt_tag)
+ {
+ tt_tag.setAttribute("href", tt_tag.t_href);
+ window.status = tt_tag.stats;
+ tt_tag = null;
+ }
+}
+function tt_Show(t_e, t_id, t_sup, t_clk, t_delay, t_fix, t_left, t_offx, t_offy, t_static, t_sticky, t_temp)
+{
+ if(tt_obj) tt_Hide();
+ tt_mf = document.onmousemove || null;
+ if(window.dd && (window.DRAG && tt_mf == DRAG || window.RESIZE && tt_mf == RESIZE)) return;
+ var t_sh, t_h;
+
+ tt_obj = tt_GetDiv(t_id);
+ if(tt_obj)
+ {
+ t_e = t_e || window.event;
+ tt_sub = !(tt_sup = t_sup);
+ tt_sticky = t_sticky;
+ tt_objW = tt_GetDivW();
+ tt_objH = tt_GetDivH();
+ tt_offX = t_left? -(tt_objW+t_offx) : t_offx;
+ tt_offY = t_offy;
+ if(tt_op7) tt_OpDeHref(t_e);
+ if(tt_n4)
+ {
+ if(tt_obj.document.layers.length)
+ {
+ t_sh = tt_obj.document.layers[0];
+ t_sh.clip.height = tt_objH - Math.round(t_sh.clip.width*1.3);
+ }
+ }
+ else
+ {
+ t_sh = tt_GetDiv(t_id+'R');
+ if(t_sh)
+ {
+ t_h = tt_objH - tt_Int(t_sh.style.pixelTop || t_sh.style.top || 0);
+ if(typeof t_sh.style.pixelHeight != tt_u) t_sh.style.pixelHeight = t_h;
+ else t_sh.style.height = t_h+'px';
+ }
+ }
+
+ xlim = tt_Int((tt_db && tt_db.clientWidth)? tt_db.clientWidth : window.innerWidth) +
+ tt_Int(window.pageXOffset || (tt_db? tt_db.scrollLeft : 0) || 0) -
+ tt_objW -
+ (tt_n4? 21 : 0);
+ ylim = tt_Int(window.innerHeight || tt_db.clientHeight) +
+ tt_Int(window.pageYOffset || (tt_db? tt_db.scrollTop : 0) || 0) -
+ tt_objH - tt_offY;
+
+ tt_SetDivZ();
+ if(t_fix) tt_SetDivPos(tt_Int((t_fix = t_fix.split(','))[0]), tt_Int(t_fix[1]));
+ else tt_SetDivPos(tt_EvX(t_e), tt_EvY(t_e));
+
+ var t_txt = 'tt_ShowDiv(\'true\');';
+ if(t_sticky) t_txt += '{'+
+ 'tt_ReleasMov();'+
+ (t_clk? ('window.tt_upFunc = document.onmouseup || null;'+
+ 'if(tt_ce) document.captureEvents(Event.MOUSEUP);'+
+ 'document.onmouseup = new Function("window.setTimeout(\'tt_Hide();\', 10);");') : '')+
+ '}';
+ else if(t_static) t_txt += 'tt_ReleasMov();';
+ if(t_temp > 0) t_txt += 'window.tt_rtm = window.setTimeout(\'tt_sticky = false; tt_Hide();\','+t_temp+');';
+ window.tt_rdl = window.setTimeout(t_txt, t_delay);
+
+ if(!t_fix)
+ {
+ if(tt_ce) document.captureEvents(Event.MOUSEMOVE);
+ document.onmousemove = tt_Move;
+ }
+ }
+}
+var tt_area = false;
+function tt_Move(t_ev)
+{
+ if(!tt_obj) return;
+ if(tt_n6 || tt_w3c)
+ {
+ if(tt_wait) return;
+ tt_wait = true;
+ setTimeout('tt_wait = false;', 5);
+ }
+ var t_e = t_ev || window.event;
+ tt_SetDivPos(tt_EvX(t_e), tt_EvY(t_e));
+ if(window.tt_op6)
+ {
+ if(tt_area && t_e.target.tagName != 'AREA') tt_Hide();
+ else if(t_e.target.tagName == 'AREA') tt_area = true;
+ }
+}
+function tt_Hide()
+{
+ if(window.tt_obj)
+ {
+ if(window.tt_rdl) window.clearTimeout(tt_rdl);
+ if(!tt_sticky || !tt_act)
+ {
+ if(window.tt_rtm) window.clearTimeout(tt_rtm);
+ tt_ShowDiv(false);
+ tt_SetDivPos(-tt_objW, -tt_objH);
+ tt_obj = null;
+ if(typeof window.tt_upFunc != tt_u) document.onmouseup = window.tt_upFunc;
+ }
+ tt_sticky = false;
+ if(tt_op6 && tt_area) tt_area = false;
+ tt_ReleasMov();
+ if(tt_op7) tt_OpReHref();
+ }
+}
+function tt_Init()
+{
+ if(!(tt_op || tt_n4 || tt_n6 || tt_ie || tt_w3c)) return;
+
+ var htm = tt_n4? '<div style="position:absolute;"></div>' : '',
+ tags,
+ t_tj,
+ over,
+ t_b,
+ esc = 'return escape(';
+ for(var i = tt_tags.length; i;)
+ {--i;
+ tags = tt_ie? (document.all.tags(tt_tags[i]) || 1)
+ : document.getElementsByTagName? (document.getElementsByTagName(tt_tags[i]) || 1)
+ : (!tt_n4 && tt_tags[i]=="a")? document.links
+ : 1;
+ if(tt_n4 && (tt_tags[i] == "a" || tt_tags[i] == "layer")) tags = tt_N4Tags(tt_tags[i]);
+ for(var j = tags.length; j;)
+ {--j;
+ if(typeof (t_tj = tags[j]).onmouseover == "function" && t_tj.onmouseover.toString().indexOf(esc) != -1 && !tt_n6 || tt_n6 && (over = t_tj.getAttribute("onmouseover")) && over.indexOf(esc) != -1)
+ {
+ if(over) t_tj.onmouseover = new Function(over);
+ var txt = unescape(t_tj.onmouseover());
+ htm += tt_Htm(
+ t_tj,
+ "tOoLtIp"+i+""+j,
+ txt.wzReplace("& ","&")
+ );
+ // window. to circumvent the FF Alzheimer Bug
+ t_tj.onmouseover = new Function('e',
+ 'if(window.tt_Show && tt_Show) tt_Show(e,'+
+ '"tOoLtIp' +i+''+j+ '",'+
+ ((typeof t_tj.T_ABOVE != tt_u)? t_tj.T_ABOVE : ttAbove)+','+
+ ((typeof t_tj.T_CLICKCLOSE != tt_u)? t_tj.T_CLICKCLOSE : ttClickClose)+','+
+ ((typeof t_tj.T_DELAY != tt_u)? t_tj.T_DELAY : ttDelay)+','+
+ ((typeof t_tj.T_FIX != tt_u)? '"'+t_tj.T_FIX+'"' : '""')+','+
+ ((typeof t_tj.T_LEFT != tt_u)? t_tj.T_LEFT : ttLeft)+','+
+ ((typeof t_tj.T_OFFSETX != tt_u)? t_tj.T_OFFSETX : ttOffsetX)+','+
+ ((typeof t_tj.T_OFFSETY != tt_u)? t_tj.T_OFFSETY : ttOffsetY)+','+
+ ((typeof t_tj.T_STATIC != tt_u)? t_tj.T_STATIC : ttStatic)+','+
+ ((typeof t_tj.T_STICKY != tt_u)? t_tj.T_STICKY : ttSticky)+','+
+ ((typeof t_tj.T_TEMP != tt_u)? t_tj.T_TEMP : ttTemp)+
+ ');'
+ );
+ t_tj.onmouseout = tt_Hide;
+ tt_DeAlt(t_tj);
+ }
+ }
+ }
+ if(tt_ie6) htm += '<iframe id="TTiEiFrM" src="javascript:false" scrolling="no" frameborder="0" style="filter:Alpha(opacity=0);position:absolute;top:0px;left:0px;display:none;"></iframe>';
+ t_b = document.getElementsByTagName? document.getElementsByTagName("body")[0] : tt_db;
+ if(t_b && t_b.insertAdjacentHTML) t_b.insertAdjacentHTML("AfterBegin", htm);
+ else if(t_b && typeof t_b.innerHTML != tt_u && document.createElement && t_b.appendChild)
+ {
+ var t_el = document.createElement("div");
+ t_b.appendChild(t_el);
+ t_el.innerHTML = htm;
+ }
+ else
+ document.write(htm);
+ if(document.getElementById) tt_ifrm = document.getElementById("TTiEiFrM");
+}
+tt_Init();
diff --git a/plugins/webinterface/www/mobile/Makefile.am b/plugins/webinterface/www/mobile/Makefile.am
new file mode 100644
index 0000000..3aae8b4
--- /dev/null
+++ b/plugins/webinterface/www/mobile/Makefile.am
@@ -0,0 +1,8 @@
+INCLUDES = -I$(srcdir)/../../libktorrent $(all_includes)
+METASOURCES = AUTO
+
+ktdatadir = $(kde_datadir)/ktorrent/www/mobile
+
+
+
+ktdata_DATA = favicon.ico interface.php ktorrentwebinterfacelogo.png login.html remove.png start.png stop.png settings.php torrent.php
diff --git a/plugins/webinterface/www/mobile/favicon.ico b/plugins/webinterface/www/mobile/favicon.ico
new file mode 100644
index 0000000..3213b23
--- /dev/null
+++ b/plugins/webinterface/www/mobile/favicon.ico
Binary files differ
diff --git a/plugins/webinterface/www/mobile/interface.php b/plugins/webinterface/www/mobile/interface.php
new file mode 100644
index 0000000..57582de
--- /dev/null
+++ b/plugins/webinterface/www/mobile/interface.php
@@ -0,0 +1,113 @@
+<html>
+<head>
+<title>KTorrent WebInterface</title>
+</head>
+<body>
+<table width="100%">
+ <tbody>
+ <tr>
+ <td align="center"><IMG src="ktorrentwebinterfacelogo.png" width="340" height="150" align="top" border="0"></td>
+
+ <td><strong>ktorrent</strong>->transfers</td>
+
+ <td><td><a href="interface.php" >refresh</a></td>
+ </tr>
+ </tbody>
+</table>
+<hr>
+<table width="100%">
+ <tbody>
+ <?php
+ $stats=downloadStatus();
+ $a = 0;
+ foreach ($stats as $torrent) {
+ echo "<tr>";
+ $perc = round(100.0 - ($torrent['bytes_left_to_download'] / $torrent['total_bytes_to_download']) * 100.0, 2);
+ echo "<td><a href=\"torrent.php?id=$a\" >{$torrent['torrent_name']}</a></td>";
+ switch ($torrent['status']) {
+ case 0:
+ echo "<td>Not Started</td>";
+ break;
+ case 1:
+ echo "<td>Seeding Complete</td>";
+ break;
+ case 2:
+ echo "<td>Download Complete</td>";
+ break;
+ case 3:
+ echo "<td>Seeding</td>";
+ break;
+ case 4:
+ echo "<td>Downloading</td>";
+ break;
+ case 5:
+ echo "<td>Stalled</td>";
+ break;
+ case 6:
+ echo "<td>Stopped</td>";
+ break;
+ case 7:
+ echo "<td>Allocating Diskspace</td>";
+ break;
+ case 8:
+ echo "<td>Error</td>";
+ break;
+ case 9:
+ echo "<td>Queued</td>";
+ break;
+ case 10:
+ echo "<td>Checking Data</td>";
+ break;
+ default:
+ echo "<td>Not supported Status</td>";
+ }
+ echo "<td>$perc%</td>";
+ $a=$a+1;
+ echo "</tr>";
+ }
+ ?>
+
+ <tr>
+ <td>&nbsp;</td>
+ <td><hr></td>
+ <td>&nbsp;</td>
+ </tr>
+
+ <tr>
+ <?php
+ $globalinfo=globalInfo();
+ echo "<td><strong>Speed</strong></td>";
+ echo "<td>Down: {$globalinfo['download_speed']}</td>";
+ echo "<td>Up: {$globalinfo['upload_speed']}</td>";
+ ?>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td><hr></td>
+ <td>&nbsp;</td>
+ </tr>
+ <tr>
+ <td><a href="interface.php?startall=startall" ><strong>Start All</strong></a></td>
+ <td>&nbsp;</td>
+ <td><a href="interface.php?stopall=stopall" ><strong>Stop All</strong></a></td>
+ </tr>
+ <tr>
+ <td>&nbsp;</td>
+ <td><a href="settings.php" ><strong>Settings</strong></a></td>
+ <td>&nbsp;</td>
+ </tr>
+
+ </tbody>
+</table>
+<FORM method="GET">
+<INPUT type="text" name="load_torrent">
+<INPUT type="submit" name="Load torrent" value="Load torrent"></tr>
+</FORM>
+<FORM method="post" enctype="multipart/form-data" action="interface.php">
+Local File:<INPUT type="file" name="load_torrent">
+<INPUT type="submit" name="Upload Torrent" value="Upload Torrent"></tr>
+</FORM>
+
+</body>
+</html>
+
diff --git a/plugins/webinterface/www/mobile/ktorrentwebinterfacelogo.png b/plugins/webinterface/www/mobile/ktorrentwebinterfacelogo.png
new file mode 100644
index 0000000..bc235b5
--- /dev/null
+++ b/plugins/webinterface/www/mobile/ktorrentwebinterfacelogo.png
Binary files differ
diff --git a/plugins/webinterface/www/mobile/login.html b/plugins/webinterface/www/mobile/login.html
new file mode 100644
index 0000000..359c44c
--- /dev/null
+++ b/plugins/webinterface/www/mobile/login.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+
+<head>
+ <title>KTorrent WebInterface - Login</title>
+ <meta name="GENERATOR" content="Quanta Plus">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+</head>
+<body>
+<TABLE align="center" >
+<tr><td><IMG src="ktorrentwebinterfacelogo.png" width="687" height="300" align="left" border="0"></td></tr>
+</TABLE>
+<TABLE align="center" >
+<FORM action="interface.php" method="POST">
+
+ <tr><td>Username</td><td><INPUT type="text" name="username"></td></tr>
+ <tr><td>Password</td><td><INPUT type="password" name="password"></td></tr>
+<tr><td></td><td><INPUT type="submit" name="Login"></td></tr>
+
+</FORM>
+</TABLE>
+
+</body>
+</html>
diff --git a/plugins/webinterface/www/mobile/remove.png b/plugins/webinterface/www/mobile/remove.png
new file mode 100644
index 0000000..a7080ac
--- /dev/null
+++ b/plugins/webinterface/www/mobile/remove.png
Binary files differ
diff --git a/plugins/webinterface/www/mobile/settings.php b/plugins/webinterface/www/mobile/settings.php
new file mode 100644
index 0000000..b763bb1
--- /dev/null
+++ b/plugins/webinterface/www/mobile/settings.php
@@ -0,0 +1,44 @@
+<html>
+<head>
+<title>KTorrent WebInterface</title>
+</head>
+<body>
+<table width="100%">
+ <tbody>
+ <tr>
+ <td align="center"><IMG src="ktorrentwebinterfacelogo.png" width="340" height="150" align="top" border="0"></td>
+ <td><strong>ktorrent-><a href="interface.php">transfers</a></strong>->settings</td>
+ <td><a href="settings.php" >refresh</a></td>
+ </tr>
+ </tbody>
+</table>
+<table width="100%">
+ <tbody>
+<?php
+ $globalinfo=globalInfo();
+ echo "<FORM method=\"GET\">";
+ echo "<tr>";
+ echo "<td>Upload Speed (0 is no limit): </td>";
+ echo "<td><INPUT type=\"text\" name=\"maximum_upload_rate\" value=\"{$globalinfo['max_upload_speed']}\"></td>";
+ echo " </tr>";
+ echo "<tr>";
+ echo "<td>Download Speed (0 is no limit): </td>";
+ echo "<td><INPUT type=\"text\" name=\"maximum_download_rate\" value=\"{$globalinfo['max_download_speed']}\"></td>";
+ echo "</tr>";
+ echo "<tr>";
+ echo "<td>Maximum downloads (0 is no limit): </td>";
+ echo "<td><INPUT type=\"text\" name=\"maximum_downloads\" value=\"{$globalinfo['max_downloads']}\"></td>";
+ echo"</tr>";
+ echo "<tr>";
+ echo "<td>Maximum seeds (0 is no limit): </td>";
+ echo "<td><INPUT type=\"text\" name=\"maximum_seeds\" value=\"{$globalinfo['max_seeds']}\"></td>";
+ echo"</tr>";
+ echo "<tr><td><INPUT type=\"submit\"></tr></td>";
+ echo "</FORM>";
+?>
+</tbody>
+</table>
+
+</body>
+</html>
+
diff --git a/plugins/webinterface/www/mobile/start.png b/plugins/webinterface/www/mobile/start.png
new file mode 100644
index 0000000..ead5c73
--- /dev/null
+++ b/plugins/webinterface/www/mobile/start.png
Binary files differ
diff --git a/plugins/webinterface/www/mobile/stop.png b/plugins/webinterface/www/mobile/stop.png
new file mode 100644
index 0000000..7c6d824
--- /dev/null
+++ b/plugins/webinterface/www/mobile/stop.png
Binary files differ
diff --git a/plugins/webinterface/www/mobile/torrent.php b/plugins/webinterface/www/mobile/torrent.php
new file mode 100644
index 0000000..a1e451d
--- /dev/null
+++ b/plugins/webinterface/www/mobile/torrent.php
@@ -0,0 +1,91 @@
+<html>
+<head>
+<title>KTorrent WebInterface</title>
+</head>
+<body>
+<table width="100%">
+ <tbody>
+ <tr>
+ <td align="center"><IMG src="ktorrentwebinterfacelogo.png" width="340" height="150" align="top" border="0"></td>
+ <?php
+ $stats=downloadStatus();
+ $t=$stats[$_REQUEST['id']];
+ echo "<td><strong>ktorrent-><a href=\"interface.php\">transfers</a></strong>->{$t['torrent_name']}</td>";
+ echo "<td><a href=\"torrent.php?id={$_REQUEST['id']}\" >refresh</a></td>";
+ ?>
+ </tr>
+ </tbody>
+</table>
+<table width="100%">
+ <tbody>
+ <tr>
+ <?php
+ echo "<td><a href=\"torrent.php?stop={$_REQUEST['id']}&id={$_REQUEST['id']}\" title=\"STOP\"><img src=\"/stop.png\" name=\"stop\" width=\"16\" height=\"16\" border=\"0\"></a></td>";
+ echo "<td><a href=\"torrent.php?start={$_REQUEST['id']}&id={$_REQUEST['id']}\" title=\"START\"><img src=\"/start.png\" name=\"start\" width=\"16\" height=\"16\" border=\"0\"></a></td>";
+ echo "<td><a href=\"interface.php?remove={$_REQUEST['id']}\" title=\"REMOVE\"><img src=\"/remove.png\" name=\"remove\" width=\"16\" height=\"16\" border=\"0\"></a></td>";
+ ?>
+ </tr>
+ </tbody>
+</table>
+<table width="100%">
+ <tbody>
+ <?php
+ echo "<tr>";
+ echo "<td><strong>Status: </strong></td>";
+ switch ($t['status']) {
+ case 0:
+ echo "<td>NOT_STARTED</td>";
+ break;
+ case 1:
+ echo "<td>SEEDING_COMPLETE</td>";
+ break;
+ case 2:
+ echo "<td>DOWNLOAD_COMPLETE</td>";
+ break;
+ case 3:
+ echo "<td>SEEDING</td>";
+ break;
+ case 4:
+ echo "<td>DOWNLOADING</td>";
+ break;
+ case 5:
+ echo "<td>STALLED</td>";
+ break;
+ case 6:
+ echo "<td>STOPPED</td>";
+ break;
+ case 7:
+ echo "<td>ALLOCATING_DISKSPACE</td>";
+ break;
+ case 8:
+ echo "<td>ERROR</td>";
+ break;
+ case 9:
+ echo "<td>QUEUED</td>";
+ break;
+ case 10:
+ echo "<td>CHECKING_DATA</td>";
+ break;
+ default:
+ echo "<td>Not supported Status</td>";
+ }
+ echo "</tr>";
+ echo "<tr>";
+ echo "<td><strong>Down speed: </strong></td>";
+ echo "<td>{$t['download_rate']}</td>";
+ echo "</tr>";
+ echo "<tr>";
+ echo "<td><strong>Up speed: </strong></td>";
+ echo "<td>{$t['upload_rate']}</td>";
+ echo "</tr>";
+ echo "<tr>";
+ echo "<td><strong>Complete: </strong></td>";
+ $perc = round(100.0 - ($t['bytes_left_to_download'] / $t['total_bytes_to_download']) * 100.0, 2);
+ echo "<td>$perc %</td>";
+ echo "</tr>";
+ ?>
+ </tbody>
+</table>
+</body>
+</html>
+
diff --git a/plugins/zeroconf/Makefile.am b/plugins/zeroconf/Makefile.am
new file mode 100644
index 0000000..c6870e6
--- /dev/null
+++ b/plugins/zeroconf/Makefile.am
@@ -0,0 +1,22 @@
+INCLUDES = -I$(top_builddir)/libktorrent -I$(top_builddir)/ktorrent/libktorrent \
+ -I$(srcdir)/../../libktorrent $(all_includes)
+
+METASOURCES = AUTO
+
+if COMPILE_ZEROCONF
+kde_module_LTLIBRARIES = ktzeroconfplugin.la
+endif
+
+ktzeroconfplugin_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) $(AVAHI_LIBS) $(AVAHI_QT3_LIBS)
+ktzeroconfplugin_la_SOURCES = localbrowser.cpp avahiservice.cpp \
+ zeroconfplugin.cpp
+
+ktzeroconfplugin_la_LIBADD = $(LIB_KDECORE) $(LIB_KFILE) $(LIB_KPARTS) $(LIB_KDEUI)\
+ $(LIB_QT) ../../libktorrent/libktorrent.la
+
+noinst_HEADERS = zeroconfplugin.h
+
+kde_services_DATA = ktzeroconfplugin.desktop
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
+
+
diff --git a/plugins/zeroconf/avahiservice.cpp b/plugins/zeroconf/avahiservice.cpp
new file mode 100644
index 0000000..a190d8e
--- /dev/null
+++ b/plugins/zeroconf/avahiservice.cpp
@@ -0,0 +1,341 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Lesly Weyts and Kevin Andre *
+ * *
+ * 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 <util/log.h>
+#include <torrent/peerid.h>
+#include <avahi-common/watch.h>
+#include <avahi-qt3/qt-watch.h>
+#include "localbrowser.h"
+#include "avahiservice.h"
+
+using namespace bt;
+
+namespace kt
+{
+
+ void group_callback(AvahiEntryGroup* g, AvahiEntryGroupState state, void* userdata)
+ {
+ AvahiService* service = reinterpret_cast<AvahiService*>(userdata);
+
+ if (g == service->group)
+ {
+ switch (state)
+ {
+ case AVAHI_ENTRY_GROUP_ESTABLISHED:
+ break;
+ case AVAHI_ENTRY_GROUP_COLLISION:
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Entry group collision." << endl;
+ break;
+ case AVAHI_ENTRY_GROUP_FAILURE:
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Entry group failure." << endl;
+ break;
+ case AVAHI_ENTRY_GROUP_UNCOMMITED:
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Entry group uncommited." << endl;
+ break;
+ case AVAHI_ENTRY_GROUP_REGISTERING:
+ ;
+ }
+ }
+ }
+
+ void publish_service(AvahiService* service, AvahiClient *c)
+ {
+ assert(c);
+
+ if (!service->group)
+ {
+ if (!(service->group = avahi_entry_group_new(c, group_callback, service)))
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: avahi_entry_group_new failed." << endl;
+ return;
+ }
+ }
+
+ const char* name = avahi_strdup(QString("%1__%2%3").arg(service->id).arg((rand() % 26) + 65).arg((rand() % 26) + 65).ascii());
+ const char* type = avahi_strdup("_bittorrent._tcp");
+ const char* subtype = avahi_strdup(QString("_" + service->infoHash + "._sub._bittorrent._tcp").ascii());
+
+ if (avahi_entry_group_add_service(
+ service->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
+ (AvahiPublishFlags)0, name, type, NULL, NULL, service->port, NULL))
+ {
+ if (avahi_client_errno(c) != -8)
+ Out(SYS_ZCO|LOG_DEBUG) << QString("ZC: Failed to add the service (%i).").arg(avahi_client_errno(c)) << endl;
+ else
+ publish_service(service, c);
+ return;
+ }
+
+ if (avahi_entry_group_add_service_subtype(
+ service->group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
+ (AvahiPublishFlags)0, name, type, NULL, subtype))
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << QString("ZC: Failed to add the service subtype (%i).").arg( avahi_client_errno(c)) << endl;
+ return;
+ }
+
+ if (avahi_entry_group_commit(service->group))
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Failed to commit the entry group." << endl;
+ return;
+ }
+ }
+
+ void publisher_callback(AvahiClient* c, AvahiClientState state, void* userdata)
+ {
+ if (!c)
+ return;
+
+ AvahiService* service = reinterpret_cast<AvahiService*>(userdata);
+
+ switch (state) {
+ case AVAHI_CLIENT_S_RUNNING:
+ {
+ if (!service->group)
+ publish_service(service, c);
+ break;
+ }
+ case AVAHI_CLIENT_FAILURE:
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "Failure when publishing." << endl;
+ break;
+ }
+ case AVAHI_CLIENT_S_COLLISION:
+ case AVAHI_CLIENT_S_REGISTERING:
+ {
+ if (service->group)
+ avahi_entry_group_reset(service->group);
+ break;
+ }
+ case AVAHI_CLIENT_CONNECTING:
+ ;
+ }
+ }
+
+ void listener_callback(AvahiClient* c, AvahiClientState state, void* userdata)
+ {
+ assert(c);
+
+ AvahiService* service = reinterpret_cast<AvahiService*>(userdata);
+
+ if (state == AVAHI_CLIENT_FAILURE)
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Server connection failure." << endl;
+ }
+ }
+
+ void resolve_callback(
+ AvahiServiceResolver* r,
+ AVAHI_GCC_UNUSED AvahiIfIndex interface,
+ AVAHI_GCC_UNUSED AvahiProtocol protocol,
+ AvahiResolverEvent event,
+ const char* name,
+ AVAHI_GCC_UNUSED const char* type,
+ AVAHI_GCC_UNUSED const char* domain,
+ AVAHI_GCC_UNUSED const char* host_name,
+ const AvahiAddress* address,
+ uint16_t port,
+ AVAHI_GCC_UNUSED AvahiStringList* txt,
+ AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
+ void* userdata)
+ {
+ assert(r);
+
+ switch (event) {
+ case AVAHI_RESOLVER_FAILURE:
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Resolver failed." << endl;
+ break;
+ }
+ case AVAHI_RESOLVER_FOUND:
+ {
+ AvahiService* service = reinterpret_cast<AvahiService*>(userdata);
+
+ QString realname = QString(name);
+ realname.truncate(realname.length() - 5);
+
+ if (service->id != QString(realname))
+ {
+ char a[AVAHI_ADDRESS_STR_MAX];
+ avahi_address_snprint(a, sizeof(a), address);
+ const char* ip = a;
+ LocalBrowser::insert(bt::PeerID(realname.ascii()));
+
+ Out(SYS_ZCO|LOG_NOTICE) << "ZC: found local peer " << ip << ":" << port << endl;
+ service->addPeer(ip,port,true);
+ service->emitPeersReady();
+ }
+ }
+ }
+ avahi_service_resolver_free(r);
+ }
+
+ void browser_callback(
+ AvahiServiceBrowser* b,
+ AvahiIfIndex interface,
+ AvahiProtocol protocol,
+ AvahiBrowserEvent event,
+ const char* name,
+ const char* type,
+ const char* domain,
+ AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
+ void* userdata)
+ {
+ assert(b);
+
+ AvahiService* service = reinterpret_cast<AvahiService*>(userdata);
+
+ switch (event) {
+ case AVAHI_BROWSER_FAILURE:
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Browser failure." << endl;
+ break;
+ }
+ case AVAHI_BROWSER_NEW:
+ {
+ if (!(avahi_service_resolver_new(service->listener, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, (AvahiLookupFlags)0, resolve_callback, userdata)))
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Failed to resolve the service." << endl;
+ break;
+ }
+ case AVAHI_BROWSER_REMOVE:
+ {
+ QString realname = QString(name);
+ realname.truncate(realname.length() - 5);
+
+ LocalBrowser::remove(bt::PeerID(realname.ascii()));
+
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Browser removed." << endl;
+ break;
+ }
+ case AVAHI_BROWSER_ALL_FOR_NOW:
+ case AVAHI_BROWSER_CACHE_EXHAUSTED:
+ ;
+ }
+ }
+
+ AvahiService::AvahiService(const bt::PeerID& id,bt::Uint16 port, const bt::SHA1Hash & infoHash)
+ : group(0), publisher_poll(0), listener_poll(0),publisher(0), listener(0), browser(0)
+ {
+ started = false;
+
+ this->id = id.toString();
+ this->port = port;
+ this->infoHash = infoHash.toString();
+ }
+
+ AvahiService::~AvahiService()
+ {
+ stop(0);
+ }
+
+ void AvahiService::stop(bt::WaitJob*)
+ {
+ if (started)
+ {
+ started = false;
+
+ publisher_poll = 0;
+ if (publisher)
+ {
+ avahi_client_free(publisher);
+ publisher = 0;
+ }
+
+ listener_poll = 0;
+ if (listener)
+ {
+ avahi_client_free(listener);
+ listener = 0;
+ }
+ }
+ }
+
+ void AvahiService::start()
+ {
+ started = startPublishing() && startBrowsing();
+ }
+
+ bool AvahiService::startPublishing()
+ {
+ group = NULL;
+ publisher_poll = NULL;
+ publisher = NULL;
+
+ if (!(publisher_poll = avahi_qt_poll_get()))
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Failed to create a poll for publishing." << endl;
+ stop();
+ return false;
+ }
+
+ publisher = avahi_client_new(publisher_poll, AVAHI_CLIENT_NO_FAIL, publisher_callback, this, NULL);
+
+ if (!(publisher))
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Failed to create a client for publishing." << endl;
+ stop();
+ return false;
+ }
+
+ return true;
+ }
+
+ bool AvahiService::startBrowsing()
+ {
+ listener_poll = NULL;
+ listener = NULL;
+ browser = NULL;
+
+ if (!(listener_poll = avahi_qt_poll_get()))
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Failed to create a poll for browsing." << endl;
+ stop();
+ return false;
+ }
+
+ listener = avahi_client_new(listener_poll,AVAHI_CLIENT_NO_FAIL, listener_callback, this, NULL);
+
+ if (!listener)
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Failed to create a client for browsing." << endl;
+ stop();
+ return false;
+ }
+
+ if (!(browser = avahi_service_browser_new(listener, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, avahi_strdup(QString("_" + infoHash + "._sub._bittorrent._tcp").ascii()), NULL, (AvahiLookupFlags)0, browser_callback, this)))
+ {
+ Out(SYS_ZCO|LOG_DEBUG) << "ZC: Failed to create a service browser." << endl;
+ stop();
+ return false;
+ }
+
+ return true;
+ }
+
+ void AvahiService::emitPeersReady()
+ {
+ peersReady(this);
+ }
+
+ void AvahiService::aboutToBeDestroyed()
+ {
+ serviceDestroyed(this);
+ }
+}
+
+#include "avahiservice.moc"
diff --git a/plugins/zeroconf/avahiservice.h b/plugins/zeroconf/avahiservice.h
new file mode 100644
index 0000000..10938d8
--- /dev/null
+++ b/plugins/zeroconf/avahiservice.h
@@ -0,0 +1,113 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Lesly Weyts and Kevin Andre *
+ * *
+ * 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 AVAHI_SERVICE_HH
+#define AVAHI_SERVICE_HH
+
+/**
+ * @author Lesly Weyts and Kevin Andre
+ * @brief Handles everything directly related to Avahi
+ *
+ * This set of functions provide a simple way to use Avahi inside the KTorrent source code.
+ */
+
+#include <cstdlib>
+#include <qstring.h>
+
+
+#include <avahi-client/client.h>
+#include <avahi-client/publish.h>
+#include <avahi-client/lookup.h>
+#include <avahi-common/thread-watch.h>
+#include <avahi-common/malloc.h>
+
+#include <util/sha1hash.h>
+#include <interfaces/peersource.h>
+
+namespace kt
+{
+
+ class AvahiService : public kt::PeerSource
+ {
+ Q_OBJECT
+ public:
+ AvahiService(const bt::PeerID&, bt::Uint16, const bt::SHA1Hash&);
+ virtual ~AvahiService();
+
+ virtual void stop(bt::WaitJob* wjob = 0);
+ virtual void start();
+ virtual void aboutToBeDestroyed();
+
+ void emitPeersReady();
+
+ signals:
+ void serviceDestroyed(AvahiService* av);
+
+ private:
+ bool startPublishing();
+ bool startBrowsing();
+
+ friend void group_callback(AvahiEntryGroup*, AvahiEntryGroupState, void*);
+ friend void publish_service(AvahiService*, AvahiClient*);
+ friend void publisher_callback(AvahiClient*, AvahiClientState, void*);
+ friend void listener_callback(AvahiClient*, AvahiClientState, void*);
+
+ friend void resolve_callback(
+ AvahiServiceResolver*,
+ AvahiIfIndex,
+ AvahiProtocol,
+ AvahiResolverEvent,
+ const char*,
+ const char*,
+ const char*,
+ const char*,
+ const AvahiAddress*,
+ uint16_t,
+ AvahiStringList*,
+ AvahiLookupResultFlags,
+ void*
+ );
+
+ friend void browser_callback(
+ AvahiServiceBrowser*,
+ AvahiIfIndex,
+ AvahiProtocol,
+ AvahiBrowserEvent,
+ const char*,
+ const char*,
+ const char*,
+ AvahiLookupResultFlags,
+ void*
+ );
+
+ QString id;
+ int port;
+ QString infoHash;
+
+ bool started;
+
+ AvahiEntryGroup *group;
+ const AvahiPoll* publisher_poll;
+ const AvahiPoll* listener_poll;
+ AvahiClient* publisher;
+ AvahiClient* listener;
+ AvahiServiceBrowser *browser;
+ };
+}
+
+#endif
diff --git a/plugins/zeroconf/ktzeroconfplugin.desktop b/plugins/zeroconf/ktzeroconfplugin.desktop
new file mode 100644
index 0000000..caf68e1
--- /dev/null
+++ b/plugins/zeroconf/ktzeroconfplugin.desktop
@@ -0,0 +1,22 @@
+[Desktop Entry]
+Name=ZeroConfPlugin
+Name[bg]=Приставка ZeroConf
+Name[de]=ZeroConf-Modul
+Name[es]=Complemento de ZeroConf
+Name[et]=ZeroConfi plugin
+Name[it]=Plugin ZeroConf
+Name[nb]=ZeroConf-modul
+Name[nds]=ZeroConf-Moduul
+Name[pl]=Wtyczka ZeroConf
+Name[pt]='Plugin' do ZeroConf
+Name[pt_BR]=Plugin ZeroConf
+Name[sr]=ZeroConf прикључак
+Name[sr@Latn]=ZeroConf priključak
+Name[sv]=Zeroconf-insticksprogram
+Name[tr]=ZeroConf Eklentisi
+Name[uk]=Втулок ZeroConf
+Name[xx]=xxZeroConfPluginxx
+Name[zh_CN]=ZeroConf 插件
+ServiceTypes=KTorrent/Plugin
+Type=Service
+X-KDE-Library=ktzeroconfplugin
diff --git a/plugins/zeroconf/localbrowser.cpp b/plugins/zeroconf/localbrowser.cpp
new file mode 100644
index 0000000..6306788
--- /dev/null
+++ b/plugins/zeroconf/localbrowser.cpp
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Lesly Weyts and Kevin Andre *
+ * *
+ * 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 <list>
+#include <torrent/peerid.h>
+#include "localbrowser.h"
+
+
+namespace LocalBrowser
+{
+ static std::list<bt::PeerID> local_peers;
+
+ void remove(bt::PeerID id)
+ {
+ local_peers.remove(id);
+ }
+
+ void insert(bt::PeerID id)
+ {
+ if (!(check(id)))
+ local_peers.push_front(id);
+ }
+
+ bool check(bt::PeerID id)
+ {
+ for (std::list<bt::PeerID>::iterator i = local_peers.begin(); i != local_peers.end(); ++i) {
+ if (*i == id)
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/plugins/zeroconf/localbrowser.h b/plugins/zeroconf/localbrowser.h
new file mode 100644
index 0000000..0e06b99
--- /dev/null
+++ b/plugins/zeroconf/localbrowser.h
@@ -0,0 +1,39 @@
+/***************************************************************************
+ * Copyright (C) 2006 by Lesly Weyts and Kevin Andre *
+ * *
+ * 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 LOCAL_BROWSER_HHHH
+#define LOCAL_BROWSER_HHHH
+
+/**
+ * @author Lesly Weyts and Kevin Andre
+ * @brief Keep track of local peers
+ */
+
+
+
+namespace bt { class PeerID; }
+
+namespace LocalBrowser {
+
+ void remove(bt::PeerID);
+ void insert(bt::PeerID);
+ bool check (bt::PeerID);
+
+
+}
+#endif
diff --git a/plugins/zeroconf/zeroconfplugin.cpp b/plugins/zeroconf/zeroconfplugin.cpp
new file mode 100644
index 0000000..b906843
--- /dev/null
+++ b/plugins/zeroconf/zeroconfplugin.cpp
@@ -0,0 +1,135 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <kgenericfactory.h>
+#include <util/log.h>
+#include <interfaces/coreinterface.h>
+#include <interfaces/torrentinterface.h>
+#include <torrent/globals.h>
+#include <torrent/server.h>
+#include "zeroconfplugin.h"
+#include "avahiservice.h"
+
+
+#define NAME "Zeroconf"
+#define AUTHOR "Lesly Weyts and Kevin Andre"
+
+K_EXPORT_COMPONENT_FACTORY(ktzeroconfplugin,KGenericFactory<kt::ZeroConfPlugin>("ktzeroconfplugin"))
+
+using namespace bt;
+
+namespace kt
+{
+
+ ZeroConfPlugin::ZeroConfPlugin(QObject* parent, const char* name, const QStringList& args)
+ : Plugin(parent, name,args,NAME,i18n("Zeroconf"),AUTHOR,QString::null,i18n("Finds peers running ktorrent on the local network to share torrents with"),"ktplugins")
+ {
+ services.setAutoDelete(true);
+ }
+
+
+ ZeroConfPlugin::~ZeroConfPlugin()
+ {}
+
+ void ZeroConfPlugin::load()
+ {
+ CoreInterface* core = getCore();
+ connect(core,SIGNAL(torrentAdded( kt::TorrentInterface* )),
+ this,SLOT(torrentAdded( kt::TorrentInterface* )));
+ connect(core,SIGNAL(torrentRemoved( kt::TorrentInterface* )),
+ this,SLOT(torrentRemoved( kt::TorrentInterface* )));
+
+ // go over existing torrents and add them
+ bt::QueueManager* qman = core->getQueueManager();
+ for (QPtrList<kt::TorrentInterface>::iterator i = qman->begin();i != qman->end();i++)
+ {
+ torrentAdded(*i);
+ }
+ }
+
+ void ZeroConfPlugin::unload()
+ {
+ CoreInterface* core = getCore();
+ disconnect(core,SIGNAL(torrentAdded( kt::TorrentInterface* )),
+ this,SLOT(torrentAdded( kt::TorrentInterface* )));
+ disconnect(core,SIGNAL(torrentRemoved( kt::TorrentInterface* )),
+ this,SLOT(torrentRemoved( kt::TorrentInterface*)));
+
+ bt::PtrMap<kt::TorrentInterface*,AvahiService>::iterator i = services.begin();
+ while (i != services.end())
+ {
+ AvahiService* av = i->second;
+ kt::TorrentInterface* ti = i->first;
+ ti->removePeerSource(av);
+ i++;
+ }
+ services.clear();
+ }
+
+ void ZeroConfPlugin::torrentAdded(kt::TorrentInterface* tc)
+ {
+ if (services.contains(tc))
+ return;
+
+ bt::Uint16 port = bt::Globals::instance().getServer().getPortInUse();
+ AvahiService* av = new AvahiService(tc->getOwnPeerID(),port,tc->getInfoHash());
+ services.insert(tc,av);
+ tc->addPeerSource(av);
+ Out(SYS_ZCO|LOG_NOTICE) << "ZeroConf service added for "
+ << tc->getStats().torrent_name << endl;
+ connect(av,SIGNAL(serviceDestroyed( AvahiService* )),
+ this,SLOT(avahiServiceDestroyed( AvahiService* )));
+ }
+
+
+ void ZeroConfPlugin::torrentRemoved(kt::TorrentInterface* tc)
+ {
+ AvahiService* av = services.find(tc);
+ if (!av)
+ return;
+ Out(SYS_ZCO|LOG_NOTICE) << "ZeroConf service removed for "
+ << tc->getStats().torrent_name << endl;
+ tc->removePeerSource(av);
+ services.erase(tc);
+ }
+
+ void ZeroConfPlugin::avahiServiceDestroyed(AvahiService* av)
+ {
+ services.setAutoDelete(false);
+
+ Out(SYS_ZCO|LOG_NOTICE) << "ZeroConf service destroyed " << endl;
+ bt::PtrMap<kt::TorrentInterface*,AvahiService>::iterator i = services.begin();
+ while (i != services.end())
+ {
+ if (i->second == av)
+ {
+ services.erase(i->first);
+ break;
+ }
+ i++;
+ }
+ services.setAutoDelete(true);
+ }
+
+ bool ZeroConfPlugin::versionCheck(const QString & version) const
+ {
+ return version == KT_VERSION_MACRO;
+ }
+}
+#include "zeroconfplugin.moc"
diff --git a/plugins/zeroconf/zeroconfplugin.h b/plugins/zeroconf/zeroconfplugin.h
new file mode 100644
index 0000000..b34e851
--- /dev/null
+++ b/plugins/zeroconf/zeroconfplugin.h
@@ -0,0 +1,71 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 KTZEROCONFPLUGIN_H
+#define KTZEROCONFPLUGIN_H
+
+#include <util/ptrmap.h>
+#include <interfaces/plugin.h>
+
+namespace kt
+{
+ class TorrentInterface;
+ class AvahiService;
+
+ /**
+ * @author Joris Guisson <joris.guisson@gmail.com>
+ *
+ * Plugin which handles the zeroconf service.
+ */
+ class ZeroConfPlugin : public Plugin
+ {
+ Q_OBJECT
+ public:
+ ZeroConfPlugin(QObject* parent, const char* name, const QStringList& args);
+ virtual ~ZeroConfPlugin();
+
+ virtual void load();
+ virtual void unload();
+ virtual bool versionCheck(const QString& version) const;
+
+ private slots:
+ /**
+ * A TorrentInterface was added
+ * @param tc
+ */
+ void torrentAdded(kt::TorrentInterface* tc);
+
+ /**
+ * A TorrentInterface was removed
+ * @param tc
+ */
+ void torrentRemoved(kt::TorrentInterface* tc);
+
+ /**
+ * An AvahiService has been destroyed by the psman
+ */
+ void avahiServiceDestroyed(AvahiService* av);
+
+ private:
+ bt::PtrMap<kt::TorrentInterface*,AvahiService> services;
+ };
+
+}
+
+#endif
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
new file mode 100644
index 0000000..2c6a020
--- /dev/null
+++ b/scripts/Makefile.am
@@ -0,0 +1 @@
+bin_SCRIPTS=ktshell
diff --git a/scripts/ktshell b/scripts/ktshell
new file mode 100755
index 0000000..c3971b9
--- /dev/null
+++ b/scripts/ktshell
@@ -0,0 +1,400 @@
+#!/bin/bash
+
+declare -a filenames priorities torinfo filecounts ints info tors usernms ktorrents dcops
+
+filemenu () {
+ local IFS='
+'
+ filenames=( `$ktorrent getFileNames $tornum` )
+ unset IFS
+ while true; do
+ local IFS='
+'
+ priorities=( `$ktorrent getFilePriorities $tornum` )
+ unset IFS
+ clear
+ echo $torname;
+ for ((B=0; B < filecounts[$i]; B++)); do
+ echo -n "$B. ${filenames[$B]:0:60} - "
+ case "${priorities[$B]}" in
+ "0")
+ echo "Excluded"
+ ;;
+ "1")
+ echo "Download Last"
+ ;;
+ "3")
+ echo "Download First"
+ ;;
+ "2")
+ echo "Download Normally"
+ ;;
+ esac
+ done
+ echo
+ echo "Enter a list of file numbers you want to set to the same priority"
+ echo -n "separated by spaces, or enter to go back to this torrent's menu: "
+ read filenums
+ if [ "x$filenums" = "x" ]; then
+ break
+ fi
+ echo "0 = Do Not Download, 1 = Download Last, 2 = Download Normally, 3 = Download First"
+ echo -n "Enter the priority you want to set the files to: "
+ read priority
+ for A in $filenums; do
+ echo $A
+ done|$ktorrentp setFilePriority $tornum %1 $priority
+ done
+}
+
+tormenu () {
+ i=${tors[$tornum]}
+ torname=${torinfo[$i*10]}
+ while true; do
+ clear
+ echo $torname
+ select name in 'Stop Torrent' 'Start Torrent' 'Remove Torrent' \
+ 'Manual Announce' 'File Names & Priorities' 'Back to Torrent List' \
+ 'Back to Main Menu' 'Quit'; do
+ echo
+ case "$REPLY" in
+ "1")
+ $ktorrent stop $tornum 0
+ echo "Torrent Stopped"
+ ;;
+ "2")
+ echo "Torrent Started"
+ $ktorrent start $tornum
+ ;;
+ "3")
+ echo -n "Enter 1 to delete any incomplete data "
+ echo "or enter 0 to keep it: "
+ read deldata
+ $ktorrent remove $tornum $deldata
+ if (( $deldata == 1 )); then
+ echo "Torrent and Any Incomplete Data Removed"
+ else
+ echo "Torrent Removed"
+ fi
+ return
+ ;;
+ "4")
+ $ktorrent announce $tornum
+ echo "Manual Announce Completed"
+ ;;
+ "5")
+ if ((${filecounts[$i]} == 0)); then
+ echo "Single File Torrent"
+ continue
+ fi
+ filemenu
+ break
+ ;;
+ "6")
+ return
+ ;;
+ "7")
+ return 1
+ ;;
+ "8")
+ exit 0
+ ;;
+ esac
+ done
+ done
+}
+
+torlist () {
+ while true; do
+ local IFS='
+'
+ tornums=`$ktorrent getTorrentNumbers $1`
+ unset IFS
+ if [ "x$tornums" = "x" ]; then
+ echo "No Torrents of the Selected Type Are Loaded"
+ return 1
+ fi
+ clear
+ if (( $1 == 1 )); then
+ echo "Downloads:"
+ fi
+ if (( $1 == 2 )); then
+ echo "Seeds:"
+ fi
+ if (( $1 == 3 )); then
+ echo "All Torrents:"
+ fi
+ unset torns
+ for A in $tornums; do
+ torns="$torns
+$A"
+ done
+ local IFS='
+'
+ torinfo=( `for A in $torns; do
+ echo $A
+ done|$ktorrentp getTorrentInfo %1|sed s/^$/-/` )
+ filecounts=( `for A in $torns; do
+ echo $A
+ done|$ktorrentp getFileCount %1` )
+ unset IFS
+ i=0
+ for A in $tornums; do
+ let tors[$A]=$i/13
+ echo "$A. ${torinfo[$i]:0:40} (${torinfo[$i+1]:0:32})"
+ echo -n "Size:${torinfo[$i+3]} (Have ${torinfo[$i+9]}) "
+ echo -n "Time Left:${torinfo[$i+7]} "
+ echo "Peers: ${torinfo[$i+8]}"
+ echo -n "Seeders: ${torinfo[$i+11]} Leechers: ${torinfo[$i+12]} "
+ echo "Share Ratio: ${torinfo[$i+10]} "
+ echo -n "DL:${torinfo[$i+2]} DL Rate:${torinfo[$i+5]} "
+ echo "UL:${torinfo[$i+4]} UL Rate:${torinfo[$i+6]} "
+ echo
+ let i=$i+13
+ done
+ echo -n "Type a torrent's number or press enter to go back to the main menu:"
+ read -p " " command
+ unset tornum
+ if [ "x$command" = "x" ]; then
+ return
+ fi
+ for A in $tornums; do
+ if [ "x$command" = "x$A" ]; then
+ tornum=$A
+ break
+ fi
+ done
+ if [ "x$tornum" != "x" ]; then
+ tormenu
+ if [ "x$?" = "x1" ]; then
+ return
+ fi
+ fi
+ done
+}
+
+settings () {
+ while true; do
+ local IFS='
+'
+ ints=( `$ktorrent intSettings` );
+ ints[7]=`$ktorrent dataDir`
+ unset IFS
+ clear
+ echo "Current Settings: "
+ echo "Max Downloads: ${ints[0]}"
+ echo "Max Seeds: ${ints[1]}"
+ echo "Max Connections Per Download: ${ints[2]}"
+ echo "Max Upload Speed: ${ints[3]}"
+ echo "Max Download Speed: ${ints[4]}"
+ echo "Keep Seeding When Complete: ${ints[5]}"
+ echo "Show System Tray Icon: ${ints[6]}"
+ echo "Temporary Data Dir: ${ints[7]}"
+ echo
+ echo "Change Settings"
+ select name in 'Set Max Downloads' 'Set Max Seeds' \
+ 'Set Keep Seeding When Complete' 'Set Max Upload Speed' 'Set Max Download Speed' \
+ 'Set Max Connections Per Download' 'Set Show System Tray Icon' \
+ 'Change Temporary Data Dir' 'Back to Main Menu' 'Quit'; do
+ case "$REPLY" in
+ "1")
+ read -p "How many downloads? " maxdown
+ $ktorrent setMaxDownloads $maxdown
+ break
+ ;;
+ "2")
+ read -p "How many seeds? " maxseeds
+ $ktorrent setMaxSeeds $maxseeds
+ break
+ ;;
+ "3")
+ read -p "Keep Seeding After downloading? 0 for no, 1 for yes: " ks
+ $ktorrent setKeepSeeding $ks
+ break
+ ;;
+ "4")
+ read -p "Max Upload Speed in K/s: " ulspeed
+ $ktorrent setMaxUploadSpeed $ulspeed
+ break
+ ;;
+ "5")
+ read -p "Max Download Speed in K/s: " dlspeed
+ $ktorrent setMaxDownloadSpeed $dlspeed
+ break
+ ;;
+ "6")
+ read -p "Max Connections Per Download: " conn
+ $ktorrent setMaxConnectionsPerDownload $conn
+ break
+ ;;
+ "7")
+ read -p "Show the System Tray Icon? 0 for no, 1 for yes: " st
+ $ktorrent setShowSysTray $st
+ break
+ ;;
+ "8")
+ read -p "Enter full path to new temp data directory: " ddpath
+ $ktorrent changeDataDir "$ddpath"
+ break
+ ;;
+ "9")
+ return
+ ;;
+ "10")
+ exit 0
+ ;;
+ esac
+ done
+ done
+}
+
+about () {
+ clear
+echo "This script uses KDE's DCOP interface to control a running instance of KTorrent."
+echo "It uses the console DCOP client, dcop, to connect. It organizes the features of and"
+echo "simplifies the use of this interface. It is intended to be used as a replacement for"
+echo "a true console BitTorrent client for KTorrent users. It was written by Adam Forsyth."
+echo
+echo "Hint: pressing enter at most menus will redisplay the menu choices."
+echo "Press enter to go back to the main menu."
+read
+}
+
+mainmenu () {
+ local IFS='
+'
+ info=( `$ktorrent getInfo` )
+ unset IFS
+ clear
+ echo "Totals:"
+ echo "${info[0]}"
+ echo "${info[1]}"
+ echo "${info[2]}"
+ select name in 'List All Torrents' 'List Seeds' 'List Downloads' 'Start All' 'Stop All' \
+ 'Load a Torrent' 'Change Settings' 'Redisplay Totals & Menu' 'About this Script' 'Quit'; do
+ case "$REPLY" in
+ "1"|"2"|"3")
+ let A=4-$REPLY
+ torlist $A
+ if (( $? == 1 )); then
+ continue
+ fi
+ return
+ ;;
+ "4")
+ echo "Enter 1 to start downloads, 2 to start seeds, 3 to start all: "
+ read starttype
+ $ktorrent startAll $starttype
+ echo "Torrents of type $starttype Started"
+ ;;
+ "5")
+ echo "Enter 1 to stop downloads, 2 to stop seeds, 3 to stop all: "
+ read stoptype
+ $ktorrent stopAll $stoptype
+ echo "Torrents of type $stoptype Stopped"
+ ;;
+ "6")
+ read -p "Enter full path to the torrent: " tpath
+ $ktorrent openTorrentSilently "$tpath"
+ echo "$tpath added"
+ ;;
+ "7")
+ settings
+ return
+ ;;
+ "8")
+ return
+ ;;
+ "9")
+ about
+ return
+ ;;
+ "10")
+ exit 0
+ ;;
+ esac
+ done
+}
+
+init () {
+ if ! which dcop 2>/dev/null >/dev/null; then
+ echo "The dcop command line client cannot be found"
+ exit 1
+ fi
+ dcop="dcop"
+ ktorrents=( `$dcop 2>/dev/null` )
+ if (( $? != 0 )); then
+ echo "Looking for DCOP servers..."
+ local IFS='
+'
+ usernms=( `ps -C dcopserver --no-heading -o user` )
+ unset IFS
+ if (( ${#usernms[*]} == 0 )); then
+ echo "There is no DCOP server running."
+ exit 1
+ fi
+ echo "Found a DCOP server."
+ usernm=${usernms[0]}
+ if (( ${#usernms[*]} > 1 )); then
+ echo "Which user's DCOP server do you wish to connect to?"
+ select usernm in ${usernms[*]}; do
+ break
+ done
+ fi
+ local IFS='
+ '
+ sessnms=( `dcop --user $usernm --list-sessions | tail -n +2 | head -n -1` )
+ unset IFS
+ if (( ${#sessnms[*]} == 0 )); then
+ echo "Found no session."
+ exit 1
+ fi
+ echo "Found a DCOP session."
+ sessnm=${sessnms[0]}
+ if (( ${#sessnms[*]} > 1 )); then
+ echo "Which session of the user's DCOP server do you wish to connect to?"
+ select sessnm in ${sessnms[*]}; do
+ break
+ done
+ fi
+ dcop="dcop --user $usernm --session $sessnm"
+ ktorrents=( `$dcop 2>/dev/null` )
+ if (( $? != 0 )); then
+ echo "Cannot connect to the DCOP server."
+ exit 1
+ fi
+ fi
+ echo "Connected to a DCOP server."
+ unset ktorrentid
+ for A in ${ktorrents[*]}; do
+ if [ "x${A:0:8}" = "xktorrent" ]; then
+ ktorrentid=$A
+ echo "Found KTorrent."
+ break
+ fi
+ done
+ if [ "x$ktorrentid" = "x" ]; then
+ echo "KTorrent is not running in the KDE session for this DCOP server."
+ echo "You can start KTorrent with something like \"ktorrent --display :0\""
+ echo "while logged in as a user who has KDE running."
+ exit 1
+ fi
+ dcops=( $dcop )
+ dcop=${dcops[0]}
+ for A in ${dcops[*]:1}; do
+ dcop="$dcop
+$A"
+ done
+ ktorrent="$dcop
+$ktorrentid
+KTorrent"
+ ktorrentp="$dcop
+--pipe
+$ktorrentid
+KTorrent"
+}
+
+init
+while true; do
+ mainmenu
+done
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/stamp-h.in
diff --git a/subdirs b/subdirs
new file mode 100644
index 0000000..98c0567
--- /dev/null
+++ b/subdirs
@@ -0,0 +1,5 @@
+apps
+libktorrent
+plugins
+scripts
+translations
diff --git a/templates/cpp b/templates/cpp
new file mode 100644
index 0000000..c4b5141
--- /dev/null
+++ b/templates/cpp
@@ -0,0 +1,19 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
diff --git a/templates/h b/templates/h
new file mode 100644
index 0000000..c4b5141
--- /dev/null
+++ b/templates/h
@@ -0,0 +1,19 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
diff --git a/translations/Makefile.am b/translations/Makefile.am
new file mode 100644
index 0000000..bd618b4
--- /dev/null
+++ b/translations/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= ar bg br ca cs cy da de el en_GB es et fa fr gl hu it ja ka lt ms nb nds nl pa pl pt pt_BR ru rw sk sr sr@Latn sv tr uk zh_CN zh_TW
diff --git a/translations/ar/Makefile.am b/translations/ar/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/ar/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/ar/messages/Makefile.am b/translations/ar/messages/Makefile.am
new file mode 100644
index 0000000..f01035c
--- /dev/null
+++ b/translations/ar/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = ar
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/ar/messages/ktorrent.po b/translations/ar/messages/ktorrent.po
new file mode 100644
index 0000000..df3779c
--- /dev/null
+++ b/translations/ar/messages/ktorrent.po
@@ -0,0 +1,4827 @@
+# translation of ktorrent.po to Arabic
+#
+# محمد سعد Mohamed SAAD <metehyi@free.fr>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2006-12-21 15:38+0100\n"
+"Last-Translator: محمد سعد Mohamed SAAD <metehyi@free.fr>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "المعلومات"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "البيانات المنقولة خلال الجلسة الحالية"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "مجموع سرعة كلّ السيول الحالية"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "المجموعات"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "إبدأ"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "قِف"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "إبدأ الكلّ"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "قِف الكلّ"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "إفتح مسيير صف الإنتظار..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "صف/أحذف من الصف"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "ملفات السيول"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "كلّ الملفات"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "إفتح الموقع"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "السرعة تنزيل: %1 / تحميل: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "المنقولة نزولاً: %1 / تحميلاً: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "كل السيول"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "أ&نقل للإعلى"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "أ&نقل للإعلى"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "أ&نقل للإعلى"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "إختر ملفاً"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "إختر إسم ملف للحفظ"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "المنزلة"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "المحملة"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "غير قادر على إنشاء السيل: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "غير قادر على إنشاء الملف %1 : %2"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "ملفات البيانات ناقصة"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "غير قادر على محو %1: %2"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "غير قادر على إنشاء الملف %1 : %2"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "خطأ عند الكتابة إلى %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "مسح البيانات"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "المستند لفتحه"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "الخيارات العامة"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "الخيارات العامة"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "الخيارات العامة"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "مسار المجلّد3"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "يجب أن تختر ملفاً أو مجلّداً."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "يجب أن تختر ملفاً أو مجلّداً."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "جاري إنشاء %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "مجموعة جديدة"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "حرر الإسم"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "أحذف المجموعة"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "الرجاء إدخال إسم المجموعة."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "المجموعة %1 موجودة مسبقاً."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "الرجاء إدخال إسم المجموعة الجديد."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "المحملة"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+#, fuzzy
+msgid "Queued uploads"
+msgstr "مصفوف"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "عدد التنزيلات الأقصى:"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "منزل:"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "المحملة"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "أنشئ سيل"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "منزل:"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "المحملة"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "كل السيول"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "منزل:"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "أحذف السيل"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "أحذف السيل و البيانات"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "أضف نظير..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "مصادر نظير إضافية"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+#, fuzzy
+msgid "Torrent Peer Sources:"
+msgstr "مصادر نظير إضافية"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "إعلان يدوي"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "معاينة"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "إفتح الدليل..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "دليل البيانات"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "الدليل المؤقت"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "خيارات التنزيل"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "أحذف من المجموعة"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "أضف إلى المجموعة"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, fuzzy, no-c-format
+msgid "Speed Limits"
+msgstr "حدّ السرعة بِـ ك. بايت/ث"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "التفضيلات"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "خيارات التنزيل"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "عام"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "الخيارات العامة"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "الخيارات المتقدمة"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "الحالة"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "منزل"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "الحجم"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "سرعة التنزيل"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "سرعة التحميل"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "الوقت الباقي"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "النسبة الأقصى:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "منزل"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "الوقت الباقي"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "كل السيول"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+#, fuzzy
+msgid "Delete Data"
+msgstr "أم&حي"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "المستخدم"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "مسيير صف الإنتظار"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "مسح البيانات"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "حدّ السرعة بِـ ك. بايت/ث"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "غير محدود"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+#, fuzzy
+msgid "Speed limits for <b>%1</b>:"
+msgstr "حدّ السرعة بِـ ك. بايت/ث"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Mohamed SAAD محمد سعد"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "metehyi@free.fr"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "إختر أي من الملفات تريد تنزيلها"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "نزّل"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Group:"
+msgstr "المجموعات"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "منزل:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "أنشئ سيل"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "نزّل"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "إختر ال&كلّ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "إختر لا &شيء"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "منزل:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "إستعمل تشفير الميفاق"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "إسمح بلإتصالات غير المشفرة"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "المجلّدات"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "المجلّد حيث يتم حفظ الملفات المؤقتة:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "ملفات السيول"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "شريط أدوات التنزيل"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "النسبة الأقصى:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "عدد التنزيلات الأقصى:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "ك. بايت/ث ( 0 يعني لا حدّ )"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "أضف نظير محتمل"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "عنوان ميفاق الإنترنت للنظير:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "المنفذ:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "أدخل عنوان ميفاق الإنترنت و المنفذ للنظير."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "عنوان ميفاق الإنترنت للنظير"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "أضف النظير:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&أمحي"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "يمحي هذه اللائحة"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "إحفظ &كـ..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "عدد التنزيلات الأقصى:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "( 0 يعني لا حدّ )"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Global connection limit:"
+msgstr "حدّ الإتصال الإجمالي"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "عدد التنزيلات الأقصى:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "ك. بايت/ث ( 0 يعني لا حدّ )"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "( 0 يعني لا حدّ )"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "إنتباه"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "الحالة:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "البايتات المتبقية:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "السيل"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "أ&نقل للإعلى"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "أنقل للأ&سفل"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "أ&نقل للإعلى"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&موافق"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "إ&لغاء"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "أنشئ سيل"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "خيارات الملف"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "ك. بايت"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "الملاحظات:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "أن&شئ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "أ&لغي"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "لا شيئ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "التفضيلات المتقدمة"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "محرك البحث الحالي"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "الإداء"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "إستعمال الذاكرة:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "منخفض"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "متوسط"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "عالي"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "فترة تحديث واجهة المستخدم الرسزمية:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ملي ث"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "ثانية واحِدة"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "ثانيتين إثنتين"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "خمس ثوان"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, fuzzy, no-c-format
+msgid "Data Checking"
+msgstr "جاري فحص البيانات"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "الشبكة"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "مسح البيانات"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, fuzzy, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "مسح البيانات"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "الإختبار"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "المجلّد حيث يتم حفظ الملفات المؤقتة:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "المجلّد حيث يتم حفظ الملفات المؤقتة:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "إستعمال الذاكرة"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "حمل"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "لا &تحمل"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "حمل الكلّ"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "لا تحمل الكل"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "الأجهزة المكتشفة:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "الجهاز"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, fuzzy, no-c-format
+msgid "WAN Connection"
+msgstr "الإتصالات:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "إعادة المسح"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "تمكين مسح المجلّد1 ؟"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "تمكين مسح المجلّد2 ؟"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "تمكين مسح المجلّد3 ؟"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "مسار المجلّد1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "مسار المجلّد2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "مسار المجلّد3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "إمسح المجلّد &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "إمسح المجلّد &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "إمسح المجلّد &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "المجلّدات لمسحها"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "المجلّد 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "المجلّد 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "المجلّد 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "تفضيلات البحث"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "إختر لا &شيء"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "المستخدم"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "الخيارات العامة"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "المجموع:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "حالياً يجري تنزيل:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "منزل:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "الحجم:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "التقدم"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "النظير"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "متوسط سرعة التنزيل:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "متوسط سرعة التحميل:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "التحديث التالي في:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, fuzzy, no-c-format
+msgid "Ratio limit:"
+msgstr "حدّ الإتصال الإجمالي"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "&إستعمل الحدّ ؟"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "فترة التحديث الأدنى - 60 ثانية"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "إستعد الإفتراضيات"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "أعرض لائحة النظائر"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "فترة تحديث واجهة المستخدم الرسزمية:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "متوسط"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "عدد التنزيلات الأقصى:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "عنوان ميفاق الإنترنت للنظير:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "الإتصالات:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "المحملة"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "الإتصالات:"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "السيل:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "البيانات:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&إستورد"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "الإفتراضي"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "أم&حي"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&جديد"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "إنتعاش &تلقائي"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "أنعش"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "ال&عنوان"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&نشط"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "المرشحات"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "أقبل المرشحات"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "أرفض المرشحات"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "العبارات المنتظمة"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "إ&ختبر"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "أ&وقف التشغيل"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "ال&عادي"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "منزل:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "محمل:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "ك. بايت/ث *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 يغني لا حدّ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "إحفظ إلى الملف"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&حمل من الملف"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "إستعادة الجدول"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&موافق"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "حرر ال&جدول"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "الخيارات العامة"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "الكل"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "ملاحظة"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "هام"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "لا شيئ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "الخيارات العامة"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "النظام"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "العام:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "الإتصالات:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "متصفح خارجي"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, fuzzy, no-c-format
+msgid "Open searches in external browser"
+msgstr "إفتح نتائج البحث في المتصفح ال&خارجي"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "إستعمل المتصفح الإفتراضي"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "مسار المتصفح المعتاد:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "محركات البحث"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "إسم محرك البحث:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&أضف"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "المحركات"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "أ&حذف الكلّ"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "أضف الإفترا&ضي"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "إبحث"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "محرك البحث:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "محرك البحث الحالي"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "إستعمل المتصفح المعتاد"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 ج. بايت"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 م. بايت"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 ك. بايت"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 بايت"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 ك. بايت/ث"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "نعم ، أولاً"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "نعم ، آخراً"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "غير قادر على فتح ملف سجلّ الوقائع %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "غير قادر على الكتابة إلى %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "غير قادر على القراءة من %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "غير قادر على إنشاء الدليل %1 : %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "غير قادر على نقل %1 إلى %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "غير قادر على نسخ %1 إلى %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "غير قادر على محو %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "غير قادر على إنشاء %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "غير قادر على حساب حجم الملف لِـ %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "غير قادر على حساب حجم الملف 1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "غير قادر على فتح %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "غير قادر على فتح الملف %1 : %2"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr ""
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "محمل"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "غير محمل"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr ""
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "غير قادر على فتح الملف %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "الدليل %1 غير موجود"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "خطأ فك ترميز"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "نهاية الإدخال غير متوقعة"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "السيل غير مكتمل !"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr ""
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "غير قادر على إنشاء %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "إختر المجلّد للحفظ بِهِ"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr ""
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "موقف"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "الخطأ: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "مصفوف"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "جاري فحص البيانات"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "خطأ إيقاف السيل %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "خطأ بدء تشغيل السيل %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "زبون غير معروف"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "غير قادر على إنشاء الملف %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "غير قادر على فتح الملف %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "غير قادر على فتح الملف %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "خطأ عند القراءة من %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "خطأ عند الكتابة إلى %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "خطأ عند الكتابة إلى %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr ""
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr ""
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr ""
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr ""
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr ""
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "إمسح المجلّد &1"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr ""
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "الخيارات العامة"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+#, fuzzy
+msgid "Please enter a new password for the web interface."
+msgstr "الرجاء إدخال إسم المجموعة الجديد."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "الدليل %1 غير موجود"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+#, fuzzy
+msgid "%1 is a directory"
+msgstr "دليل البيانات"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "الخيارات العامة"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "&إستعمل الحدّ ؟"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "المرشحات"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr ""
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "الحالة"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "الإتصالات:"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "الإتصالات:"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "لا شيئ"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+#, fuzzy
+msgid "Speed statistics"
+msgstr "حدّ السرعة بِـ ك. بايت/ث"
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "الإتصالات:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "السيل"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "&إستعمل الحدّ ؟"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "متوسط سرعة التنزيل:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "متوسط سرعة التنزيل:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "متوسط سرعة التنزيل:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "المجلّدات"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "المجلّدات"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr ""
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+#, fuzzy
+msgid "Title"
+msgstr "ال&عنوان"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "الوصف"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "الوقت الباقي"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "الإثنين"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "الثلاثاء"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "الأربعاء"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "الخميس"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "الجمعة"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "السبت"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "الأحد"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "تم حفظ الجدول."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "لم يعثر على الملف."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "تم تحميل الجدول."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr ""
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "جاري البحث عن %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr ""
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr ""
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "المحركات"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "منزل"
+
+#~ msgid "Max ratio:"
+#~ msgstr "النسبة الأقصى:"
+
+#~ msgid "Name"
+#~ msgstr "الإسم"
+
+#~ msgid "Author"
+#~ msgstr "المؤلف"
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "إختر المجلّد للحفظ بِهِ"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "التنزيلات %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "التحميلات %1/%2"
+
+#~ msgid "Torrents"
+#~ msgstr "السيول"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "الحالة"
+
+#~ msgid "Search Engine:"
+#~ msgstr "محرك البحث:"
+
+#~ msgid "Clear Search Histor&y"
+#~ msgstr "أمحي خط البحث ال&زمني"
diff --git a/translations/bg/Makefile.am b/translations/bg/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/bg/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/bg/messages/Makefile.am b/translations/bg/messages/Makefile.am
new file mode 100644
index 0000000..869f213
--- /dev/null
+++ b/translations/bg/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = bg
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/bg/messages/ktorrent.po b/translations/bg/messages/ktorrent.po
new file mode 100644
index 0000000..57a568e
--- /dev/null
+++ b/translations/bg/messages/ktorrent.po
@@ -0,0 +1,4895 @@
+# translation of ktorrent.po to Bulgarian
+# translation of ktorrent.po to
+#
+# Златко Попов <zlatkopopov@fsa-bg.org>, 2005.
+# Zlatko Popov <zlatkopopov@fsa-bg.org>, 2005, 2006, 2007, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-03-04 21:53+0000\n"
+"Last-Translator: Zlatko Popov <zlatkopopov@fsa-bg.org>\n"
+"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Няма вх. връзки (вероятно има защитна стена)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Информация"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Данни, прехвърлени през текущата сесия"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Обща скорост на всички торенти"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Групи"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Стартиране"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Спиране"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Стартиране на всички"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Спиране на всички"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Поставяне адреса на торента..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Мениджър на опашката..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Поставяне или премахване от опашката"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-блокиране"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Проверка цялостта на данните"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Максимална скорост на качване"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Максимална скорост на сваляне"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Торент файлове"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Всички файлове"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Отваряне на местоположение"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Скорост на сваляне: %1 / качване: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Прехвърлени при сваляне: %1 / качване: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 възела, %2 задачи"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: изкл."
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Всички торенти"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Търсене:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Чувствителен регистър"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Преместване отляво"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Преместване отдясно"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Преместване отдолу"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Свързване на ускорител..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Изчистване на ускорител"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Промяна номера на бутона"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Нов номер на бутона:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Трябва да въведете IP във формат \"XXX.XXX.XXX.XXX\". Можете също да използвате "
+"заместител като \"127.0.0.*\"."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Изберете файл"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Изберете име с което искате да запишете файла"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Неправилен адрес (URL)."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Сваляния"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Качвания"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Зададеният порт (%1) е невалиден или се използва от друга програма. KTorrent ще "
+"използва порт %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent не може да приеме връзки, защото портовете %1 и %2 вече се използват "
+"от друга програма."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Грешка при създаване на торент: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Няколко файла с данни на торент \"%1\" липсват. Искате ли да ги възстановите "
+"или не искате да ги сваляте?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Ново създаване"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Без сваляне"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Не могат да бъдат наново създадени липсващите файлове: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Липсват файловете с данни"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Не могат да бъдат размаркирани липсващи файлове: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Файлът, съхраняващ информацията за торент \"%1\", липсва. Искате ли да го "
+"създадете отново?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Без ново създаване"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Не може да бъде създаден файл с данни: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Файлът с данни липсва"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Проверка цялостта на данните"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "безкрайно"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Грешка при сканиране на данните: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Сканиране на <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Бит Торент клиент за KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Режим на търсене на грешки"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr "Тих запис на торента от адреса"
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Документ за отваряне"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS приставка"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Приставка за уеб-интерфейса"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Приставка за статистика"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Икона за приложение и няколко други"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Икона за сваляне"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Икона за приложение 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Подсказки за ChunkBar и IWFileTreeItem сортиране"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Намиране на страна - приставка за InfoWidget (Този продукт съдържа данни за "
+"GeoLite от MaxMind на адрес http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Страна"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Приоритет на файл"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp беше използван като пример за изпълнението на нашия UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Глобален макс. коефициент за споделяне"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Подобрения - Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "ГПИ \"студено мляко\""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl код от KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Подобрения в скоростта в приставката ipfilter"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Откриване на 2 уязвимости (и двете са поправени)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Кръпка за тихо зареждане"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Кръпки в PHP кода на уеб интерфейса"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS прехвърляния"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Не показване на много ниски скорости"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Показване на състояние потенциално зад защитна стена"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Няколко кръпки"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Кръпка за скриване на лентата с менюто"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Кръпка за промяна на приоритета на ГПИ"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Няколко кръпки"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Кръпка за филтъра"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Кръпка за изгледа на файловете"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Оптимизация за SHA1"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Кръпка за изчислението на свободното място (FreeBSD)"
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr "Кръпка за тихо зареждане от команден ред"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Трябва да изберете файл или папка."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Не сте добавили координиращ сървър. Сигурни ли сте, че искате да създадете "
+"торента?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Трябва да добавите поне един възел."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Торент файлове (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Изберете файл за записване на торент"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Създаване %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Потребителски групи"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Нова група"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Редактиране на името"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Премахване на група"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Отваряне на подпрозорец"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Моля, въведете името на групата."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Вече има група %1."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Моля, въведете името на новата група."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Активни качвания"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "На опашката"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "На опашката за сваляне"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Сваляния (потр.)"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Качвания (потр.)"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Неактивни торенти"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Неактивни сваляния"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Неактивни качвания"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Активни торенти"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Активни сваляния"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Премахване на торента"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Премахване на торента и данните"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Добавяне на потребители"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Допълнителни потребители"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Торент потребители:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT (протокол за размяна между децентрализирани потребители)"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Размяна между потребители"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Ръчно известяване"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Преглед"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Отваряне на директория"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Директория с данни"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Временна директория"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Настройване директорията на сваляне"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Премахване от групата"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Добавяне към групата"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Ограничение на скоростта"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"Торентът не съществува. Моля, съобщете тази грешка на разработчиците на "
+"KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Добавен е потенциален потребител."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Неправилен IP адрес."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Настройки"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Настройки на свалянията"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+"DHT портът трябва да бъде различен от порта на UDP координиращия сървър!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Общи"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Общи настройки"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Не може да търсите %1 : %2\n"
+"Моля, посочете валиден IP адрес или име на хост."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Разширени"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Разширени настройки"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Видими колони"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Състояние"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Свалени"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Размер"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Качени"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Скорост на сваляне"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Скорост на качване"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Оставащо време"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Качващи"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Свалящи"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "Завършено"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Коеф. сп."
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Време на сваляне"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Време на качване"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Всички торенти %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Не можете да стартирате повече от 1 сваляне, \n"
+"Не можете да стартирате повече от %n сваляния, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"и 1 качване. \n"
+"и %n качвания. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Ако искате да промените ограничението, отидете в \"Настройки->"
+"Настройване на KTorrent\"."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Свалянето на торент %1 не е завършено. Искате ли да изтриете непълната "
+"информация?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Премахване на изтегляне"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Премахване"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Съхранение"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Ще загубите всички свалени данни. Сигурни ли сте, че искате да го направите?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Вече проверявате данните на торент %1 !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Изберете местоположение на сваляне за %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Размаркирахте следните файлове. Ще загубите всички данни в тях. Сигурни ли сте, "
+"че искате да го направите?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Да, изтриване на файловете"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Не, запазване на файловете"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " не достигат!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Потребител"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Мениджър на опашката"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Не (частен торент)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Скорост:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Сваляне: <font color=\"#1c9a1c\">%1</font></td>"
+"<td>Качване: <font color=\"#990000\">%2</font></td></tr>"
+"<tr>"
+"<td><b>Прехвърлени:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Сваляне: <font color=\"#1c9a1c\">%3</font></td>"
+"<td>Качване: <font color=\"#990000\">%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"Завърши свалянето на <b>%1</b>. "
+"<br>Средна скорост: %2 сваляне / %3 качване."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Свалянето завършено"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> достигна максималният си коефициент %2 и беше спрян."
+"<br>Качени са %3 със средна скорост %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Качването завършено"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> достигна максималното време за качване от %2 часа и беше спрян. "
+"<br>Качени са %3 със средна скорост %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> беше спряно поради следната грешка: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Намерени са повредени данни в торент <b>%1</b>"
+"<br>Добра идея е да направите проверка на цялостта на данните на торента."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> достигна максималният си коефициент за %2 и беше спрян. Премахнете "
+"ръчно ограничението, ако искате да продължите качването."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> достигна максималното време за качване от %2 часа и беше спрян. "
+"Премахнете ръчно ограничението, ако искате да продължите качването."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Торентът не може да бъде сложен на опашка."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Невъзможно стартиране на <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Не можете да качвате повече от 1 торент. "
+"<br>\n"
+"Не можете да качвате повече от %n торента. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Не можете да сваляте повече от 1 торент. "
+"<br>\n"
+"Не можете да сваляте повече от %n торента. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Торентът не може да бъде стартиран"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Няма достатъчно свободно дисково пространство."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "Мястото на диска ви се изчерпва.<br /><b>%1</b> се сваля в \"%2\"."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Торентът е спрян.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Свършва мястото"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Ограничение на скоростта в кБ/сек"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Неограничена"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Ограничение на скоростта за <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Приложение за KPart в KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Не може да бъде отворен кеш файл %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Красимира Минчева"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "krasimira_m@yahoo.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Изберете файлове за сваляне"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Сваляне в:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Група:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Контролирано от &потребителя"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Стартиране на торента"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Сваляне"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Маркиране на &всички"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&Размаркиране на всички"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Обръщане на маркировката"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Дисково пространство"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Необходимо дисково пространство:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Свободно дисково пространство:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "След сваляне:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Шифроване"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Шифроване на протоколите"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Шифроването на протокола се използва за да не може Интернет доставчика да "
+"забавя връзките."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Нешифровани връзки"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Ако е изключено, ще можете да се свързвате само с клиенти, които поддържат "
+"шифроване."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able"
+"<br>Протокол за размяна между децентрализирани потребители. За повече "
+"информация вижте ръководството"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Използване на DHT за намиране на потребители"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP порт за комуникация с DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Потребителско IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+"&Изпращане на потребителското IP или името на хоста на координиращ сървър"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Потребителско IP или име на хост:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Икона в системния панел"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Показване на &икона в системния панел"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Показване на &лента за скоростта в системния панел"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Показване на изскачащи съобщения в системния панел"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Лента на качване (кБ/сек):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Лента на сваляне (кБ/сек):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Директории"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Папка за съхранение на временните файлове:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Преместване на свалените в:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Автоматично записване на свалянията в:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Копиране на .torrent файловете в:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Лента с инструменти за сваляне"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Задаване ограничения на скоростта за торент"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Макс. скорост на качване:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Макс. скорост на сваляне:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "кБ/сек (0 = без ограничение)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Добавяне на потенциален потребител"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Потребителско IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Порт:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Въведете IP и порт на потребителя."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Черен списък на KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Забележка: Черният списък се отнася само за текущата сесия. За да го запишете "
+"натиснете бутона \"Запис като...\" или използвайте приставката за филтриране по "
+"IP в раздела \"Настройване на KTorrent\"."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Блокирани потребители"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "IP адрес на потребител"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Добавяне на потребител:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Добавяне на потребител към черния списък"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Премахване на маркирания потребител от черния списък"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Изчистване"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Изчистване на списъка"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Запис &като..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Запис на черния списък, за да бъде използван с приставката за филтриране по IP"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Максимално сваляния:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Максимално качвания:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Сваляне при малко дисково пространство :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Минимално дисково пространство:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Без стартиране"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Питане винаги"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Принудително стартиране"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "МБ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 = без ограничение)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Максимална скорост на сваляне:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Ограничение на глобалната връзка:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Макс. време на качване:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Максимално връзки за торент:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Брой слотове при качване:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Порт на UDP координиращ сървър:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Макс. коефициент на споделяне:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Максимална скорост на качване:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "кБ/сек (0 = без ограничение)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "часа (0 = без ограничение)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Продължаване на качването след като свалянето завърши"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Внимание"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Ако сте зад маршрутизатор горните портове трябва да бъдат пренасочени. "
+"Приставката UPnP може да го направи вместо вас."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Опашка - КТ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Състояние:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Координиращ сървър:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Коефициент на споделяне:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Остават:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Торент"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Контролирано от"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Качвания"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Качени:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "П&реместване нагоре"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Преместване на&долу"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Преместване отгоре"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Преместване &отдолу"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Контролирано от &мениджъра на опашката"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Контролирано от &потребителя"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Поставяне на адрес (URL)"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "Адрес (URL):"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "О&К"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Отмяна"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Създаване на торент"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Файлът или папката, която искате да направите торент:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Трябва да добавите поне един координиращ сървър или възел."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Настройки на файл"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Големина на всяко парче:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "кБ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "&Качване на торента"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "&Децентрализирано (само DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Частен торент (DHT не е разрешен)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Коментари:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Създаване"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Отмяна"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Координиращи сървъри"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT възли"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Възел:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP или име на хост"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Порт"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"ЗАБЕЛЕЖКА: Вече са вмъкнати някои добри DHT възли. Може би е по-добре да "
+"напишете IP адреса и порта си, ако смятате да качвате този торент."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Разширени настройки"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr "Алгоритъм за оставащото време:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent алгоритъм:</b> Алгоритъмът по подразбиране, който използва други "
+"алгоритми, базирани на тестовете ни."
+"<br>\n"
+"<b>Алгоритми за скорост:</b> Най-простият алгоритъм - Байтове/Скорост"
+"<br>\n"
+"<b>Алгоритъм за средна скорост:</b> Байтове/Средна скорост"
+"<br>\n"
+"<b>X алгоритъм:</b> ЕТ се изчислява от скоростта Х"
+"<br>\n"
+"<b>Алгоритъм за преместване:</b> Средна скорост на преместване, изчислена от Х"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Текуща скорост"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Средна скорост"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Х"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Средно преместване"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(активира се след рестартиране)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "&Изключване преразпределянето на дисковото пространство"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+"Пълно преразпределяне на &дисковото пространство (избягва фрагментацията)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Основно (бавно)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Особености на файловата система"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Натоварване"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Използвана памет:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Малко"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Средно"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Много"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Интервал за обновяване на ГПИ:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 мс"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Бърз процесор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Бавен процесор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Проверка на данните"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "По време на качване да &не се проверяват наново парчета по-големи от"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Проверка &цялостта на данните след"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "повредени парчета"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Мрежа"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Максимално връзки за торент:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP за IP пакети:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Без използване &проксито на KDE за връзки към HTTP координиращ сървър"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Прокси на HTTP координиращ сървър:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Сканиране на данни"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Сканиране данните на торент :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Намерени парчета:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Ненамерени / несвалени парчета:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Тест"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Максимално сваляния (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Максимално качвания (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Започване на сваляне при малко дисково пространство?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Максимално връзки за торент (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Максимално връзки за всички торенти (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Максимална скорост на качване в кБ/сек (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Максимална скорост на сваляне в кБ/сек (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Максимален коефициент за споделяне (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Максимално време за качване (0 = без ограничение)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Показване на икона в системния панел"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Показване на лента със скоростта в системния панел"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Скорост на сваляне (кБ/сек):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Скорост на качване (кБ/сек):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Показване на изскачащо съобщение когато торентът е готов."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Продължаване на качването след като свалянето завърши"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Папка за временните файлове"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Дали свалянията автоматично да се записват в saveDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Папка за свалените файлове"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Дали свалянията автоматично да се записват в completedDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Папка за свалените файлове"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Дали свалянията автоматично да се записват в директорията"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Папка за копиране на .torrent файловете"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Дали потребителското IP да се изпраща на координиращия сървър"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Директория, използвана като последната директория за сваляне"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP, което да бъде изпратено на координиращия сървър"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Използвана памет"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Интервал за обновяване на ГПИ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Поддръжка за DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT порт"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Брой слотове за качване"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Видими колони в KTorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "ЕТ алгоритъм"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Когато няма останало място за свалянето на торента или е по-малко от минимално "
+"зададеното, свалянето ще бъде спряно."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Мениджър на приставките"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Включване"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Изключване"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Включване на &всички"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Изключване на всички"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "UPnP устройство по подразбиране"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Открити устройства:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Устройство"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Портовете са пренасочени"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN връзки"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "&Пренасочване на портове"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Отмяна на пренасочването към портове"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Ново сканиране"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Сканиране на директория 1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Сканиране на директория 2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Сканиране на директория 3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Път до директория 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Път до директория 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Път до директория 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Дали торентът да бъде тихо отворен или не."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Премахването е отметнато."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Преместването е отметнато."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Настройки на търсенето"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Сканиране на директория &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Сканиране на директория &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Сканиране на директория &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Преместване в директория \"Качени\" след като качването завърши"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+"Преместване на торента в директория \"Качени\" след приключване на качването"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "&Тихо отваряне на торентите"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Без показване на прозореца \"Избор на файлове за качване \""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Премахване след като &качването завърши"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Премахване на торента след като качването му завърши"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Сканирани директории"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Директория 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Директория 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Директория 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Настройки на търсенето"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Уеб сървър"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Пренасочване на порт"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL на сесия (сек.):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Маркиране на интерфейс:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Потребител:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Промяна на паролата..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Изпълним път за РНР:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Порт номер"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "пренасочване на порт"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Време на сесия"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Кожа на интерфейса"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Изпълним път на РНР"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "потребител"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "парола"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Парчета"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Общо:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "В момента се свалят:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Свалени:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Изключени:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Оставащи:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Размер:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Парче"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Завършено"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Потребител"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Приети връзки"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Качващи:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Свалящи:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Средна скорост на сваляне:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Средна скорост на качване:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Следващо обновяване след:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Състояние на координиращ сървър:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Свалени части от файла:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Налични части от файла:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Споделяне"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Качването ще спре когато коефициента на споделяне достигне тази стойност. 0=без "
+"ограничение."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Качването ще спре когато достигне тези часове."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "часа"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Ограничение на коефициента:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Ограничението работи само в режим \"качване\""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Ограничение на времето:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Обновяване"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Максимален интервал за обновяване - 60 сек."
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "&Добавяне"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Премахване"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "&Промяна"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "По подразбиране"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Показване на подпрозорец за потребителя в главния прозорец"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Показване на подпрозорец за сваляне в главния прозорец"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Показване на подпрозорец за координиращия сървър в главния прозорец"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Показване на списъка с потребители"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Показване на списъка с текущо сваляните па&рчета"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Показване на списъка с координиращи сървъри"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Настройки на IP-блокировката"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Избор на файл за филтъра по IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Филтриране по IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Файл за филтриране по IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Свал&яне/Конвертиране"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Сваляне на филтъра от bluetack.co.uk или blocklist.org.\n"
+"ЗАБЕЛЕЖКА: bluetack.co.uk поддържа формата ZIP."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Адрес на филтър за ниво 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Използване на филтър за ниво 1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Конвертиране..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Натиснете бутона \"Конвертиране\" за да започне конвертиране на antip2p файла. "
+"ЗАБЕЛЕЖКА: Този процес може да отнеме известни време дори на бързи машини. През "
+"това време няма да можете да използвате KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Обновяване"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Обновяване на всеки"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Обновяване на ГПИ"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Събиране на данни на всеки"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "милисек."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Максимално"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Максимална скорост:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Фиксирана"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "За повече информация вижте \"какво е това?\""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Задайте максималната скорост за OY\":\n"
+"- Пикова: максимална скорост\n"
+"- Фиксирана: максимална скорост, която е видима в таблицата"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Потребителска скорост"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Потребителска скорост:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "обновяване на всеки"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "обновяване на таблицата"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Ако се събрат данни за много потребители, това може да натовари процесора."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Връзки"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Големите стойности могат да засенчат данните за потребителите"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Показване на качващите като множество"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Показване на свалящите като множество"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Брояч"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Качване"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Връзки"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Потребители"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Вкл/изкл на брояча за скоростта"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Интервал между две събирания на данни за скоростта"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Вкл/изкл на брояча за свалящите"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Вкл/изкл на брояча за качващите"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Брояч на свалянията"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Брояч на скоростта"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Брояч на качванията"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Брояч на връзките"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Брояч на DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Макс. OY ос"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Импортиране на съществуващо сваляне"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Торент:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Данни:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Моля, посочете торента и данните, които вече за свалени от този торент."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Импортиране"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "по подразбиране"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Rss източници"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Източници"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Премахване"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Нов"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&Адрес (URL)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Статии"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Авто&обновяване"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "&Игнориране на TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Презареждане"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Заглавие"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Запазване на статиите (дни)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Активни"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Филтри"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Приемане на филтри"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Отхвърляне на филтри"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Регулярни изрази"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Третиране като &серии"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Процес"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Критерии за серия"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Съвпадане без епизод"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Макс. епизод"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Макс. сезон"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Мин. сезон"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Мин. епизод"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Тестване на &текст"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Тест"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Съвпадения на филтъра"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "График"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Щракнете с левия бутон върху категория"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Категория &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Изключване"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Нормално"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Категория &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Категория &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Щракнете с десния бутон върху категория"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Категория &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "Категория &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Категории"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Категория</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Категория</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "сваляне:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "качване:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "кБ/сек *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Категория</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "0 = без ограничение"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Запис във файл"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Зареждане от файл"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Анулиране на графика"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "О&К"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Страница за настройка на приставката за графика"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Използване на &график"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "График"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Използване на цветове вместо &пикселкарти"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Препоръчително за по-бавни компютри)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Редактиране на &графика"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Включване на графика за лентата?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Използване на цветове вместо пикселкарти?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Богато оформление"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Флаг на съобщенията за обща информация"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Флаг на съобщенията за връзките"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Флаг на DHT съобщенията"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Флаг на съобщенията с информация от координиращия сървър"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Флаг на съобщенията за приставката за вх/изх"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Флаг на съобщенията за приставката за филтриране по IP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Флаг на съобщенията за приставката за търсене"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Флаг на съобщенията за приставката частично импортиране на файлове"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Флаг на съобщенията за приставката за информация"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Флаг на съобщенията за приставката за UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Флаг на съобщенията за приставката за сканиране на директории"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Флаг на съобщения за приставката за графика"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Флаг на съобщенията за RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Флаг на съобщенията за приставката за уеб-интерфейса"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Настройки на дневника"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Приставки"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Всички"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Отстраняване на грешки"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Бележка"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Важно"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Без"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-филтър:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Търсене:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Сканирани директории:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "График:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Информация:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS приставка:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Приставка за уеб-интерфейса:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Система"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Общи:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Връзки:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Диск - вх/изх:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Използване на &богато оформление"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Външен браузър"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Отваряне на резултатите от търсенето във външен браузър"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Използване на браузъра по подразбиране"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Път до потребителски браузър:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Търсачки"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Име на търсачката:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Добавяне"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Търсачки"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "Адрес (URL)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Премахване на всички"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "&Добавяне по подразбиране"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Обновяване от Интернет"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Търсене"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Търсачка:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Използвана търсачка"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Използване на потребителски браузър"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Изпълним път на браузъра"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 ГБ"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 МБ"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 кБ"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 Б"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 кБ/сек"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+" 1 ден \n"
+"%n дни "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Да, първо"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Да, последно"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Не може да бъде отворен журнален файл %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Невъзможен запис в %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Не може да се чете от %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Не може да се създаде директория %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Не може да се създаде препратка на %1 в %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Не може да се премести %1 в %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Не може да се копира %1 в %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Не може да се изтрие %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Не може да бъде създаден %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Размерът на файла %1 не може да бъде изчислен: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Размерът на файла не може да бъде изчислен : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Не може да бъде отворен %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Файл %1 не може да бъде разширен"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Файлът не може да бъде разширен"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Не може да се търси във файл: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Не може да бъде записвано след края на mmap буфер!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Състояние: <b>%2</b><br>Автор: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Включена"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Не е включена"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Настройки на приставките"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Не може да бъде отворен файл %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Директория %1 не съществува"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Невалиден символ: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Грешка при декодиране"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Неочакван край на въвеждането"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "%1 не може да се преобразува в цяло число"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Торентът е незавършен!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Повреден торент!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Торентът няма попълнени съобщения или възли"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Не може да бъде отворен торент файл %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Грешка при обработка"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Възникна грешка при зареждането на файла. Вероятно торента е повреден или това "
+"въобще не е торент файл.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Възникна грешка при зареждането на торент файла. Вероятно торента е повреден "
+"или това въобще не е торент файл."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Невъзможно създаване на %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Вие вече сваляте торент %1. Списъците с координиращи сървъри на двата торента "
+"бяха обединени."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Вече сваляте торент %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Не може да се премести %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Торентът %1 е бил стартиран с предишна версия на KTorrent. За да сте сигурни, "
+"че ще работи и с тази версия, той ще бъде преместен. Ще бъдете попитани за "
+"местоположение, където да бъде записан. Ако натиснете \"Отмяна\", домашната "
+"директория ще бъде избрана автоматично."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Избиране на папка, в която ще се записва"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Не е стартиран"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Качване"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Сваляне"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Застой"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Спрян"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Грешка: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Преразпределяне на дисково пространство"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "На опашката"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Проверка на данните"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Спрян. Няма свободно място."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Нямате достатъчно свободно място на диска. Сигурни ли сте, че искате да "
+"продължите?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Недостатъчно дисково пространство за %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Торентът \"%1\" достигна максималния коефициент на споделяне. Искате ли да "
+"игнорирате ограничението и да започнете качване?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Достигнато е ограничението на коефициента за споделяне."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Грешка при спиране на торент %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Грешка при стартиране на торент %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Съобщаване"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Непознат клиент"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 потребител\n"
+"%n потребителя"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Не може да бъде създаден файл %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Неуспешен запис на първото парче в DND файл : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Неуспешен запис на последното парче в DND файл : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "%1 не може да бъде отворен за запис - файлът е само за четене"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Файл %1 не може да бъде разширен: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Файл %1 не може да бъде разширен: незавършен запис"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Файл %1 не може да бъде разширен"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Грешка : Четене на край на файла %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Грешка при четене от %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Грешка при запис в %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Грешка при запис в %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Невъзможно преразпределяне на дисковото пространство : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Няма връзка с UDP порт %1 или следващите 10 порта."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Невалиден отговор от координиращия сървър"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Невалидни данни от координиращия сървър"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Невалиден адрес на координиращия сървър"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Не може да бъде отворен файл %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Не може да бъде създаден индексиращ файл: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Не може да бъде отворен файл : %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+"Използване на UPnP за автоматично пренасочване на портове на маршрутизатора ви"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "В списъка не може да бъде открито пренасочващо портовете устройство!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP устройства"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Автоматично сканиране на директория за торент файлове и зареждането им."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Сканиране на директории"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Сканиране на директории"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Настройки на сканиране"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "качени"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Сканиране на директория %1: Това е невалиден адрес или директорията не "
+"съществува. Моля, изберете валидна директория."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Уеб-интерфейс"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Настройки на уеб-интерфейса"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Това не е изпълнимият път по подразбиране за РНР. Моля, въведете го ръчно."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Моля, въведете нова парола за уеб-интерфейса."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 съществува и е изпълним"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 не съществува"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 не е изпълним"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 е директория"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 не е изпълним път на РНР"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Уеб-интерфейс"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Контролиране на KTorrent с браузър"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Сваляне първо"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Свалянето нормално"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Сваляне последно"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Премахване на файла(овете)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Наличен"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Изчакване"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Ще загубите всички данни във файла. Сигурни ли сте, че искате да го направите?\n"
+"Ще загубите всички данни във файловете. Сигурни ли сте, че искате да го "
+"направите?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Без ограничение"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Информация"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Допълнителна информация за торентите (например кои парчета са свалени, колко "
+"качващи и свалящи има и т.н.)"
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Не можете да добавяте координиращ сървър към частен торент."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr ""
+"Не можете да премахнете координиращия сървър по подразбиране на торента."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Не можете да добавяте координиращи сървъри към частен торент"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Страна"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Клиент"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Раздробен"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Спрян"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Наличност"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Точки"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Изключване на всички"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Заявки"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Изхвърляне на потребител"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Блокиране на потребител"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Налични парчета"
+"<br><img src=\"unavailable_color\">&nbsp; - Недостъпни парчета"
+"<br><img src=\"excluded_color\">&nbsp; - Изключени парчета"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Настройки на информацията"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Свалени парчета"
+"<br><img src=\"unavailable_color\">&nbsp; - Парчета за сваляне"
+"<br><img src=\"excluded_color\">&nbsp; - Изключени парчета"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Конвертиране"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Зареждане на txt файл..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Моля, изчакайте..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Файлът е конвертиран."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Не може да бъде зареден филтър:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Лош файл на филтър: Може да е повреден и форматът е друг."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Филтриране по IP на нежеланите потребители"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "Филтриране по IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Състояние: включена и работи."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Състояние: не е включена."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Състояние: <font color=\"#ff0000\">Файлът на филтъра не е открит.</font> "
+"Свалете и конвертирайте файла на филтъра."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Маркираният файл вече съществува. Искате ли да го свалите пак?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Има такъв файл"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Вече има такъв файл на филтъра (ниво1.dat). Искате ли пак да го конвертирате?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Филтриране по IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Настройки на филтрирането по IP"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Статистика"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Настройки на статистиката"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Свалящи"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Свалящи в множеството"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Качващи"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Качващи в множеството"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Средно свалящи за торент"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Средно качващи за торент"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Средно свалящи за текущия торент"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Средно качващи за текущия торент"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Възли"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Задачи"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Показване на статистика за трансфера"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Статистика за скоростта"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Статистика за връзките"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Текуща"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Средно"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Ограничение"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Средно от свалящ"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Средно към свалящ"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Средно от качващ"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "От свалящи"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "От качващи"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Легенда"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Торент файлове"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Всички файлове"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Данните не могат да бъдат сверени : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Грешка при зареждане на торент: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Частично или пълно импортиране на свалените с други клиенти торенти"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Импортиране на съществуващите сваляния"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "Адрес (URL) на източник"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Автоматично сканиране на RSS източници за торенти, съответстващи на регулярните "
+"изрази. Сваляне."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS източници"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Намирането и свалянето на валиден торент за %1 беше неуспешно"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Заглавие"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Описание"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Връзка"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Сезон"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Епизод"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Време"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "График"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Настройка на приставките"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "ПОН"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "ВТ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "СР"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "ЧЕТВ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "ПЕТ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "СЪБ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "НЕД"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Графикът е записан."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Файлът не е намерен."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Графикът е зареден."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "График на торентите"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Отваряне на графика"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Графикът е изключен. За да го включите отидете в \"Настройки->"
+"Настройване на KTorrent->График\"."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Дневник"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Дневник"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Показване на изходните данни на KTorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Използвайте уеб браузъра си и напишете %1 (с големи букви) в търсачката, която "
+"искате да добавите. След това копирайте адреса (URL) от браузъра и го поставете "
+"тук."
+"<br>"
+"<br>Например ако напишете %1 в Google резултатът ще бъде "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8."
+"<br>Щом добавите този адрес тук, KTorrent ще може да търси чрез Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Използвайте уеб браузъра си и напишете %1 (с големи букви) в търсачката, която "
+"искате да добавите. Използвайте адреса (URL) по-надолу."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Трябва да въведете име и адрес (URL) на търсачката"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Вече има търсачка със същото име. Моля, използвайте различно име."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Невалиден адрес(URL). Потърсете FOOBAR с помощта на браузъра си и копирайте тук "
+"точния адрес."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Търсене"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Настройки на търсачките"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Търсене на %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "торент файлове"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Търсенето завърши"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Търсачки: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Търсене с няколко популярни торент търсачки"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Сваляне или запис на торента?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Сваляне на торент"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Сваляне"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr "Търсене на потребители с ktorrent в локалната мрежа"
diff --git a/translations/br/Makefile.am b/translations/br/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/br/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/br/messages/Makefile.am b/translations/br/messages/Makefile.am
new file mode 100644
index 0000000..db05612
--- /dev/null
+++ b/translations/br/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = br
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/br/messages/ktorrent.po b/translations/br/messages/ktorrent.po
new file mode 100644
index 0000000..c2694d4
--- /dev/null
+++ b/translations/br/messages/ktorrent.po
@@ -0,0 +1,5019 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: all2.po\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2004-09-20 15:44+0200\n"
+"Last-Translator: Thierry Vignaud <tvignaud@mandriva.com>\n"
+"Language-Team: br <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Titouroù"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Strolladoù"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Loc'hañ"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Paouez"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Loc'hañ pep hini"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Loc'hañ an holl re"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Pegañ URL an ster froud ..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "Restr sil IP :"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Restroù ster-froud"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Pep restr"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Digeriñ ul lec'hiadur"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Tizh ez : %1 / en : %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "Treuzkaset ez : %1 / en : %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+#, fuzzy
+msgid "DHT: off"
+msgstr "DHT :"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Ster-froud"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "P&ignit"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "P&ignit"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "Fiñval d'an &traoñ"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Dibabit ur restr"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "Dibabit ar restr da enrollañ ar ster-froud"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL siek."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "Ezkarget"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "N'hellan ket krouiñ ar ster-froud : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Adkrouiñ"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "N'enkargit ket"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Adkrouiñ"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Fazi en ur skrivañ da %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Fazi en ur skrivañ da %1"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Ur program BitTorrent evit KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Teul da zigeriñ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "Lugent RSS :"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Dibarzhoù hollek"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+#, fuzzy
+msgid "Application icon and a couple of others"
+msgstr "Arlun veziant 1.1 hag a lod all"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "An arlun enkargañ"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Arlun veziant 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "Bro"
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "Dibarzhoù ar restr"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Renkelloù"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Renkelloù"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Renkelloù"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr " N'hell ket bet digoret ar restr ster-froud %1 : %2"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Ret eo deoc'h dibab ur restr pe ur renkell."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "Ret eo deoc'h dibab ur restr pe ur renkell."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Restroù ster-froud (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Dibabit ar restr da enrollañ ar ster-froud"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Emaon o krouiñ %1 ..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "IP diouzhoc'h"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Strollad nevez"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Aozañ an anv"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Distruj ar strollad"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Ezkarget"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+#, fuzzy
+msgid "Queued uploads"
+msgstr "El lost"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "An arlun enkargañ"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Enkargañ"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Ezkarget"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Krouiñ ar ster-froud"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "Enkargañ"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Ezkarget"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Ster-froud"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "Enkargañ"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Enrollañ ar torrent ?"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Enrollañ ar torrent ?"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Dibaboù klask"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Rakgwel"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "D&igeriñ ar renkell ..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+#, fuzzy
+msgid "Data Directory"
+msgstr "Renkell padennek"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Renkell padennek"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "An arlun enkargañ"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Lemel eus ar strollad"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Ouzhpennañ er strollad"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "URL siek."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Dibaboù"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Dibarzhoù enkargañ"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Pennañ"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Dibarzhoù hollek"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Barek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Dibaboù barek"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Bannoù hewel"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Stad"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Enkarget"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Ment"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Ezkarget"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Amzer a chom"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "Steuñvaer"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Echu"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Enkarget"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "Amzer a chom"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Ster-froud"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "%n deiz"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+#, fuzzy
+msgid "Delete Data"
+msgstr "&Dilemel"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Emaoc'h oc'h enkargañ ar ster-froud-se dija."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "An arlun enkargañ"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Arveriad"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Merour al lost"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "Krouiñ ar ster-froud"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Echu eo an enkargañ"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Echu eo an enkargañ"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Fazi en ur skrivañ da %1"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Hep muzul"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Ur meziant Kpart evit KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "N'hellan ket digeriñ ar restr meneger %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Thierry Vignaud, Jañ-Mai Drapier"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "tvignaud@mandriva.com, jdrapier@club-internet.fr"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Dibabit ar restroù e fell dit enkargañ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Enkargañ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Strollad :"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "Enkargañ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Krouiñ ar ster-froud"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Enkargañ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Dibabit an &holl re"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Dibabit &netra"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Eilpennañ an diuz"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Egor dieub ar bladenn :"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "Enkargañ"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Enrinegadur"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP diouzhoc'h"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "IP pe anv ostiz diouzhoc'h :"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "IP pe anv ostiz diouzhoc'h :"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Arlun barlenn ar reizhiad"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Diskou&ez arlun barlenn ar reizhiad"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Diskou&ez arlun barlenn ar reizhiad"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Diskou&ez arlun barlenn ar reizhiad"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Renkelloù"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Renkell ar restroù padennek :"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "N'enkargit ket"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "restroù ster-froud"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barenn ostilhoù enkargañ"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "ezkargañ :"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Enkargañ"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Porzh :"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Restroù ster-froud"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Goullonderiñ"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Enrollañ e ..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, fuzzy, no-c-format
+msgid "Minimum disk space:"
+msgstr "Egor dieub ar bladenn :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "N'eo ket loc'het"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Goulenn bepred"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "N'eo ket loc'het"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "Mo"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "ezkargañ :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Ho evezh"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Stad :"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT :"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Ster-froud"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "Ezkarget"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Ezkarget :"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "P&ignit"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "D&iskennit"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "P&ignit"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Fiñval d'an &traoñ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Pegañ an URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL :"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "Mat &eo"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Nullañ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Krouiñ ar ster-froud"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Dibarzhoù ar restr"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KO"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Askelennoù :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Krouiñ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Nu&llañ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Skoulm :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "IP pe anv ostiz diouzhoc'h :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Porzh"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Dibaboù klask"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Dibaboù"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Penoas vez implijet ar vemor :"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Izel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Krenn"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Uhel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500me"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1e"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2e"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5e"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Rouedad"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Arnodiñ"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Diskouez un arlun barlenn reizhiad"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Diskou&ez arlun barlenn ar reizhiad"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Renkell ar restroù padennek"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Renkell ar restroù padennek"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr " N'hell ket bet digoret ar restr ster-froud %1 : %2"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Renkell ar restroù padennek"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Penoas vez implijet ar vemor"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Porzh DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Merour al lugentoù"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Kargañ"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Di&gargañ"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Kargañ an holl re"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Digargañ an holl re"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Trobarzhell"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, fuzzy, no-c-format
+msgid "WAN Connection"
+msgstr "Kevreadennoù :"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, fuzzy, no-c-format
+msgid "Folder1 path"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, fuzzy, no-c-format
+msgid "Folder2 path"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, fuzzy, no-c-format
+msgid "Folder3 path"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr " N'hell ket bet digoret ar restr ster-froud %1 : %2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Dibaboù klask"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "restroù ster-froud"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, fuzzy, no-c-format
+msgid "Folders to scan"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, fuzzy, no-c-format
+msgid "Folder 1:"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, fuzzy, no-c-format
+msgid "Folder 2:"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, fuzzy, no-c-format
+msgid "Folder 3:"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Dibaboù klask"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Servijer Web"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Dibabit &netra"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Anv an arveriad :"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Tremenger :"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Dibarzhoù hollek"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "anv an arveriad"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "tremenger"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Hollek :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Emaon oc'h enkargañ :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Enkarget :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Kleiz :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Ment :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Pezh"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Araogenn"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Stad :"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Rannañ"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "Hep muzul"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "Da gaout"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Da gaout"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Da gaout"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Da gaout"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Dibaboù IPBlocking"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Implij sil KTorrent ?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Implij sil KTorrent ?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Restr sil IP :"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "En&kargañ/Amdreiñ"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Oc'h amdreiñ ..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Krenn"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "Kevreadennoù :"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Diskou&ez arlun barlenn ar reizhiad"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Ezkarget"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "Kevreadennoù :"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Enkargañ ar ster-froud"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Ster-froud :"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Roadoù :"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Enporzh"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "dre ziouer"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Dilemel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nevez"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Pennadoù"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Adtresañ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Titl"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Bev"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Siloù"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "Pep restr"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Argerzh"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Ar&nodiñ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, fuzzy, no-c-format
+msgid "Categor&y 1"
+msgstr "Rummoù"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "L&azhañ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Boas"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, fuzzy, no-c-format
+msgid "Category &3"
+msgstr "Rummoù"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, fuzzy, no-c-format
+msgid "Category &2"
+msgstr "Rummoù"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, fuzzy, no-c-format
+msgid "Category &1"
+msgstr "Rummoù"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, fuzzy, no-c-format
+msgid "&Category 3"
+msgstr "Rummoù"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Rummoù"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "Enkargañ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "ezkargañ :"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Enrollañ en ur restr"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "M&at eo"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Dibaboù al lugent"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Dibarzhoù ar restr"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Dibaboù al lugent"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Dibaboù al lugent"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Dibaboù al lugent"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "Dibarzhoù ar restr"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Lugentoù"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Holl"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Kemenn"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Pouezus"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Ebet"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "Restr sil IP :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Klask :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "Renkelloù"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Steuñvaer :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Lugent RSS :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Dibarzhoù hollek"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Reizhiad"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Pennañ :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Kevreadennoù :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, fuzzy, no-c-format
+msgid "Custom browser path:"
+msgstr "IP diouzhoc'h"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Kefluskerioù klask"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Anv ar c'heflusker klask :"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Ouzhpennañ"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "L&emel an holl re"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Klask"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Keflusker klask :"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 Go"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 Mo"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 Ko"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 O"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "%n deiz"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "N'hellan ket digeriñ ar c'herzlevr %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "N'hellan ket skrivañ e %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "N'hellan ket lenn deus %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "N'hellan ket krouiñ ar renkell %1 : %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "N'hellan ket Fiñval ar renkell %1 da %2 : %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "N'hellan ket eilañ %1 da %2 : %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "N'hellan ket lemel %1 : %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "N'hellan ket krouiñ %1 %2"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "N'hellan ket digeriñ ar restr : %1 : %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "N'hellan ket digeriñ ar restr : %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "N'hellan ket digeriñ %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Karget"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "N'eo ket karget"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Dibaboù al lugent"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "N'hellan ket digeriñ ar restr %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "N'eo ket a renkell ar renkell %1"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Fazi diskodiñ"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "N'eo ket echu ar ster-froud !"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Brein eo ar ster-froud !"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " N'hell ket bet digoret ar restr ster-froud %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Fazi en ur lenn"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr " N'hell ket bet digoret ar restr ster-froud %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Emaoc'h oc'h enkargañ ar ster-froud-se dija."
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Dibabit ar renkell da enrollañ e-barzh"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "N'eo ket loc'het"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Emaon oc'h enkargañ"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr ""
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Paouezet"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Fazi : "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "El lost"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Fazi en ur herzel ar ster-froud %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Fazi en ur loc'hañ ar ster-froud %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Kliant dianav"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "N'hellan ket krouiñ ar restr %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Fazi en ur less eus %1."
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Fazi en ur skrivañ da %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Fazi en ur skrivañ da %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "N'eo ket mat ar respont"
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr "N'eo ket mat ar respont"
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "N'eo ket mat ar respont"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "N'hellan ket digeriñ %1 : %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "N'hellan ket digeriñ ar restr : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Trobarzhelloù UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Renkelloù"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder"
+msgstr "Renkelloù"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "Dibarzhoù ar restr"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "karget"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Dibarzhoù hollek"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "N'eo ket a renkell ar renkell %1"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+#, fuzzy
+msgid "%1 is a directory"
+msgstr "Renkell padennek"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Dibarzhoù hollek"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "Paouez eo an enkargañ"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "Echu eo an enkargañ"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "Enkargañ"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Distruj restr(où)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Da gaout"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "Hep muzul"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "N'hellan ket krouiñ ar ster-froud : %1"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Bro"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Kliant"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Merk"
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "Digargañ an holl re"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Amdreiñ"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Gortozit mar plij ..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Restr sil IP :"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Stad : N'eo ket karget."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+"Ar restr dibabet a zo c'hoazh. Ha fell a ra deoc'h d'enkargañ anezhañ adarre ?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Ar restr a zo endeo"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Sil IPBlocking"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Dibarzhoù ar sil IPBlocking"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Stad"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Kevreadennoù :"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Diskou&ez arlun barlenn ar reizhiad"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Kevreadennoù :"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Diskou&ez arlun barlenn ar reizhiad"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Skoulm :"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "Kevreadennoù :"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Ster-froud"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "Hep muzul"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Renkelloù"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Renkelloù"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Restroù ster-froud"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Pep restr"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "N'hellan ket skrivañ e %1 : %2"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "N'hellan ket kargañ ar ster-froud : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr ""
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Titl"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Deskrivadur"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Liamm"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Eur"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Steuñvaer"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "Dibaboù al lugent"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "LUN"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "MEU"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "MER"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "YAO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "GWE"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SAD"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "SUL"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "N'eo ket kavet ar restr."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "Lugent klask KTorrent"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Gweler kerzlevr"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Klask"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Dibarzhoù ar c'hefluskerioù klask"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "O klask %1 ..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "restroù ster-froud"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Echu eo ar glask"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Keflusker : "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Ha fellout a ra deoc'h enkargañ pe enrollañ ar ster-froud ?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Enkargañ ar ster-froud"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Enkargañ"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "N'hell ket bet karget ar pezh %1"
+
+#~ msgid "Alt+X"
+#~ msgstr "Alt+X"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Stad :"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "DownloadPref"
+#~ msgstr "Dibarzhoù enkargañ"
+
+#~ msgid "Alt+K"
+#~ msgstr "Alt+K"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "Alt+U"
+#~ msgstr "Alt+U"
+
+#~ msgid "Alt+A"
+#~ msgstr "Alt+A"
+
+#~ msgid "Form1"
+#~ msgstr "Paperenn-reol 1"
+
+#~ msgid "Alt+L"
+#~ msgstr "Alt+L"
+
+#, fuzzy
+#~ msgid "Form2"
+#~ msgstr "Paperenn-reol 1"
+
+#~ msgid "Name"
+#~ msgstr "Anv"
+
+#~ msgid "Author"
+#~ msgstr "Oberour"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Echu eo an enkargañ"
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Dibabit ar renkell da enrollañ e-barzh"
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Enkargañ"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Ezkarget"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "Ster-froud"
+
+#~ msgid "St&atus"
+#~ msgstr "St&ad"
+
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+Y"
+
+#~ msgid "New"
+#~ msgstr "Nevez"
+
+#~ msgid "Alt+G"
+#~ msgstr "Alt+G"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+1"
+
+#~ msgid "finished"
+#~ msgstr "disoc'het"
+
+#~ msgid "Search engines"
+#~ msgstr "Kefluskerioù klask"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "Echu eo an enkargañ"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "Echu eo an enkargañ"
+
+#~ msgid "Completed"
+#~ msgstr "Echuet"
+
+#~ msgid "Alt+C"
+#~ msgstr "Alt+C"
+
+#~ msgid "Parse error"
+#~ msgstr "Fazi en ur lenn"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "Klask"
+
+#~ msgid "Appl&y"
+#~ msgstr "Arlo&añ"
+
+#~ msgid "Alt+O"
+#~ msgstr "Alt+O"
+
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "Implij sil &KTorrent ?"
+
+#~ msgid "IP filter file"
+#~ msgstr "Restr sil IP"
+
+#~ msgid "You must fill in the name field."
+#~ msgstr "Red eo deoc'h leuniañ tachenn an anv."
+
+#~ msgid "Name:"
+#~ msgstr "Anv :"
+
+#, fuzzy
+#~ msgid "Alt+R"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Available trackers:"
+#~ msgstr "Da gaout"
+
+#~ msgid "Down:"
+#~ msgstr "Izel :"
+
+#~ msgid "Up:"
+#~ msgstr "Uhel :"
+
+#~ msgid "Fi&les"
+#~ msgstr "Res&troù"
+
+#~ msgid "."
+#~ msgstr "."
+
+#~ msgid "KTorrent's UPnP plugin"
+#~ msgstr "Lugent UPnP evit KTorrent"
+
+#~ msgid "KTorrent's log viewer plugin"
+#~ msgstr "Lugent gweler kerzlevr evit KTorrent"
+
+#~ msgid "KTorrent's search plugin"
+#~ msgstr "Lugent klask KTorrent"
+
+#~ msgid "Alt+Q"
+#~ msgstr "Alt+Q"
+
+#~ msgid "Downlo&ad"
+#~ msgstr "Enk&argañ"
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+1"
+
+#~ msgid "IWPref"
+#~ msgstr "IWPref"
+
+#~ msgid "yes"
+#~ msgstr "ya"
+
+#~ msgid "no"
+#~ msgstr "n'eo ket"
+
+#, fuzzy
+#~ msgid "Cannot preallocate diskspace : %s"
+#~ msgstr "N'hellan ket krouiñ ar restr meneger : %1"
+
+#~ msgid "&Status"
+#~ msgstr "&Stad"
+
+#~ msgid "Miscelanious"
+#~ msgstr "A bep seurt"
+
+#~ msgid "Unable to open cache file: %1"
+#~ msgstr "N'hell ket bet digoret ar restr krubuilh : %1"
+
+#~ msgid "Can't open index file"
+#~ msgstr "N'hellan ket digeriñ ar restr meneger"
+
+#~ msgid "Can't save chunk_info file : %1"
+#~ msgstr "N'hellan ket enrollañ ar restr chunk_info : %1"
+
+#~ msgid "Do Not Save"
+#~ msgstr "Ne enrollit ket"
+
+#~ msgid "Speed (up/down):<br>"
+#~ msgstr "Tizh (ez/en) :<br>"
+
+#~ msgid "<br>Transfered (up/down):<br>"
+#~ msgstr "<br>Treuzkaset (ez/en) :<br>"
diff --git a/translations/ca/Makefile.am b/translations/ca/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/ca/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/ca/messages/Makefile.am b/translations/ca/messages/Makefile.am
new file mode 100644
index 0000000..8f8e4c6
--- /dev/null
+++ b/translations/ca/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = ca
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/ca/messages/ktorrent.po b/translations/ca/messages/ktorrent.po
new file mode 100644
index 0000000..b3a124b
--- /dev/null
+++ b/translations/ca/messages/ktorrent.po
@@ -0,0 +1,4902 @@
+# Translation of ktorrent.po to Catalan
+#
+# Josep Ma. Ferrer <txemaq@gmail.com>, 2006, 2008.
+# Xavier Batlle i Pèlach <tevibp@wanadoo.es>, 2006.
+# Xavier Batlle i Pelach <tevi@eltercer.cat>, 2006.
+# Xavier Batlle Pelach <tevi@eltercer.cat>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-02-09 15:12+0100\n"
+"Last-Translator: Josep Ma. Ferrer <txemaq@gmail.com>\n"
+"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Sense connexions d'entrada (possible tallafocs)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informació"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Dades transferides durant la sessió actual"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Velocitat actual de tots els torrents combinats"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grups"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Engega"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Atura"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Engega-ho tot"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Atura-ho tot"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Enganxa URL torrent ..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Obre el gestor de cues..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Encua/desencua"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Filtre d'IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Comprova l'integritat de les dades"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Indica la velocitat màxima de pujada"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Indica la velocitat màxima de baixada"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Fitxers torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Tots els fitxers"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Obre localització"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Velocitat de baixada: %1 / pujada: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Tramès avall: %1 / amunt: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 nodes, %2 tasques"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: desconnectat"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Tots els torrents"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Cerca:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Distingeix majúscules"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Amarra a l'esquerra"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Amarra a la dreta"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Amarra a baix"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Assigna accelerador..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Neteja accelerador"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Canvia el nombre del botó"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nou nombre accelerador:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Heu d'escriure les IP en format 'XXX.XXX.XXX.XXX'. Podeu usar comodins per a "
+"rangs, com ara '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Escolliu un fitxer"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Escolliu un nom per a desar-lo"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL erroni."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Baixades"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Pujades"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"El port especificat (%1) no és accessible o està en ús per una altra aplicació. "
+"KTorrent es vincularà al port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"El Ktorrent no pot acceptar connexions perquè un altre programa està usant els "
+"ports del %1 al %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "No es pot crear el torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"S'han perdut alguns fitxers de dades del torrent \"%1\", voleu tornar-los a "
+"crear, o no els voleu baixar?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Torna a crear"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "No descarreguis"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "No s'ha pogut tornar a crear els fitxers perduts: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "S'ha perdut els fitxers de dades"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "No s'ha pogut desseleccionar els fitxers perduts: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"El fitxer on s'han desat les dades del torrent \"%1\" s'ha perdut, voleu "
+"tornar-lo a crear?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "No tornar a crear"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "No es pot tornar a crear el fitxer de dades: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Falta el fitxer de dades"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Comprovant la integritat de les dades"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "infinit"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Error en explorar les dades: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Explorant dades de <b>%1</b>:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Un programa BitTorrent pel KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Mode depuració"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr "Desa silenciosament un torrent donat en un URL"
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Document a obrir"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Endollable RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Connector Interfície de web"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Connector d'estadístiques"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Icona d'aplicació i un parell més"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "La icona de baixades"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Icona d'aplicació 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Consells ChunkBar i ordenació IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Localitzador de país per al connector InfoWidget (Aquest producte inclou dades "
+"GeoLite creades per MaxMind, disponible a http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Banderes de país"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Priorització de fitxers"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "S'ha usat Miniupnp com a exemple per a la nostra implementació UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Pedaç de ràtio màxima de compartició"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Millores del Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Interfície web coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Codi IDEAl des del KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Millora en la conversió de velocitats de l'endollable ipfilter"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Trobades 2 vulnerabilitats de seguretat (solucionades les dues)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Pedaç per a carregar silenciosament a un lloc de desat"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Millores en el codi PHP de la interfície web"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Reserva d'espai específica per a XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Pedaç per a no mostrar velocitats molt baixes"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Pedaç que detecta la possibilitat d'estar darrere un tallafocs"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Alguns pedaços"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Pedaç per amagar la barra de menú"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Pedaç per a modificar les prioritats del fitxer en la interfície web"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Alguns pedaços per a la interfície"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Pedaç per a la barra de filtres"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Pedaç d'actualització de vista de fitxer sense seguir el fil"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Optimització de la generació del resum SHA1"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Pedaç per esmenar el càlcul de l'espai lliure al disc en el FreeBSD"
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr ""
+"Pedaç per a carregar silenciosament els torrents des de la línia d'ordres"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Heu de seleccionar un arxiu o carpeta."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"No heu afegit cap seguidor, esteu segur que voleu crear aquest torrent?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Heu d'afegir almenys un node."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Fitxers torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Trieu Arxiu per desar el torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "S'està creant %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Grups personalitzats"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nou grup"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Edita nom"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Elimina grup"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Obre pestanya"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Si us plau, escriviu el nom del grup."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "El grup %1 ja existeix."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Si us plau, escriviu el nou nom de grup."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Pujades actives"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Cua de pujades"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Cua de baixades"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Baixades de l'usuari"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Pujades de l'usuari"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Torrents inactius"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Baixades inactives"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Pujades inactives"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Torrents actius"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Baixades actives"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Elimina el torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Elimina el torrent i les dades"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Afegeix parells"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Fonts de parells addicionals"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Fonts de parells de torrents:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Intercanvi de parells"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Anunci manual"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Vista prèvia"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Obre la carpeta"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Directori de dades"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Directori temporal"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Estableix el lloc de baixades"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Esborra del grup"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Afegeix al grup"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Límits de velocitat"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"El torrent no existeix. Informeu d'aquest error als desenvolupadors de "
+"KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Possible parell afegit."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Adreça IP mal escrita."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Preferències"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opcions de les baixades"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "El port DHT ha de ser diferent al port del seguidor UDP!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "General"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opcions generals"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"No es pot trobar %1:%2\n"
+"Si us plau, doneu una adreça IP o un nom de màquina vàlids."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avançat"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Opcions avançades"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Columnes visibles"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Estat"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Baixat"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Mida"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Pujat"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Baixant a"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Pujant a"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Temps restant"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Sembradors"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Sangoneres"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% completat"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Ràtio de compartició"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Temps de baixada"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Temps sembrat"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Tots els torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"No es pot engegar més d'una baixada, \n"
+"No es poden engegar més de %n baixades, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"i 1 llavor. \n"
+"i %n llavors. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Aneu a Arranjament -> Configura KTorrent si desitgeu canviar els límits."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"El torrent %1 no ha acabat de baixar, voleu esborrar també les dades "
+"incompletes?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Esborra les baixades"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Esborra les dades"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Manté les dades"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Perdreu totes les dades baixades. Esteu segur que voleu fer això?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Ja esteu comprovant les dades del torrent %1 !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Esculla el lloc de baixada per a %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Heu desseleccionat els següents fitxers existents. Perdreu totes les dades "
+"d'aquests fitxers, esteu segur que voleu fer això?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Sí, esborra els fitxers"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "No, manté els fitxers"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " curt!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Usuari"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Gestor de cues"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "No (torrent privat)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Velocitat:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Baixada: <font color='#1c9a1c'>%1</font></td>"
+"<td>Pujada: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transferit:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Baixada: <font color='#1c9a1c'>%3</font></td>"
+"<td>Pujada: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> ha baixat del tot.<br>Velocitat mitjana: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Baixada finalitzada"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> ha assolit la ràtio màxima de compartició de %2 i s'ha aturat. "
+"<br>S'ha pujat %3 a una velocitat mitjana de %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Sembra completada"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> ha assolit la ràtio màxima de compartició de %2 i s'ha aturat. "
+"<br>S'ha pujat %3 a una velocitat mitjana de %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> s'ha aturat amb el següent error: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"S'han trobat dades corruptes al torrent <b>%1</b>"
+"<br> Seria una bona idea comprovar la integritat de les dades del torrent."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> ha assolit la ràtio màxima de compartició de %2 i no pot ser afegit a "
+"la cua. Canvieu el límit manualment si desitgeu continuar sembrant."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> ha assolit la ràtio màxima de compartició de %2 i no pot ser afegit a "
+"la cua. Canvieu el límit manualment si desitgeu continuar sembrant."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "No es pot posar el torrent a la cua."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "No es pot engegar <b>%1</b>: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"No es pot sembrar més d'un torrent."
+"<br>\n"
+"No es poden sembrar més de %n torrents."
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"No es pot baixar més d'un torrent."
+"<br>\n"
+"No es poden baixar més de %n torrents."
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "No es pot engegar el torrent"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "No hi ha prou espai disponible al disc."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"El vostre disc està funcionant sense espai. <br /><b>%1</b> "
+"és descarregat a '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "S'ha aturat el torrent.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Dispositiu funcionant sense espai"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Límit de velocitat en KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Sense límit"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Límits de velocitat per a <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Una aplicació KPart del KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "No es pot obrir l'arxiu índex %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Albert Astals Cid,Josep Ma. Ferrer,Xavier Batlle i Pèlach"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "astals11@terra.es,txemaq@gmail.com,tevi@eltercer.cat"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Seleccioneu quins fitxers voleu descarregar"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Descarrega a:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grup:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Controlat per l'&usuari"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Engega el torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Descarrega"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Selecciona-ho &tot"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "No seleccionis &res"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Inverteix la selecció"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Espai al disc"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Espai al disc requerit:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Espai lliure al disc:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Després de baixar:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Xifrat"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Usa xifrat del protocol"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"El protocol d'encriptació s'usa per evitar que els ISP alenteixin les "
+"connexions bittorrent."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Permet connexions no encriptades"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"SI està de desactivada només podreu connectar amb clients que acceptin "
+"encriptació."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Protocol <b>D</b>istributed <b>H</b>ash <b>T</b>able ."
+"<br>Protocol descentralitzat d'intercanvi de parells. Consulteu el manual per a "
+"més informació."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Usa DHT per a obtenir parells addicionals"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Port UDP per a la comunicació DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP personalitzada"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "E&nvia al seguidor una IP o nom de màquina personalitzat"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "IP personalitzada o nom de màquina:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Icona de la safata de sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Mostra la icona a la safata del s&istema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Mostra la &barra de velocitat a la safata del sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Mostra missatges emergents a la safata"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Ample de banda de pujada (en KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Ample de banda de baixada (en KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Carpetes"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Carpeta per desar arxius temporals:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Moure les descàrregues completes a:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Des&a automàticament les baixades a:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Copiar els arxius .torrent a:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barra d'eines de baixades"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Posa límits de velocitat per torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Raó màxima de pujada:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Raó màxima de baixada:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 és sense límit)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Afegeix un parell potencial"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Parell IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Entreu el parell IP i el port."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Llista negra del KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Nota: La llista negra s'aplica només a la sessió actual. Useu Desa/Obre per "
+"desar les entrades o useu el connector IPFilter (Guardià de parells)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Parell bandejats"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Adreça IP del parell"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Afegeix parell:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Afegeix parells a la llista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Esborra el parell seleccionat de la llista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Neteja"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Neteja aquesta llista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Des&a Com..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Desa aquesta llista per a utilitzar-la amb el connector IPFilter"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Màxim nombre de baixades:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Màxim nombre de llavors:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Comença la baixada amb poc espai al disc:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Espai mínim al disc:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "No comencis"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Pregunta-ho sempre"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Obliga a començar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 és sense límit)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Velocitat màxima de baixada:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Límit global de connexió:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Ràtio màxima de compartició:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Nombre màxim de connexions per torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Nombre de canals de pujada:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Port del seguidor UDP:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Ràtio màxima de compartició:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Velocitat màxima de pujada:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/seg (0 és sense límit)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Hores (0 és sense límit)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Manté la llavor després de haver finalitzat la baixada"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Atenció"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Els port d'amunt han d'estar redirigits si esteu darrere d'un encaminador. El "
+"connector UPnP por fer-ho per vosaltres."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Diàleg de cua KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Estat:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Seguidor:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Ràtio de compartició:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Bytes deixats:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Controlat per"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Pujade&s"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Pujat:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "M&ou amunt"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Mou a&vall"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Mou a dalt"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Mou a &baix"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Controlat per &QM"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Controlat per l'&usuari"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Enganxa URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&Bé"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "C&ancel·la"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Crea torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "L'arxiu o la carpeta del que voleu crear un torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Heu d'afegir almenys un seguidor o node."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opcions de fitxer"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Mida de cada tros:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Comença a &sembrar el torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Descentralit&zat (només DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Torrent privat (DHT no permés)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Comentaris:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Crea"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Ca&ncel·la"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Seguidors"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Nodes DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Node:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP o nom de màquina"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"NOTA: Alguns bons nodes DHT coneguts ja s'han inserit. Però probablement també "
+"voldreu inserir les vostres adreces IP i ports si preveieu sembrar aquest "
+"torrent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Preferències avançades"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Algorisme KTorrent:</b> Algorisme per omissió que usa una combinació "
+"d'altres algorismes i basat en les nostres proves."
+"<br>\n"
+"<b>Algorisme de la velocitat actual:</b> El més simple - "
+"BytesPendents/VelociatActual"
+"<br>\n"
+"<b>Algorisme de la velocitat mitjana global:</b> BytesPendents/VelocitatMitjana"
+"<br>\n"
+"<b>Algorisme de la finestra de X:</b> ET calculat amb X mostres de velocitat"
+"<br>\n"
+"<b>Algorisme de les mitjanes mòbils:</b> Mitjanes mòbils de la velocitat "
+"calculades a X mostres"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Velocitat actual"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Velocitat mitjana global"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Finestra d'X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Mitjàna mòbil"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(té efecte en reiniciar)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Desa&ctiva la reserva d'espai al disc"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Reser&va completa d'espai al disc (evita la fragmentació)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Bàsic (lent)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Específic del sistema de fitxers"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Preferències"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Ús de memòria:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Baix"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Mitjà"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Alt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "interval d'actualització de l'IGU:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "CPU ràpida"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "CPU lenta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Comprovació de dades"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Durant la pujada &no comprovis trossos més grans que"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Comprova la integr&itat de les dades després"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "Trossos corruptes"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Connexions"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Nombre màxim de connexions establertes:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP per a paquets IP:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+"No usis l'inte&rmediari del KDE per a les connexions HTTP dels seguidors"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Intermediari del seguidor HTTP:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Explorant dades"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Explorant dades del torrent:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Nombre de trossos trobats:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Nombre de trossos fallits / sense baixar:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Prova"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Nombre màxim de baixades (0 = cap límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Nombre màxim de llavors(0 = cap límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Inicia baixades si hi ha poc espai al disc?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Nombre màxim de connexions per torrent (0 = sense límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Màxim nombre de connexions per a tots els torrents (0 = sense límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Velocitat màxima de pujada en KB/seg (0 = cap límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Velocitat màxima de baixada en KB/seg (0 = cap límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Ràtio màxima de compartició (0 significa sense límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Ràtio màxima de compartició (0 significa sense límit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Mostra una icona a la safata del sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Mostra la barra de velocitat a la safata del sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Ample de banda de baixada (en kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Ample de banda de pujada (en kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Mostra missatges emergents en finalitzar el torrent."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Manté la llavor després d'haver finalitzat la baixada"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Carpeta per desar els fitxers temporals"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Si desar automàticament les baixades a la carpeta de desat"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Carpeta per desar els fitxers baixats"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Si desar automàticament les baixades a la carpeta de completats"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Carpeta on moure els fitxers baixats del tot"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Si copiar automàticament els fitxers .torrent a la carpeta de còpies"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Carpeta on copiar els fitxers .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Si usar una IP personalitzada a per a passar al seguidor"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Carpeta que s'ha usat en l'últim desat"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP per enviar al seguidor"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Ús de memòria"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Interval d'actualització de l'IGU"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Accepta DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Port DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Nombre de canals de pujada"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Columnes que es mostren en la vista del Ktorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algorisme ET"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Quan no queda espai per completar la baixada i l'espai lliure és inferior a "
+"l'espai mínim al disc, el torrent s'atura."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Gestor de connectors"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Carrega"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Descarrega"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "C&arrega-ho tot"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Descarrega-ho tot"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Dispositiu UPnP a utilitzar per defecte"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Dispositius detectats:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Dispositiu"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Ports redirigits"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Connexió WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Ports de &redirecció"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Desfés la redirecció de ports"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Reescaneja"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Permet l'exploració de la carpeta1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Permet l'exploració de la carpeta2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Permet l'exploració de la carpeta3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Camí de la carpeta1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Camí de la carpeta2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Camí de la carpeta3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Si obrir el torrent silenciosament o no."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Activada l'acció d'esborrar."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Acció de moure activada."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Preferències d'exploració de carpetes"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Explora la carpeta &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Explora la carpeta &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Explora la carpeta &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Mou &a la carpeta de \"carregats\" després de carregar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+"Mou el torrent a la carpeta de \"carregats\" després d'haver-lo carregat"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Obre els torrents s&ilenciosament"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "No mostra el diàleg 'Seleccioneu els fitxers a baixar'"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Esborrar després de carre&gar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Esborra el torrent després de la càrrega"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Carpetes a explorar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Carpeta 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Carpeta 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Carpeta 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Preferències de cerca"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Servidor web"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Port de redirecció"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL de sessió (en segons):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Trieu interfície:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Usuari:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Canvia la contrasenya ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Camí de l'executable php:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Número del port"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Port de redirecció"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Temps de vida de la sessió"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Aspecte de la interfície"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Camí de l'executable php"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "usuari"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "contrasenya"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Trossos"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Total:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Baixant ara:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Baixat:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Exclòs:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Pendent:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Mida:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Tros"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Progrés"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Parell"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Parells assignats"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Sembradors:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Sangoneres:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Velocitat mitjana de baixada:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Velocitat mitjana de pujada:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Propera actualització:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Estat del seguidor:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Parts del torrent que s'han baixat:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Parts del torrent que estan disponibles:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Compartint"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"La vostra càrrega s'aturarà quan la ràtio de compartició assoleixi aquest "
+"valor. El zero significa que no hi ha límit."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"La vostra càrrega s'aturarà quan la ràtio de compartició assoleixi aquest "
+"valor. El zero significa que no hi ha límit."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Hores"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Ràtio límit:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "El límit només funciona en mode sembrador"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Temps &límit:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Actu&alitza el seguidor"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Interval mínim d'actualització - 60 segons"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Afegeix se&guidor"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Elimina seguidor"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Ca&nvia seguidor"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Restaura per defecte"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Mostra la pestanya de vista de parells a la finestra principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+"Mostra la pestanya de vista de baixada de trossos a la finestra principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Mostra la pestanya de seguidors a la finestra principal"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Mostra la llista de parells"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Mostra la llista de trossos &actualment en baixada"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Mostra la llista de seguidors"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Preferències de bloqueig d'IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Selecciona el fitxer filtre de guardià de parells"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Usar el filtre Guardià de parells?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Fitxer de filtres d'IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "&Baixa/Converteix"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Descarrega el filtre PeerGuardian des de bluetack.co.uk o blocklist.org.\n"
+"Nota: Es pot usar el fitxer ZIP de bluetack.co.uk."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL del filtre de nivell1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Utilitzo el filtre de nivell1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "S'està convertint..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Feu clic al botó 'converteix' per iniciar la conversió del fitxer antip2p. "
+"NOTA: Aquest procés pot durar una estona fins i tot en màquines ràpides, i que "
+"durant aquesta estona no podreu usar el KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Actualitza"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Actualitza els gràfics cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Actualitzacions de l'IGU"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Reuneix dades cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "mil·lisegons"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Màxim"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Mode escala de màxima velocitat:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Exacte"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Vegeu 'Què és això' per a més ajuda"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Estableix el màxim valor per l'eix OY com:\n"
+"- Màxim: La velocitat global assolida més gran\n"
+"- Exacte: La velocitat assolida més gran visible al gràfic"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Velocitat dels parells"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Velocitat dels parells:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "actualitza cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "actualitzacions de les dades"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "Reunir dades sobre molts parells pot consumir força CPU."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Connexions de parells"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Grans valors poden amagar gràfics de parells connectats"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Mostra els sembradors dels eixams"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Mostra les sangoneres dels eixams"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Nombre de mesures"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Pujada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Connexions"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Parells"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Canvia els gràfics de parells i velocitat"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Interval en el qual agafar dades sobre velocitat dels parells"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Canvia el gràfic de sangoneres en eixams"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Canvia el gràfic de sembradors en eixams"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Nombre de mesures de baixada"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Nombre de mesures de velocitat dels parells"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Nombre de mesures de pujada"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Nombre de mesures de connexions"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Nombre de mesures DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "mode eix OY màxim"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importa una baixada existent"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Dades:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Si us plau, indiqueu el torrent i les dades ja baixades per aquest torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importa"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "per defecte"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Fonts RSS"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Fonts"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "E&sborra"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nou"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Articles"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "&Refresc automàtic"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnora TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Refresca"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Títol"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Manté articles (dies)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Actiu"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtres"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Accepta filtres"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Rebutja filtres"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Expressions regulars"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Tracta com a &sèrie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Processa"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Criteris de sèries"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Coincidència sense l'episodi"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Episodi màx."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Temporada màx."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Temporada mín."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Episodi mín."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Comprova te&xt"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Prova"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtre de correspondències"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Programador d'ample de banda"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Categoria del botó esquerra"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Categor&ia 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "A&paga"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Categoria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Categoria &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Categoria del botó dret"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Categoria &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Categoria 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Categories"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>Categoria 1.-</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>Categoria 3.-</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "baixada:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "pujada:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>Categoria 2.-</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* El zero és igual a sense límit"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Desa a un fitxer"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Carrega des del fitxer"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Restaura programa"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&D'acord"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Pàgina de preferències del connector de programació"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Usar el programador d'ample de &banda?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Programador d'ample de banda"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Uso colors enlloc de mapes de pí&xels?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Recomenat per a sistemes lents)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Edita la &programació"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Activar el programador d'ample de banda?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Usar colors enlloc de mapes de píxels?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Usa text ric per a la bitàcola"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Marca dels missatges d'informació general"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Marca dels missatges de connexions"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Marca dels missatges de DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Marca dels missatges dels seguidors"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Marca dels missatges d'informació E/S del disc"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Marca del connector IPFilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Marca dels missatges del connector de cerca"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Marca dels missatges del connector PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Marca dels missatges del connector Estri d'informació"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Etiquetes pels missatges del connector UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Etiqueta pels missatges del connector d'exploració"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Etiqueta pels missatges del connector de programació"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Marca dels missatges del connector RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Marca del connector IPFilter"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Opcions del visualitzador de la bitàcola"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Connectors"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Tot"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Depuració"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Avís"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Important"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Cap"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "Filtre d'IP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Cerca:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Explorador de carpetes:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Programador:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Import de parts de fitxer:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Estri d'informació:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Endollable RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Connector Interfície de web:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistema"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "General:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Connexions:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "E/S del disc:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Usa te&xt ric per la bitàcola"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Navegador extern"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Obre els resultats de la cerca en un navegador extern"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Usa el navegador per omissió"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Camí d'exploració personalitzat:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Motors de cerca"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Nom del motor de cerca:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Afegeix"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Motors"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Elimina-ho tot"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Afegeix per &defecte"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Actualitza des d'Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Cerca"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Motor de cerca:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Motor de cerca actual"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Usa el navegador per omissió"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Ruta de l'executable del navegador personalitzat"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dia \n"
+"%n dies "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Sí, primer"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Sí, últim"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "No es pot obrir l'arxiu de registre %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "No es pot escriure a %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "No es pot llegir des de %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "No es pot crear el directori %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "No es pot crear l'enllaç simbòlic %1 a %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "No es pot moure %1 a %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "No es pot copiar %1 a %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "No es pot esborrar %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "No es pot crear %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "No es pot calcular la mida del fitxer %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "No es pot calcular la mida de fitxer : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "No es pot obrir %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "No es pot expandir el fitxer : %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "No es pot expandir el fitxer"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "No es pot cercar en el fitxer : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "No es pot escriure més enllà de la memòria cau \"mmap\"!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Estat: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Carregat"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "No s'ha carregat"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opcions del connector"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "No es pot obrir l'arxiu %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "El directori %1 no existeix"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Símbol il·legal: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Error al decodificar"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Final inesperat d'entrada"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "No es pot convertir %1 a un sencer"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "El torrent és incomplet!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "El torrent és corrupte!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "El torrent no té el camp anunci o nodes"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " No es pot obrir l'arxiu torrent %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Error d'interpretació"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Hi ha hagut un error mentre es carregava el torrent. El torrent probablement és "
+"corrupte o no és un arxiu torrent.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Hi ha hagut un error mentre es carregava el torrent. El torrent probablement és "
+"corrupte o no és un arxiu torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "No es pot crear %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Ja esteu baixant aquest torrent %1; s'ha fusionat la llista de seguidors "
+"d'ambdos torrents."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "JA esteu baixant el torrent %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "No es pot migrar %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"El torrent %1 va començar amb una versió anterior del KTorrent. Per assegurar "
+"que aquest torrent funcioni amb aquesta versió, es migrarà. Us preguntaré una "
+"ubicació per desar el torrent. Si premeu cancel·lar , se seleccionarà el vostre "
+"directori arrel."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Selecciona la carpeta on desar"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "No ha començat"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Sembrant"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Baixant"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Aturat"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "S'ha aturat"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Error: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Reservant espai al disc"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "En cua"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Comprovant dades"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Aturat. No queda espai al dispositiu."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"No disposeu de prou espai al disc per a baixar aquest torrent. Esteu segur que "
+"voleu continuar?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Espai al disc insuficient per a %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"El torrent \"%1\" ha assolit la seva ràtio màxima de compartició. Ignorar el "
+"límit i tornar a sembrar?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "S'ha assolit la ràtio màxima de compartició."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Error en aturar el torrent %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Error en engegar el torrent %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Anunci"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Client desconegut"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 parell\n"
+"%n parells"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "No es pot crear el fitxer %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Fallada en escriure el primer tros al fitxer DND : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Fallada en escriure l'últim tros en el fitxer DND : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "No puc obrir %1 per a escriure: sistema de fitxers només d'escriptura"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "No es pot expandir el fitxer %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "No es pot expandir el fitxer %1 : escriptura incompleta"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "No es pot expandir el fitxer %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Error:la lectura ha passat el final del fitxer %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Error llegint des de %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Error escrivint a %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Error escrivint a %1 "
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "No es pot pre-assignar espai per a : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "No es pot vincular al port UDP %1 ni a cap dels 10 ports següents."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Resposta del seguidor invàlida"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Dades no vàlides des del seguidor"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "URL del seguidor no vàlid"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "No es pot obrir l'arxiu %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "No es pot crear l'arxiu índex:%1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "No es pot obrir l'arxiu : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Usa UPnP per redirigir ports automàticament en el vostre encaminador"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"No es troba el servei de redireccionament de ports en la descripció del "
+"dispositiu!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Dispositius UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Explora carpetes automàticament buscant fitxers de torrents i els carrega."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Explora de carpetes"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Explorador de carpetes"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opcions de l'explorador de carpetes"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "s'ha carregat"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Explorador de carpetes - Carpeta %1: URL no vàlid o carpeta inexistent. Si us "
+"plau escolliu un directori vàlid."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Interfície de web"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Opcions de la interfície de web"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"L'executable php no és al camí habitual, si us plau, entreu manualment el camí"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Si us plau, entreu la nova contrasenya per a la interfície web."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 existeix i és executable"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 no existeix"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 no és executable"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 és una carpeta"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 no és el camí de l'executable php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Interfície de web"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Permet controlar el Ktorrent des del navegador"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Baixar primer"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Baixar normalment"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Baixar últim"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Esborra el fitxer(s)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Disponible"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Pendent"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Perdreu totes les dades d'aquest fitxer, esteu segur que voleu fer això?\n"
+"Perdreu totes les dades d'aquests fitxers, esteu segur que voleu fer això?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Sense límit"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Estri d'informació"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Mostra informació addicional d'una baixada. Com ara quants trossos s'han "
+"baixat, quants sembradors i sangoneres hi ha..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "No es pot afegir un seguidor a un torrent privat."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "No es pot eliminar el seguidor per omissió del torrent."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "No podeu afegir seguidors a un torrent privat"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "País"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Client"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Obturat"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Rebutjat"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Disponibilitat"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Puntuació"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Canal de pujada"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Peticions"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Rebutja parell"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Proscriu parell"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Trossos disponibles"
+"<br><img src=\"unavailable_color\">&nbsp; - Trossos no disponibles"
+"<br><img src=\"excluded_color\">&nbsp; - Trossos exclosos"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opcions de l'estri d'informació"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Trossos baixats"
+"<br><img src=\"unavailable_color\">&nbsp; - Trossos per baixar"
+"<br><img src=\"excluded_color\">&nbsp; - Trossos exclosos"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Converteix"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "S'està carregant arxiu txt..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Espereu un moment..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Fitxer convertit."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "No es pot carregar el filtre:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Fitxer de filtre erroni. Potser és corrupte o està mal formatat."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Deixa fora parells no desitjats basats en la seva IP"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "Filtre d'IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Estat: carregat i funcionant."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Estat: no carregat."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Estat: <font color=\"#ff0000\">Fitxer de filtre no trobat.</font> "
+"Baixeu i convertiu el fitxer de filtre."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "El fitxer seleccionat ja existeix, voleu baixar-lo un altre vegada?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "El fitxer ja existeix"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"El fitxer de filtre (level1.dat) ja existeix, voleu convertir-lo un altre cop?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtre IPBlocking"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opcions del filtre IPBlocking"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Estadístiques"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Opcions d'estadístiques"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Sangoneres connectades"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Sangoneres als eixams"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Sembradors connectats"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Sembradors als eixams"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Mitjana de sangoneres connectades per torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Mitjana de sembradors connectats per torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Mitjana de sangoneres connectades per torrent corrent"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Mitjana de sembradors connectats per torrent corrent"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Nodes"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Tasques"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Mostra l'estadística de transferència"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Estadístiques de velocitat"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Estadístiques de connexions"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Actual"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Mitjana"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Límit"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Mitjana des de sangoneres"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Mitjana a sangoneres"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Mitjana des de sembradors"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Des de sangoneres"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Des de sembradors"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Llegenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Fitxers torrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Tots els fitxers"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "No es poden verificar les dades : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "No es pot carregar el fitxer torrent : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importa torrents descarregats parcialment o completa d'altres clients"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importa baixada existent"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL de la font"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Explora automàticament fonts RSS de torrents que coincideixin amb expressions "
+"regulars i els carrega."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Fonts RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Error en trobar i baixar un torrent vàlid per a %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Títol"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Descripció"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Enllaç"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Temporada"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episodi"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Temps"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Programador"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opcions del connector de programació"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "Dl"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "Dm"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "Dc"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "Dj"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "Dv"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "Ds"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "Dg"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Horari desat."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Fitxer no trobat."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Horari carregat."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Connector de programació d'ample de banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Obre el programador d'ample de banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"El programador d'ample de banda no està activat. Aneu a Arranjament -> "
+"Programador per a activar-lo."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Visor de bitàcola"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Visor de bitàcola"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Mostra la bitàcola del ktorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Utilitzeu el vostre navegador per cercar la cadena %1 (lletres majúscules) del "
+"motor de cerca que voleu afegir. "
+"<br>Després copieu aquí l'URL de la barra d'adreces que apareix un cop s'ha "
+"realitzat la cerca, i enganxeu-lo aquí."
+"<br>"
+"<br>Per exemple, en cercar %1 al Google pot resultar en "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8."
+"<br>Si afegiu aquest URL aquí sota, el ktorrent podrà usar el Google per a "
+"cercar."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Useu el vostre navegador per a cercar la cadena %1 (lletres majúscules) al "
+"motor de cerca que vulgueu afegir. Useu aquí l'URL resultant."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Heu d'introduir el nom del motor de cerca i el seu URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Ja existeix motor de cerca amb el mateix nom. Si us plau, utilitzeu un nom "
+"diferent."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"URL dolent. Hauríeu de cercar FOOBAR amb el vostre navegador i copiar/enganxar "
+"l'URL exacte aquí."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Cerca"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opcions dels motors de cerca"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Cercant %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "fitxers torrent"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Cerca finalitzada"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Motor: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Busca torrents en uns quants motors de cerca populars de torrents"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Voleu descarregar o desar el torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Descarrega el torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Baixa"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Troba parells executant KTorrent a la xarxa local per a compartir els torrents"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algorisme ETA:"
diff --git a/translations/cs/Makefile.am b/translations/cs/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/cs/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/cs/messages/Makefile.am b/translations/cs/messages/Makefile.am
new file mode 100644
index 0000000..af45f6a
--- /dev/null
+++ b/translations/cs/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = cs
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/cs/messages/ktorrent.po b/translations/cs/messages/ktorrent.po
new file mode 100644
index 0000000..d3d791e
--- /dev/null
+++ b/translations/cs/messages/ktorrent.po
@@ -0,0 +1,4922 @@
+# translation of tmp.po to
+# translation of ktorrent.po to
+#
+# Klara Cihlarova <koty@seznam.cz>, 2005, 2006.
+# Lukáš Tinkl <lukas@kde.org>, 2005.
+# Marek Stopka <marekstopka@gmail.com>, 2007.
+# Klára Cihlářová <koty@seznam.cz>, 2007.
+# Marek Stopka (m4r3k) <marekstopka@gmail.com>, 2007.
+# Václav Čermák <vaclav.cermak@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-08-18 00:52+0200\n"
+"Last-Translator: Marek Stopka (m4r3k) <marekstopka@gmail.com>\n"
+"Language-Team: <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);X-Generator: KBabel 1.11.4\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Žárné příchozí spojení (možná špatně nastavený firewall)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informace"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Přenesená data během aktuální relace"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Aktuální rychlost všech torrentů dohromady"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Skupiny"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Spustit"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Zastavit"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Spustit vše"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Zastavit vše"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Vložit URL torrentu..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Otevřít správce fronty..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Přidat do/Vyřadit z fronty"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Nastavení blokování IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Ověřit správnost dat"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Maximální rychlost odesílání"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Maximální rychlost stahování"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent soubory"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Všechny soubory"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Otevřít umístění"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Rychlost stahování: %1 / odesílání: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Staženo: %1 / odesláno: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 uzlů, %2 úloh"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: vypnuto"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Všechny torrenty"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Přesunout do levého doku"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Přesunout do pravého doku"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Přesunout do dolního doku"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Přířadit akcelerátor..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Odstranit akcelerátor"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Změnit číslo tlačítka"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nové číslo akcelerátoru:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Musíte vložit IP ve formátu 'XXX.XXX.XXX.XXX'. Můžete také použít náhradní "
+"znaky. Například '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Vybrat soubor"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Zvolte soubor pro uložení torrentu"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Chybné URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Stahování"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Odesílání"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Zadaný port (%1) je nedostupný nebo používaný jinou aplikací. KTorrent nyní "
+"používá port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent není schopen příjmout připojení, protože porty od %1 do %2 jsou již "
+"využívány jiným programem."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Nelze vytvořit torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Některá data z torrentu \"%1\" chybějí, přejete si je znovu vytvořit, nebo je "
+"nechcete stahovat?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Vytvořit znovu"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Nestahovat"
+
+# c-format
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Nelze vytvořit chybějící soubor: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Soubory s daty chybí"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Nelze odznačit chybějící soubory: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Soubor, kde byla uložena data z torrentu \"%1\" chybí, přejete si jej opět "
+"vytvořit?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Vytvořit znovu"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Nelze vytvořit soubor s daty: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Soubor s daty chybí"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Kontroluji neporušenost dat"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "nekonečno"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Chyba při kontrole dat: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Kontroluji data torrentu <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "BitTorrent pro KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Ladicí režim"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokument k otevření"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS zásuvný modul"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Zásuvný modul webového rozhraní"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Modul statistik"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Ikona aplikace a další ikony"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Ikona stahování"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Ikona 1.0 aplikace"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Vyhledávač země pro InfoWidget modul (Tento produkt zahrnuje GeoLite data "
+"vytvořená MaxMindem, dostupná z http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Vlajka země"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Nastavení priority souboru"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp bylo použito jako příklad pro vaše vlastní využití UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Políčko pro souhrnný maximální poměr sdílení"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Rozšíření Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Několik patchů"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Několik patchů"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Shody filtru"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Zda otevírat torrenty bez dotazování či ne."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Je třeba zvolit soubor nebo složku."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Nemáte přidán tracker, jste si jisti, že chcete vytvořit tento torrent?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Musíte přidat alespoň jeden DHT uzel."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent soubory (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Zvolte soubor pro uložení torrentu"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Vytvářím %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Vlastní skupiny"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nová skupina"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Upravit jméno"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Odstranit skupinu"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Otevřít záložku"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Zadejte prosím jméno skupiny."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Skupina %1 již existuje."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Prosím vložte nové jméno skupiny."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktivní odesílání"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Fronta odesílání"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Fronta stahování"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Uživatelem řízené"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Uživatelem řízené"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Neaktivní torrenty"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Neaktivní stahování"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Neaktivní odesílání"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktivní torrenty"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktivní stahování"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Odstranit torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Odstranit torrent a data"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Přidat protějšky..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Přídavné zdroje protějšků"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+#, fuzzy
+msgid "Torrent Peer Sources:"
+msgstr "Zdroje protějšků pro torrent:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Výměna protějšků"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Ruční oznámení"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Náhled"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "Otevřít adresář..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Adresář s daty"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Dočasný adresář"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Nastavit cíl stahování..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Odstranit ze skupiny"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Přidat do skupiny"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Omezení rychlosti"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Torrent neexistuje. Nahlašte tento problém vývojářům KTorrentu."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Případný protějšek přidán."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Nesprávně utvořená IP adresa."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Nastavení"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Možnosti stahování"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "Port pro DHT musí být jiný než port pro UDP tracker!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Obecné"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Obecné možnosti"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Nelze nalézt %1: %2\n"
+"Zadejte prosím platnou IP adresu nebo jméno hostitele."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Pokročilé"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Pokročilá nastavení"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Viditelné sloupce"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Stav"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Staženo"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Velikost"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Odesláno"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Stahování"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Odesílání"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Zbývající čas"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Protějšky"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Stahující"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "Dokončeno"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Poměr sdílení"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Doba stahování"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Doba sdílení"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Všechny torrenty %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Nemohu spustit více než jedno stahování, \n"
+"Nemohu spustit více než %n stahování, \n"
+"Nemohu spustit více než %n stahování, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"a 1 zdroj. \n"
+" a %n zdrojů. \n"
+" a %n zdrojů. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "Pokud chcete změnit limity, jděte na Nastavení -> Nastavit KTorrent."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Torrent %1 ještě není zcela stažený; přejete si taktéž smazat nekompletní data?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Odstranit stahování"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Smazat data"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Zachovat data"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Ztratíte všechna stažená data. Opravdu si to přejete provést?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Již kontrolujete data torrentu %1!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Nastavit cíl stahování pro %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Odznačili jste následující existující soubory. Ztratíte veškerá data v těchto "
+"souborech, skutečně si to přejete provést?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Ano, smazat soubory"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Ne, ponechat soubory"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr "chybí!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Uživatel"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Správce fronty"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Ne (privátní torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Rychlost:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Stahování: <font color='#1c9a1c'>%1</font></td>"
+"<td>Odesílání: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Přenos:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Staženo: <font color='#1c9a1c'>%3</font></td>"
+"<td>Odesláno: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> dokončil stahování.<br>Průměrná rychlost: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Stahování dokončeno"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> dosáhl maximálního poměru sdílení %2 a byl zastaven."
+"<br>Odesláno %3 průměrnou rychlostí %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Sdílení dokončeno"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> dosáhl maximálního času sdílení %2 hodin a byl zastaven. "
+"<br>Odesláno %3 průměrnou rychlostí %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> byl zastaven s následující chybou: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"V torrentu <b>%1</b> byla nalezena poškozená data. "
+"<br>Doporučujeme zkontrolovat neporušenost dat."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> dosáhl maximálního poměru sdílení %2 a nemůže být zařazen do fronty. "
+"Pokud si přejete soubor dále sdílet, odstraňte ručně limit poměru."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> dosáhl maximálního času sdílení %2 hodin a nemůže být zařazen do "
+"fronty. Pokud si přejete soubor dále sdílet, odstraňte ručně limit poměru."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torrent nelze zařadit do fronty."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Nemohu spustit <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Nemohu sdílet více než jeden torrent. "
+"<br>\n"
+"Nemohu sdílet více než %n torrentů "
+"<br>\n"
+"Nemohu sdílet více než %n torrentů "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Nemohu stahovat více než 1 torrent. "
+"<br>\n"
+"Nemohu stahovat více než %n torrentů. "
+"<br>\n"
+"Nemohu stahovat více než %n torrentů. "
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Torrent nemůže být spuštěn"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Není k dispozici dostatek místa na disku."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "Dochází vám místo na disku.<br/><b>%1</b> se stahuje do \"%2\"."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent byl zastaven.<br/>"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Zařízení dochází místo"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Rychlostní omezení v KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Bez omezení"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Omezení rychlosti pro <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE KPart aplikace"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Nelze otevřít index soubor %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Lukáš Tinkl,Klára Cihlářová, Marek Stopka, Václav Čermák"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"lukas@kde.org, koty@seznam.cz, marekstopka@gmail.com, vaclav.cermak@gmail.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Označte soubory, které chcete stáhnout"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Stáhnout do:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Skupina:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Ovládáno &uživatelem"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Spustit torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Stáhnout"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Vybr&at vše"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Nevybrat žád&ný"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Obrátit výběr"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Místo na disku"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Požadované místo na disku:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Dostupné místo na disku:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Po stažení:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Šifrování"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Používat šifrování protokolu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Šifrování protokolu slouží jako ochrana před ISP, aby nezpomaloval připojení "
+"pro bittorrent."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Povolit nešifrovaná spojení"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Pokud není tato volba zaškrtnuta, budete se moci připojit jen ke klientům, "
+"kteří mají zapnuto šifrování."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Protokol pro decentralizovanou výměnu protějšků. Pro více informací si "
+"přečtěte manuál."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "Po&užít DHT k získání většího počtu protějšků"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP port pro DHT komunikaci:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Vlastní IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Poslat trackeru vlast&ní IP nebo jméno hostitele"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Vlastní IP nebo jméno hostitele:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ikona v systémové části panelu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Zobrazit ikonu v s&ystémovém panelu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Zo&brazit rychlost v ikoně systémového panelu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Zobrazit vyskakovací zprávy systémového panelu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Rychlost odesílání (v KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Rychlost stahování (v KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Složky"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Složka pro dočasné soubory:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Přesunout dokončená stahování do:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Automaticky ukládat torrenty do:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Kopírovat .torrent soubory do:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Lišta stahování"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Nastavit omezení rychlosti pro torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maximální rychlost odesílání:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maximální rychlost stahování:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 je bez omezení)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Přidat potenciální protějšek"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP protějšku:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Vložte IP a port protějšku."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent blacklist"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Poznámka: Blacklist funguje jen pro současné sezení. Použijte Otevřít/Uložit "
+"pokud chcete uchovat vaše nastavení, nebo použijte zásuvný modul IPFilter "
+"(PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Zakázané protějšky"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "IP adresa protějšku"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Přidat protějšek:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Přidá protějšek na blacklist"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Odstraní vybraný protějšek z blacklistu"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Vyčis&tit"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Vyčistit tento seznam"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Uložit j&ako..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Uložit tento blacklist pro použití se zásuvným modulem IPFilter"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maximum stahování:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maximum odesílání:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Začít stahovat i pokud je na disku málo místa :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimální místo na disku:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Nespouštět"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Vždy se zeptat"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Spustit"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 je bez omezení)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maximální rychlost stahování:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Souhrnný limit připojení:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Maximální doba sdílení:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maximum připojení na torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Počet slotů pro odesílání:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Port UDP trackeru:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maximální poměr sdílení:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maximální rychlost odesílání:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/s (0 je bez omezení)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Hodin (0 je bez omezení)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "Pokračovat ve &sdílení i když je stahování dokončeno"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Pozor"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Pokud jste za routerem, musí být předány také výše uvedené porty. Zásuvný modul "
+"UPnP to za vás může udělat."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Správce fronty"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Stav:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Poměr sdílení:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Zbývá bajtů:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Spravuje fronta"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Ode&sílání"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Odesláno:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Přesunout &výš"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Přesunout &níž"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Přesunout nahoru"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Přesunout &dolů"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Spravováno ve &frontě"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Ovládání &uživatelem"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Vložit URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "Z&rušit"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Vytvořit torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Soubor nebo složka, ze které chcete vytvořit torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Je třeba přidat aspoň jeden tracker nebo uzel."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Možnosti souboru"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Velikost bloku:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Začít &sdílet torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Decentrali&zováno (pouze DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privátní torrent (DHT nepovoleno)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Komentáře:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "V&ytvořit"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Z&rušit"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackery"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT uzlů"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Uzel:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "Vlastní IP nebo jméno hostitele"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Poznámka: Nějaké známé DHT nody jsou již přidány. Měl byste přidat svou vlastní "
+"IP adresu a port, pokud plánujete sdílet tento torrent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Pokročilé volby"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent algoritmus:</b> Výchozí algoritmus používá komcinace ostatních "
+"algoritmů založené na našich testech."
+"<br>\n"
+"<b>Algoritmus aktuální rychlosti:</b> Nejjednodušší algoritmus - Zbývající "
+"data/Aktuální rychlost"
+"<br>\n"
+"<b>Algoritmus celkové průměrné rychlosti:</b> Zbývající data/Průměrná rychlost"
+"<br>\n"
+"<b>Okno algoritmu X:</b>  Odhadovaný čas vypočítávaný z X rychlostních vzorků"
+"<br>\n"
+"<b>Algoritmus pohyblivého průměru:</b> Pohyblivý průměr rychlosti vypočítávaný "
+"z X vzorků"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Aktuální rychlost"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Celková průměrná rychlost"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Okno X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Pohyblivý průměr"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(změny se projeví až po restartu aplikace)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Vy&pnout předallokování místa na disku"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Kompletně předallokovat místo na disk&u (předejdete fragmentaci)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Základní (pomalé)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Podle filesystému"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Výkon"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Využití paměti:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Nízké"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Střední"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Vysoké"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Interval aktualizace GUI:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Rychlé CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Pomalé CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Kontrola dat"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Během odesílání &nekontrolovat bloky větší než"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Zkontroluj integrit&u dat po"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "chybných blocích"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Síťové nástroje"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maximální počet připojení na jeden torrent (0= bez omezení)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Nepoužívat KDE pro&xy pro HTTP spojení s trackerem"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP proxy pro spojení s trackerem:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Kontroluji data"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Kontroluji data torrentu:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Počet nalezených bloků:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Počet chybných/nestažených bloků:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maximální počet stahování (0 = bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maximální počet sdílení (0 = bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Začít stahovat pokud je na disku málo místa?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maximální počet připojení na jeden torrent (0= bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Maximální počet připojení na všechny torrenty (0= bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maximální rychlost odesílání v KB/s (0 = bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maximální rychlost stahování v KB/s (0 = bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maximální poměr sdílení (0 = bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maximální čas sdílení v hodinách (0 = bez omezení)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Zapustit ikonu do panelu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Zobrazit ikonu v systémovém panelu i s rychlostí"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Pásmo pro stahování (v kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Pásmo pro odesílání (v kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Zobrazit vyskakovací zprávu, jakmile bude torrent stažen."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Sdílet soubor i po stažení"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Složka pro dočasné soubory"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Jestli automaticka ukládat stahování do saveDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Složka pro stažené soubory"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Zda-li automaticky automaticky přesouvat dokončená stahování do completedDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Složka pro stažené soubory"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Zda-li automaticky automaticky kopírovat .torrent soubory do torrentCopyDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Složka pro .torrent soubory"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Zda použít vlastní IP na předání trackeru"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Složka, která byla použita jako sposlední k uložení"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP na předání trackeru"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Použití pamětiVyužití paměti"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Interval aktualizace GUI"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Podpora DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Počet slotů pro odesílání"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Viditelné sloupce v KTorrentView"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algoritmus pro průměr"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Když už není místo k dokončení stahování a volné místo na disku je menší než "
+"minDiskSpace, torret bude zastaven."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Správce zásuvných modulů"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Načíst"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Uvol&nit"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "N&ačíst vše"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Uvolnit vše"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Výchozí UPnP zařízení"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Zjištěná zařízení:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Zařízení"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Předávané porty"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN připojení"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Před&at porty"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Vrátit zpět předávání portů"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Znovu projít"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Povolit procházení složky 1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Povolit procházení složky 2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Povolit procházení složky 3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Cesta ke složce 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Cesta ke složce 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Cesta ke složce 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Zda otevírat torrenty bez dotazování či ne."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Označeno Smazat."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Označeno Přesunout."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Nastavení procházení složek"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Procházet složku &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Procházet složku &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Procházet složku &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Přesunout do složky \"načteno\" po n&ačtení"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Přesunout torrenty do složky \"načteno\" po jejich načtení"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Otevírat torrent&y bez dotazování"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Nezobrazovat dialog pro vybrání souborů, které se mají stahovat"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "S&mazat po načtení"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Smazat torrent po načtení"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Složky k prohledávání"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Složka 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Složka 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Složka 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Nastavení hledání"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Webový server"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Předat port"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Délka platnosti Session (v sekudnách):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Vyber uživatelské rozhraní:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Uživatelské jméno:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Změnit heslo ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Cesta k php:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Číslo portu"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Předat port"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Délka platnosti sezení"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Vzhled rozhraní"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Cesta ke spustitelnému souboru php"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "uživatelské jméno"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "heslo"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Bloky"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Celkem:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Právě se stahuje:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Staženo:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Vyloučeno:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Zbývá:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Velikost:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Blok"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Průběh"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Protějšek"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Přiřazené protějšky"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Protějšky:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Stahující:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Průměrná rychlost stahování:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Průměrná rychlost odesílání:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Další aktualizace za:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Stav trackeru:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Části souboru, které jsou staženy:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Části souboru, které jsou dostupné:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Sdílení"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Režim sdílení se vypne, jakmile sdílecí poměr dosáhne této hodnoty. Pokud je "
+"nulová, tak je bez limitu."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Režim sdílení se vypne, jakmile doba sdílení dosáhne této hodnoty."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Hodiny"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Sdílecí limit:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Limit funguje pouze, v režimu sdílení"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Časový &limit:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Aktualizovat tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minimální interval aktualizace - 60 sekund"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Přidat t&racker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Odstranit tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Změ&nit tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Obnovit výchozí"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Zobrazit kartu protějšků v hlůavním okně"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Zobrazit kartu stahování bloků v hlavním okně"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Zobrazit záložku s trackery v hlavním okně"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Zobrazit seznam protějšků"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Zobrazit seznam právě stahovaných por&cí"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Zobrazit seznam trackerů"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Nastavení blokování IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Vyberte soubor s filtrem"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Použít filtr KTorrent?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Soubor IP filtru:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Stáh&nout/převést"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Stáhnout KTorrent filtr z bluetack.co.uk nebo blocklist.org. \n"
+" Poznámka: ZIP soubor z bluetack.co.uk je podporován."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL filtru úrovně 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Použít filtr úrovně 1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Převádí se..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Stiskněte tlačítko 'převést' pro započětí převodu anti p2p souboru. Poznámka: "
+"Tato činnost bude nějakou dobu trvat v závislosti na rychlosti počítače. Po "
+"tuto dobu nebudete moci používat KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Aktualizace"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Aktualizovat grafy každé"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "aktualizace GUI"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Sbírej data každých"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisekund"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maximum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Maximální měřítko rychlosti:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Přesné"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Podívejte se na \"Co je to\" pro nápovědu"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Nastavit maximální hodnotu na OY měřítku jako: - Vrchní: Celkově zaznamenaná "
+"nejvyšší hodnota\n"
+"- Přesné: Zvolí jako myximální nejvyšší hodnotu, která je viditelná na grafu"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Rychlost protějšků"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Rychlost protějšků:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "aktualizovat každé"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "aktualizace dat v grafu"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "Získávání dat o množství připojených protějšcích může vytěžovat CPU."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Připojení protějšků"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Vysoké hodnoty mohou znehodnotit graf připojených protějšků"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Zobrazit sdílející v roji"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Zobrazit stahující v roji"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Počty měření"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Odesílání"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Připojení"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Protějšky"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Přepnout graf rychlosti protějšků"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Doba mezi získáváním dat ohledně rychlosti protějšků"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Přepnout vykreslování stahujících v roji"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Přepnout vykreslování sdílejících v roji"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Počet měčení stahování"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Počet měření rychlosti protějšků"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Počet měření odesílání"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Počet měření připojení"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Počet měření DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importovat existující stahování"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Data:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Zadejte torrent a data již stažená z tohoto torrentu."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importovat"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "výchozí"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS kanály"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Kanály"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Smazat"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nový"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Členy"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Au&tomaticky obnovit"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnoruj TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Obnovit"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "Náze&v"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Ponechat články (dní)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktivní"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtry"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Filtry pro přijetí"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Filtry pro zahození"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Regulární výrazy"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Zacházet jako  &s řadou"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Průběh"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Maximální díl"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Maximální řada"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Minimální řada"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Minimální díl"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Testovací te&xt"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&st"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Shody filtru"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Plánovač pásma"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Kategorie pro levé kliknutí"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kate&gorie 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "Vypno&ut"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normální"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategorie &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategorie &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Kategorie pro pravé kliknutí"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategorie &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategorie 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>První kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>Třetí kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "stáhnout:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "odeslat:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>Druhá kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 je bez omezení"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Uložit do souboru"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "N&ačíst ze souboru"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Vynuluj plán"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Stránka s nastavením zásuvného modulu \"Plánovač\""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Použít &plánovač pásma?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Plánovač pásma"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Použít barvy místo o&brázků?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Doporučené pro pomalé počítače)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Upravit p&lán"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Povolit plánovač pásma?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Použít barvy místo obrázků?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Použít textové logy s více informacemi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Příznak obecných informací"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Příznak informací o připojení"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Příznak informací o DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Příznak informací o trackeru"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Příznak informací o diskových I/O"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Příznak informací o IPFiltru"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Pžíznak informací o hledání"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Příznak informací o importu neúplných souborů"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Příznak informací o InfoWidgetu"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Příznak informací o UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Příznak informací o procházení složek"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Příznak informací o plánování"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Příznak informací o RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Příznak informací o webovém rozhraní"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Možnosti zobrazení logu"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Zásuvné moduly"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Vše"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Ladění"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Upozornění"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Důležité"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Nic"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IPFIlter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Hledání:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Procházení složek:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Plánovač:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Import neúplného souboru:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS zásuvný modul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Zásuvný mosul webového rozhraní:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Systém"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Obecné:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Připojení:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Diskové I/O:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Použít bohaté te&xtové logy"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Externí prohlížeč"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Otevírat výsledky vyhledávání v externím prohlížeči"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Použít výchozí prohlížeč"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Vlastní cesta k prohlížeči:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Vyhledávače"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Název vyhledávače:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "Přid&at"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Vyhledávače"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Odstranit vš&e"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Př&idat výchozí"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Aktualizovat z internetu"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Hledat"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Vyhledávač:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Aktuální vyhledávač"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Použít vlastní prohlížeč"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Cesta ke spustitelnému souboru prohlížeče"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 den \n"
+"%n dní \n"
+"%n dní "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Ano, nejdříve"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Ano, poslední"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Nelze otevřít soubor se záznamem %1: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Nelze zapisovat do %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Nelze číst z %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "nelze vytvořit adresář %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Nelze odkázat %1 na %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Nelze přesunout %1 do %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Nelze kopírovat %1 do %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Nelze smazat %1 : %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Nelze vytvořit %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Nelze spočítat velikost souboru %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Nelze spočítat velikost souboru : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Nelze otevřít %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Nelze rozšířit soubor : %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Nelze rozšířit soubor"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Nelze hledat v souboru : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Nemohu zapisovat na konec mmap bufferu!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Stav: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Načteno"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Nenačteno"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Možnosti zásuvného modulu"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Nelze otevřít soubor %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Adresář %1 neexistuje"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Neplatný token: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Chyba v dekódování"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Neočekávaný konec vstupu"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Nelze převést %1 na celé číslo"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent je nekompletní!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Poškozený torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Nelze otevřít torrent soubor %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Chyba analýzy"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Při načítání torrent souboru došlo k chybě. Nejčastější příčinou bývá poškozený "
+"torrent soubor nebo soubor, který není torrent.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Při načítání torrent souboru došlo k chybě. Nejčastější příčinou bývá poškozený "
+"torrent soubor nebo soubor, který není torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Nelze vytvořit %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr "Torrent %1 již stahujete. Seznam trackerů obou torrentů byl sloučen."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Již stahujete torrent %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Nelze převést %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Torrent %1 jste začal(a) stahovat s dřívější verzí KTorrentu. Aby tento torrent "
+"bez problémů fungoval i v současné verzi, bude převeden na novější verzi. "
+"Budete dotázán(a) na umístění, kam chcete torrent uložit. Pokud stisknete "
+"Zrušit, bude zvolen domovský adresář."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Vybrat složku k uložení"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Nespuštěno"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Sdílím"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Stahuji"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Stojící"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Zastaveno"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Chyba: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Přidělování diskového prostoru"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Ve frontě"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Kontroluji data"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Zastaveno. Není místo na disku."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Nemáte dostatek místa na disku ke stažení tohoto torrentu. Jste si jisti, že "
+"chcete pokračovat?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Nedostatek místa na disku pro %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" již dosáhl maximálního poměru sdílení. Přejete si ignorovat "
+"limit a začít sdílet i přesto?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Bylo dosaženo maximálního sdílecího poměru."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Chyba při zastavování torrentu %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Chyba při spouštění torrentu %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Připojuji se"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Neznámý klient"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 protějšek\n"
+"%n protějšky\n"
+"%n protějšků"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Nelze vytvořit soubor %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Selhalo zapisování prvního bloku do souboru DND: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Selhalo zapisování posledního bloku do souboru DND: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Nemohu otevřít %1 pro zápis : souborový systém je pouze pro čtení"
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Nelze rozšířit soubor : %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Nelze rozbalit soubor %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Nelze rozbalit soubor %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Chyba: Čtení za koncem souboru %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Chyba při čtení z %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Chyba při zápisu do %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Chyba při zapisování do %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Nelze před-rozdělit prostor na disku : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Nelze svázat UDP port %1 ani dalších 10 portů."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Neplatná odpověď od trackeru"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Neplatná data z trackeru"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Neplatné URL trackeru"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Nelze otevřít soubor %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Nelze vytvořit soubor s indexem: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Nelze otevřít soubor: %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Používá UPnP k automatickému předávání portů na váš router"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "V popisu zařízení nelze nalézt službu předávání portů!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP zařízení"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Automaticky prochází složky, hledá torrenty a načítá je."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Procházení složek"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Procházení složek"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Možnosti procházení složek"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "načteno"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Procházení složek - Složka %1: Chybné URL nebo neexistující složka. Zvolte "
+"prosím platný adresář."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Webové rozhraní"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Možnosti webového rozhraní"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+#, fuzzy
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "PHP interpretr není v $PATH, prosím nastavte cestu ručně"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Zadejte prosím nové heslo pro webové rozhraní."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 existuje a je spustitelný"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "%1 neexistuje"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+#, fuzzy
+msgid "%1 is not executable"
+msgstr "%1 není spustitelný"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 je složka"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+#, fuzzy
+msgid "%1 is not php executable path"
+msgstr "%1 není cesta k interpretru PHP"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Webové rozhraní"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Povolit ovládání ktorrentu pomocí prohlížeče"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Stáhnout přednostně"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Stáhnout normálně"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Stáhnout jako poslední"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Odstranit soubor(y)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Dostupné"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Čekající"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Ztratíte všechna data v tomto souboru, opravdu si to přejete udělat ?\n"
+"Ztratíte všechna data v těchto souborech, opravdu si to přejete udělat ?\n"
+"Ztratíte všechna data v těchto souborech, opravdu si to přejete udělat ?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Bez limitu"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Info Widget"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Zobrazuje doplňující informace o stahovaném torrentu. Např. kolik bloků již "
+"bylo staženo, kolik je zdrojů a kolik stahujících ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Nelze přidat tracker k privátnímu torrentu."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Nelze odstranit výchozí tracker torrentu."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Nemůžete přidat tracker k privátnímu torrentu"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Země"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klient"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Udušeno"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Utlumený"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Dostupnost"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Skóre"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Odesílací slot"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Požadavky"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Odpojit protějšek"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Zakázat protějšek"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Dostupné bloky"
+"<br><img src=\"unavailable_color\">&nbsp; - Nedostupné bloky"
+"<br><img src=\"excluded_color\">&nbsp; - Vyloučené bloky"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Možnosti informačního Widgetu"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Stažené bloky"
+"<br><img src=\"unavailable_color\">&nbsp; - Bloky ke stažení"
+"<br><img src=\"excluded_color\">&nbsp; - Vyloučené bloky"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Převést"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Nahrává se txt soubor..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Čekejte prosím..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Soubor převeden."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Nelze načíst filtr:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Chybný soubor filtru. Soubor je poškozený nebo má špatný formát."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Odstraňuje nechtěné protějšky na základě jejich IP adres"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Nastavení blokování IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Stav: zaveden a běží."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Stav: nezaveden."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Stav: <font color=\"#ff0000\">soubor filtru nenalezen.</font> "
+"Stáhnout a konvertovat soubor filtru."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Zvolený soubor již existuje, chcete jej stáhnout znovu?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Soubor existuje"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "Soubor filtru (level1.dat) již existuje, chcete jej znovu konvertovat?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtr blokování IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Volby filtru blokování IP"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistika"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Statistické volby"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Připojených stahovačů"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Stahujících v roji"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Připojeno sdílejících"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Sdílejících v roji"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Průměrně připojeno stahujících na torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Průměrně připojeno sdílejících na torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Průměrně připojených stahujících na běžící torrent"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Průměrně připojených sdílejících na běžící torrent"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Uzlů"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Úloh"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Zobrazit statistiky přenosu"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Statistiky rychlosti"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Statistiky připojení"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Současná"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Průměrná"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Omezení"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Průměrně od stahujících"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Průměrně pro stahující"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Průměrně od sdílejících"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Od stahujících"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Od sdílejících"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent soubory"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Všechny soubory"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Nelze ověřit data: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Nelze načíst torrent: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importuje částečně nebo úplně stažené torrenty z jiných klientů"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importovat existující stahování"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL RSS zdroje"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Automaticky prochází RSS zdroje, vyhledává torrenty odpovídající regulárnímu "
+"výrazu a načítá je."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS novinky"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Název"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Popis"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Odkaz"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Řada"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Díl"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Zbývající čas"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Plánovač"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Možnosti plánovacího pluginu"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "Po"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "Út"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "St"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "Čt"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "Pá"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "So"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "Ne"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Časovač uložen."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Soubor nenalezen."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Časovač nahrán."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Plugin plánování pásma"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Otevřít plánovač pásma"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Plánovač pásma je vypnutý. Přejděte na Nastavení -> Nastavit KTorrent -> "
+"Plánovač, abyste jej povolili."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Prohlížeč záznamů"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Prohlížeč záznamů"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Zobrazuje logovací výstup KTorrentu"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Musíte zadat název vyhledávače a URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Vyhledávač zadaného jména již existuje. Zadejte jiný název."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Špatné URL. Měli jste prohlížečem vyhledávat FOOBAR a zkopírovat/vložit sem "
+"přesnou URL."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Hledání"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Možnosti vyhledávače"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Vyhledávám %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent soubory"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Hledání dokončeno"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Vyhledávač: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Vyhledává torrenty v několika oblíbených vyhledávačích torrentů"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Chcete stáhnout nebo uložit torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Stáhnout torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Stáhnout"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Hledá protějšky, kteří používají ktorrent na místní síti, aby s nimi mohl "
+"sdílet torrenty"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algoritmus pro průměr:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Nelze načíst blok %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Trackery"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
diff --git a/translations/cy/Makefile.am b/translations/cy/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/cy/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/cy/messages/Makefile.am b/translations/cy/messages/Makefile.am
new file mode 100644
index 0000000..93f71da
--- /dev/null
+++ b/translations/cy/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = cy
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/cy/messages/ktorrent.po b/translations/cy/messages/ktorrent.po
new file mode 100644
index 0000000..89665b8
--- /dev/null
+++ b/translations/cy/messages/ktorrent.po
@@ -0,0 +1,5012 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Gwybo"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Dechrau"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Aros"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "Hoffterau"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "Torrent Files"
+msgstr "KTorrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Pob Ffeil"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Agor Lleoliad"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "KTorrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+#, fuzzy
+msgid "Find:"
+msgstr "Wedi Gorffen"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "S&ymud i fyny"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "S&ymud i fyny"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "S&ymud i fyny"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Dewiswch ffeil"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr ""
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL annilys."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Lawrlwythiadau"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Ail-greu"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Methu creu %1: %2"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Methu creu %1: %2"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Ail-greu"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Methu creu %1: %2"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Gwall wrth ysgrifennu i %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Gwall wrth ysgrifennu i %1"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dogfen i'w hagor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "Ategion"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Dewisiadau Cyffredinol"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+#, fuzzy
+msgid "Application icon and a couple of others"
+msgstr "Eicon y cymhwysiad"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:134
+#, fuzzy
+msgid "1.0 application icon"
+msgstr "Eicon y cymhwysiad"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "Gwlad"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Plygyll"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Plygyll"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Plygyll"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Methu creu %1: %2"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Creu ... %1"
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "Enw"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "Ar gael"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+#, fuzzy
+msgid "Queued uploads"
+msgstr "Mewn Ciw"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "KTorrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Ar gael"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Ar gael"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Hoffterau"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Rhagolwg"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "Cyfeiriaduron"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+#, fuzzy
+msgid "Data Directory"
+msgstr "Cyfeiriaduron"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+#, fuzzy
+msgid "Temporary Directory"
+msgstr "Cyfeiriaduron"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Lawrlwythiadau"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "URL annilys."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Hoffterau"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Cyffredinol"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Dewisiadau Cyffredinol"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Dewisiadau Cyffredinol"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Cyflwr"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Maint"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "KTorrent"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:378
+#, fuzzy
+msgid "Remove Download"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Defnyddiwr"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, fuzzy, no-c-format
+msgid "Queue Manager"
+msgstr "Trefnydd Ategion"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+#, fuzzy
+msgid "Download completed"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Lawrlwytho"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Gwall wrth ysgrifennu i %1"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Heb derfyn"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Cymhwysiad KPart KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+#, fuzzy
+msgid "Cannot open index file %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "KD wrth KGyfieithu"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "kyfieithu@dotmon.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "KTorrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Dewis Pope&th"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Dewis D&im"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Gwrthdroi Dewisiad"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Cêl-ysgrifaeth"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Plygyll"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "KTorrent"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "lanlwytho:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Porth:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "lanlwytho:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Taler Sylw"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Cyflwr:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, fuzzy, no-c-format
+msgid "Torrent"
+msgstr "KTorrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "S&ymud i fyny"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Symud i la&wr"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "S&ymud i fyny"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "I&awn"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Diddymu"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Sylwadau :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "Cre&u"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Di&ddymu"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Dim"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Porth"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Hoffterau"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Hoffterau"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Defnydd Cof :"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Isel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Canolig"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Uchel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Profi"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Methu creu %1: %2"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Methu creu %1: %2"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Defnydd Cof"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Trefnydd Ategion"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Llwytho"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, fuzzy, no-c-format
+msgid "U&nload"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Llwytho"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Dyfais"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, fuzzy, no-c-format
+msgid "Ports Forwarded"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, fuzzy, no-c-format
+msgid "WAN Connection"
+msgstr "Cysylltiadau:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Ailsyllu"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, fuzzy, no-c-format
+msgid "Folder1 path"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, fuzzy, no-c-format
+msgid "Folder2 path"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, fuzzy, no-c-format
+msgid "Folder3 path"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Methu creu %1: %2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Hoffterau"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "KTorrent"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, fuzzy, no-c-format
+msgid "Folders to scan"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, fuzzy, no-c-format
+msgid "Folder 1:"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, fuzzy, no-c-format
+msgid "Folder 2:"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, fuzzy, no-c-format
+msgid "Folder 3:"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, fuzzy, no-c-format
+msgid "Search Preferences"
+msgstr "Hoffterau"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "Dewis D&im"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "Defnyddiwr"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Dewisiadau Cyffredinol"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Cyfanswm:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, fuzzy, no-c-format
+msgid "Currently downloading:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, fuzzy, no-c-format
+msgid "Downloaded:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Gwaharddwyd :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Maint:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Cynnydd"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Cyflwr:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Rhannu"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "Heb derfyn"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "Ar gael"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Ar gael"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Ar gael"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Ar gael"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, fuzzy, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, fuzzy, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Hoffterau"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "KTorrent"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "KTorrent"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, fuzzy, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, fuzzy, no-c-format
+msgid "Converting..."
+msgstr "Creu ... %1"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Canolig"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "Cysylltiadau:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "Cysylltiadau:"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Lawrlwythiadau"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "KTorrent"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Data:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Mewnforio"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Hoffterau"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "Pob Ffeil"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Cynnydd"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, fuzzy, no-c-format
+msgid "Te&st"
+msgstr "Profi"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "T&roi i ffwrdd"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Arferol"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Categoriau"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "Lawrlwytho"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "lanlwytho:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Cadw i Ffeil"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "I&awn"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Peiriant chwilio :"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Dewisiadau Cyffredinol"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Peiriant chwilio :"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Peiriant chwilio :"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Peiriant chwilio :"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "Dewisiadau Cyffredinol"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Ategion"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Popeth"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Noder"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Pwysig"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Dim"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "Hoffterau"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Chwiliad:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "Plygyll"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Dewisiadau Cyffredinol"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Cysawd"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Cyffredinol:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Cysylltiadau:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, fuzzy, no-c-format
+msgid "Search Engines"
+msgstr "Peiriant chwilio :"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, fuzzy, no-c-format
+msgid "Search engine name:"
+msgstr "Peiriant chwilio :"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Ychwanegu"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "G&waredu Popeth"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Chwilio"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Peiriant chwilio :"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 CB/eil"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+#, fuzzy
+msgid "Cannot open log file %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/file.cpp:87
+#, fuzzy
+msgid "Cannot write to %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, fuzzy, c-format
+msgid "Cannot read from %1"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+#, fuzzy
+msgid "Cannot open %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Wedi'i lwytho"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Not loaded"
+msgstr "Lawrlwytho"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+#, fuzzy
+msgid "Plugin Options"
+msgstr "Peiriant chwilio :"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+#, fuzzy
+msgid "Cannot open file %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:203
+#, fuzzy
+msgid "Torrent is incomplete!"
+msgstr "KTorrent"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+#, fuzzy
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+#, fuzzy
+msgid "Cannot migrate %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Lawrlwytho"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Wedi Seibio"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Wedi aros"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Gwall:"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Mewn Ciw"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+#, fuzzy
+msgid "Error stopping torrent %1 : %2"
+msgstr "Gwall wrth ysgrifennu i %1"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+#, fuzzy
+msgid "Error starting torrent %1 : %2"
+msgstr "Gwall wrth ysgrifennu i %1"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr ""
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, fuzzy, c-format
+msgid "Error reading from %1"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:403
+#, fuzzy
+msgid "Error writing to %1 : %2"
+msgstr "Gwall wrth ysgrifennu i %1"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Gwall wrth ysgrifennu i %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Methu creu %1: %2"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr ""
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr ""
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr ""
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+#, fuzzy
+msgid "Cannot open file : %1 : %2"
+msgstr "Methu creu %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Plygyll"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder"
+msgstr "Plygyll"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "Dewisiadau Cyffredinol"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "wedi'i lwytho"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Dewisiadau Cyffredinol"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+#, fuzzy
+msgid "%1 is a directory"
+msgstr "Cyfeiriaduron"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Dewisiadau Cyffredinol"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "Lawrlwythiadau"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "Lawrlwytho"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "Lawrlwythiadau"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "Pob Ffeil"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Ar gael"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "Heb derfyn"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Gwlad"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Dibynnydd:"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+#, fuzzy
+msgid "Availability"
+msgstr "Ar gael"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Sgôr"
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "Lawrlwytho"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Trosi"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Disgwyliwch ..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Hoffterau"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+#, fuzzy
+msgid "Status: Not loaded."
+msgstr "Lawrlwytho"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Ffeil yn Bodoli"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter"
+msgstr "Hoffterau"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter Options"
+msgstr "Hoffterau"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Cyflwr"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Cysylltiadau:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Cysylltiadau:"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Dangos eicon y teclyn &cysawd"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Dim"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "Cysylltiadau:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "KTorrent"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "Heb derfyn"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Plygyll"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Plygyll"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "Torrent files"
+msgstr "KTorrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Pob Ffeil"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "Methu creu %1: %2"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, fuzzy, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Methu creu %1: %2"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr ""
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Disgrifiad"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "Peiriant chwilio :"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Ni chanfuwyd y ffeil."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "Dewisiadau Cyffredinol"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Chwilio"
+
+#: plugins/search/searchprefpage.cpp:247
+#, fuzzy
+msgid "Search Engine Options"
+msgstr "Peiriant chwilio :"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "Creu ... %1"
+
+#: plugins/search/searchwidget.cpp:209
+#, fuzzy
+msgid "torrent files"
+msgstr "KTorrent"
+
+#: plugins/search/searchwidget.cpp:267
+#, fuzzy
+msgid "Search finished"
+msgstr "wedi Gorffen"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Peiriant chwilio :"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Lawrlwytho"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Methu creu %1: %2"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Cyflwr:"
+
+#, fuzzy
+#~ msgid "Alt+N"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "Lawrlwytho"
+
+#, fuzzy
+#~ msgid "Alt+K"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+U"
+#~ msgstr "Alt+A"
+
+#~ msgid "Alt+A"
+#~ msgstr "Alt+A"
+
+#~ msgid "Form1"
+#~ msgstr "Ffurf1"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Form2"
+#~ msgstr "Ffurf1"
+
+#~ msgid "Name"
+#~ msgstr "Enw"
+
+#~ msgid "Author"
+#~ msgstr "Awdur"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Lawrlwytho"
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Lawrlwythiadau"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Lawrlwytho"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "KTorrent"
+
+#~ msgid "St&atus"
+#~ msgstr "Cy&flwr"
+
+#, fuzzy
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Alt+G"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+1"
+
+#~ msgid "finished"
+#~ msgstr "wedi Gorffen"
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "Peiriant chwilio :"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "Lawrlwytho"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "Lawrlwytho"
+
+#~ msgid "Completed"
+#~ msgstr "Gorffenwyd"
+
+#~ msgid "Alt+C"
+#~ msgstr "Alt+C"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "Chwilio"
+
+#, fuzzy
+#~ msgid "Alt+O"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "KTorrent"
+
+#~ msgid "Name:"
+#~ msgstr "Enw:"
+
+#, fuzzy
+#~ msgid "Alt+R"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Available trackers:"
+#~ msgstr "Ar gael"
+
+#~ msgid "Down:"
+#~ msgstr "I Lawr :"
+
+#~ msgid "Up:"
+#~ msgstr "I fyny :"
+
+#~ msgid "Fi&les"
+#~ msgstr "Ffei&liau"
+
+#~ msgid "."
+#~ msgstr "."
+
+#, fuzzy
+#~ msgid "Alt+Q"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Downlo&ad"
+#~ msgstr "Lawrlwytho"
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+1"
+
+#~ msgid "yes"
+#~ msgstr "ie"
+
+#~ msgid "no"
+#~ msgstr "nage"
+
+#, fuzzy
+#~ msgid "Cannot preallocate diskspace : %s"
+#~ msgstr "Methu creu %1: %2"
+
+#, fuzzy
+#~ msgid "&Status"
+#~ msgstr "Cyflwr"
+
+#~ msgid "Do Not Save"
+#~ msgstr "Peidiwch â Chadw"
+
+#~ msgid "Start"
+#~ msgstr "Dechrau"
+
+#~ msgid "Are you sure?"
+#~ msgstr "Ydych Yn Sicr?"
+
+#~ msgid "ID"
+#~ msgstr "ID"
diff --git a/translations/da/Makefile.am b/translations/da/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/da/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/da/messages/Makefile.am b/translations/da/messages/Makefile.am
new file mode 100644
index 0000000..8452929
--- /dev/null
+++ b/translations/da/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = da
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/da/messages/ktorrent.po b/translations/da/messages/ktorrent.po
new file mode 100644
index 0000000..66fe2f8
--- /dev/null
+++ b/translations/da/messages/ktorrent.po
@@ -0,0 +1,4888 @@
+# translation of ktorrent.po to
+# Danish translation of ktorrent
+#
+# Erik Kjær Pedersen <erik@binghamton.edu>, 2005, 2006, 2007.
+# Martin Moeller <martin@martinm-76.dk>, 2006.
+# Martin Schlander <suse@linuxin.dk>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-01-24 16:36+0100\n"
+"Last-Translator: Martin Schlander <suse@linuxin.dk>\n"
+"Language-Team: <dansk@dansk-gruppen.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Ingen indkommende forbindelser (måske bag lukket firewall)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Info"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Data overført i den nuværende session"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Nuværende hastighed for alle torrenter sammenlagt"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupper"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Start"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Stop"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Start alle"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Stop alle"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Indsæt URL for torrent..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Åbn køhåndtering..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Tilføj til/Fjern fra kø"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-filter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Kontrollér dataintegritet"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Sæt maksimal upload-hastighed"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Sæt maksimal download-hastighed"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent-filer"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Alle filer"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Åbn sted"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Hastighed ned: %1 op: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Overført ned: %1 op: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 knuder, %2 aktiviteter"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: fra"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Alle torrenter"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Find:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Versalfølsom"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Flyt til venstre dok"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Flyt til højre dok"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Flyt til nederste dok"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Tildel accelerator..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Ryd accelerator"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Ændr knapnummer"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nyt acceleratornummer:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Du skal indtaste IP-adresser af formen 'XXX.XXX.XXX.XXX'. Du kan også bruge "
+"jokertegn for områder såsom '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Vælg en fil"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Vælg et filnavn at gemme til"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Misdannet URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Download"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Overførsler"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Angiven port (%1) er ikke tilgængelig eller bruges af et andet program. "
+"KTorrent bruger nu port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"Ktorrent kan ikke acceptere forbindelser eftersom portene %1 til %2 allerede "
+"bruges af et andet program."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Kan ikke oprette torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Flere datafiler i din torrent \"%1\" mangler. Vil du genoprette dem, eller vil "
+"du lade være med at hente dem hjem?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Genopret"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Hent ikke"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Kan ikke genoprette manglende filer: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Datafiler mangler"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Kan ikke fravælge manglende filer: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Filen hvor data fra din torrent \"%1\" gemmes mangler. Vil du genoprette den?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Genopret ikke"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Kan ikke genoprette datafil: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Datafil mangler"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Kontrollerer dataintegritet"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "uendelig"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Fejl ved gennemsøgning af data: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Skanner data fra <b>%1</b>:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Et BitTorrent-program for KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Fejlsøgningstilstand"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokument der skal åbnes"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS-plugin:"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Webinterface-plugin"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statistik-plugin"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Programikon og et par andre"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Download-ikoner"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Programikon for 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Værktøjsvink i ChunkBar og sortering af IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Landefinder til InfoWidget-pluginet (Dette produkt indeholder GeoLite-data "
+"skabt af MaxMind, tilgængelig fra http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Landeflag"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Filprioritering"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp anvendes som et eksempel for vor egen implementering af UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Programrettelse for globalt maksimalt delingsforhold"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Forbedringer af Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk-webgui"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl-kode fra KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Forbedring af konverteringshastighed i ipfilter-pluginet"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Fandt 2 sårbarheder ifht. sikkerhed (begge er rettet)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Rettelse som skal indlæses stille med gemmeplacering"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Rettelser i webinterfacets PHP-kode"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS-specifik præallokering af disk"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Rettelse til ikke at vise meget lave hastigheder"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Rettelse som viser status af mulig lukket firewall"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Adskillige rettelser"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Rettelse som kan skjule menulinjen"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Rettelse til at ændre filprioriteter i webgui"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Adskillige webgui-rettelser"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Rettelse til filtrerlinje"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Rettelse af ikke-trådet opdatering af filvisning"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Optimering af SHA1 hash-generering"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Rettelse af beregning af ledig diskplads på FreeBSD"
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Rettelse som skal indlæses stille med gemmeplacering"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Du skal vælge en fil eller en mappe."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "Du har ikke tilføjet en tracker, vil du oprette denne torrent?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Du skal tilføje mindst en knude."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent-filer (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Vælg en fil hvor din torrent skal gemmes"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Opretter %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Egne grupper"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Ny gruppe"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Redigér navn"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Fjern gruppe"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Åbn faneblad"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Angiv gruppenavnet."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Gruppen %1 findes allerede."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Angiv det nye gruppenavn."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktive uploads"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Upload i kø"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Download i kø"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Bruger-download"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Bruger-upload"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Inaktive torrents"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Inaktive downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Inaktive uploads"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktive torrents"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktive downloads"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Fjern torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Fjern torrent og data"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Tilføj peers"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Yderligere peer-kilder"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Peer-kilder for torrent:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Peer-udveksling"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Manuel tilkendegivelse"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Forhåndsvisning"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Åbn mappe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Datamappe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Midlertidig mappe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Angiv downloadplacering"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Fjern fra gruppe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Tilføj til gruppe"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Hastighedsgrænser"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Torrenter eksisterer ikke. Rapportér fejlen til Ktorrents udviklere."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Mulig deltager tilføjet."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Misdannet IP-adresse."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Indstillinger"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Download-tilvalg"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT-porten skal være forskellig fra UDP-sporingsporten!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Generelt"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Generelle tilvalg"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Kan ikke slå %1: %2 op\n"
+"Sørg for en gyldig IP-adresse eller et gyldigt værtsnavn."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avanceret"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Avancerede tilvalg"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Synlige søjler"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Hentet"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Størrelse"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Sent"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Download-hastighed"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Upload-hastighed"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tid tilbage"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Seedere"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Leechere"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% færdig"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Delingsforhold"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Downloadtid"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Seedtid"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Alle torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Kan ikke starte mere end 1 download, \n"
+"Kan ikke starte mere end %n download, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"og 1 seed. \n"
+"og %n seeds. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "Gå til Opsætning -> Indstil KTorrent, hvis du vil ændre grænserne."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Download af torrent %1 er ikke færdig. Vil du også fjerne ukomplette data?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Fjern download"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Slet data"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Behold data"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Du vil miste alle downloadede data. Er du sikker på at du vil gøre det?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Du tjekker allerede data fra torrenten %1."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Vælg downloadplacering for %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Du har afmarkeret følgende eksisterende filer. Al data i disse filer vil gå "
+"tabt. Er du sikker på at du vil gøre dette?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Ja, slet filerne"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nej, behold filerne"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " kort!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Bruger"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Kø-håndtering"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nej (privat torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Hastighed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Overførsel:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"Download af <b>%1</b> er færdig."
+"<br>Gennemsnitshastighed: %2 ned %3 op."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Download færdig"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> har nået sit maksimale delingsforhold %2 og er stoppet."
+"<br>Overførte %3 med gennemsnitshastigheden %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Færdig med at seede"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> har nået sin maksimale seedtid på %2 timer og er blevet standset."
+"<br>Uploadede %3 ved en gennemsnitshastighed på %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> er stoppet med følgende fejl:<br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Korrupte data fundet i torrenten <b>%1</b>."
+"<br>Det er en god idé at udføre en kontrol af denne torrents integritet."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> har nået sit maksimale delingsforhold %2 og kan ikke tilføjes til "
+"køen. Fjern begrænsningen manuelt hvis du vil fortsætte med at seede."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> har nået sin maksimale seedtid på %2 timer og kan ikke sættes i kø. "
+"Fjern grænsen manuelt hvis du ønsker at fortsætte med at seede."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Denne torrent kan ikke tilføjes til køen."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Kan ikke starte <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan ikke seede mere end 1 torrent. "
+"<br>\n"
+"Kan ikke seede mere end %n torrents. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan ikke downloade mere end 1 torrent. "
+"<br>\n"
+"Kan ikke downloade mere end %n torrents. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Torrent kan ikke startes"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Der er ikke nok ledig diskplads."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Din disk er ved at løbe tør for plads.<br /><b>%1</b> downloades til '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent er blevet stoppet.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Enhed er ved at løbe tør for plads"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Hastighedsgrænse i Kb/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Ubegrænset"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Hastighedsgrænser for <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Et KDE KPart-program"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Kan ikke åbne indeksfilen %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Erik Kjær Pedersen Martin Møller,Martin Schlander"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "erik@binghamton.edu martin@martinm-76.dk,suse@linuxin.dk"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Markér filerne du vil hente"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Hent til:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Gruppe:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Br&ugerstyret"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Start torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Hent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Vælg &alle"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Vælg &ingen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Invertér markering"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Diskplads"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Krævet diskplads:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Fri diskplads:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Efter download:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Kryptering"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Brug protokolkryptering"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Protokolkryptering bruges til at forhindre at internetleverandører gør "
+"bittorrentforbindelser langsommere."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Tillad ukrypterede forbindelser"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Hvis afmarkeret, kan du kun forbinde til klienter som understøtter kryptering."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istribueret <b>H</b>ash <b>T</b>able protokol."
+"<br>Decentraliseret protokol for peer-udveksling. Se håndbogen for yderligere "
+"information."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Brug DHT til at hente yderligere peers"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP-port for DHT-kommunikation:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Egen IP-adresse"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Se&nd brugerdefineret IP-adresse eller værtsnavn til trackeren"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Brugerdefineret IP-adresse eller værtsnavn:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ikon i statusfeltet"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Vis sta&tusikon"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Vis &hastighedslinje i statusfeltet"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Vis meddelelser i statusfeltet"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Overførselsbåndbredde (i kb/sek):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Download-båndbredde (i kb/sek):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Mapper"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Mappe til at opbevare midlertidige filer:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Flyt afsluttede downloads til:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Gem &automatisk download i:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Kopiér torrent-filer til:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Download-værktøjslinje"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Angiv hastighedsgrænserne for torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maks. uploadhastighed:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maks. downloadhastighed:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 er ubegrænset)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Tilføj mulig peer"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP-adresse for peer:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Angiv IP-adresse og port for peer."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Ktorrents sortlistning"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Bemærk: Sortlistning gælder kun nuværende session. Brug gem og åbn for at gemme "
+"dine indgange, eller bruge IP-filterplugin (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Bandlyste peers"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "IP-adresse for peer"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Tilføj peer:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Tilføjer peer til sortliste"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Fjerner peer fra sortliste"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Ryd"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Rydder listen"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Gem &som..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Gemmer denne sorte liste til at bruge den med Ktorrents IP-filterplugin"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maksimalt antal download:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maksimalt antal seeds:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Start download ved lav ledig diskplads:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimal diskplads:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Start ikke"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Spørg altid"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Tving til start"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 betyder ubegrænset)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maksimal download-hastighed:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Global forbindelsesbegrænsning:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Maks. seedtid:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maksimalt antal forbindelser pr torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Antal overførselsnicher:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP-sporingsport:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maksimalt delingsforhold:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maksimal upload-hastighed:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "Kbyte/sek (0 betyder ubegrænset)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Timer (0 er ubegrænset)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Fortsæt seedning efter download er færdig"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Pas på"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Ovenstående porte skal også videresendes hvis du er bagved en router. "
+"UPnP-pluginnet kan ikke gøre det for dig."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT-kødialog"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Sporer:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Delingsforhold:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Byte tilbage:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Styret af"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Overførsler"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Overført:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Flyt &opad"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Flyt &nedad"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Flyt længst op"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Flyt &længst ned"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Styret af &køhåndtering"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Styret af &bruger"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Indsæt URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Annullér"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Opret en torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Filen eller mappen du vil oprette en torrent for:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Du skal tilføje mindst en sporer eller knude."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Fil-tilvalg"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Størrelse af hver blok:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "&Begynd at seede en torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "De&centraliseret (kun DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privat datastrøm (DHT ikke tilladt)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Kommentarer:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Opret"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Annullér"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Sporere"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT-knuder"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Knude:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "Egen IP-adresse eller eget værtsnavn"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Bemærk: Visse velfungerende DHT-knuder er allerede indsatte. Du bør "
+"formodentlig også indsætte din egen IP-adresse og port hvis du planlægger at "
+"seede denne torrent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Avancerede præferencer"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent-algoritme:</b> Standardalgoritme som anvender en kombination af "
+"andre algoritmer baseret på vores tester."
+"<br>\n"
+"<b>Nuværende hastighed-algoritme:</b> Den mest simple algoritme - Byte "
+"tilbage/Nuværende hastighed"
+"<br>\n"
+"<b>Global gns.hastighed-algoritme:</b> Byte tilbage/Gns.hastighed"
+"<br>\n"
+"<b>Vindue af X-algoritme:</b> Tid tilbage beregnet ud fra X hastighedsprøver"
+"<br>\n"
+"<b>Bevægeligt gennemsnit-algoritme:</b> Bevægelig gns.hastighed beregne ud fra "
+"X hastighedsprøver"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Nuværende hastighed"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Global gns.hastighed"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Vindue af X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Bevægeligt gennemsnt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(får virkning efter genstart)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Deaktivér &præallokering af diskplads"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Præallokér diskplads fuldt ud (undgår fragmentering)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Basal (langsom)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Filsystemsafhængig"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Ydelse"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Hukommelsesforbrug:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Lavt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Middel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Højt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Opdateringsinterval for grafisk grænseflade:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Hurtig CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Langsom CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Datakontrol"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Ved upload skal klumper ikke tjekkes hvis de er større e&nd"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Udfør en kontrol af data&integritet efter"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "skadede stumper"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Netværk"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maksimalt antal forbindelser:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP for IP-pakker:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Brug ikke KDEs proxy-indstillinger til HTTP-tracker-forbindelser"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP-sporingsproxy:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Gennemsøger data"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Skanner data i torrent:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Antal fundne dele:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Antal mislykkede eller ikke hentede dele:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "tekstetiket2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "tekstetikette3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maksimalt antal download (0 = ubegrænset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maksimalt antal seeds (0 = ubegrænset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Start downloads ved lav diskplads?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maksimalt antal forbindelser pr torrent (0 = ubegrænset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Maksimalt antal forbindelser pr torrent (0 = ubegrænset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maksimal upload-hastighed i Kbyte/sek (0 = ubegrænset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maksimal download-hastighed i Kbyte/sek (0 = ubegrænset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maksimalt delingsforhold (0 = ingen begrænsning)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maksimal seedtid i timer (0 er ubegrænset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Vis en ikon i statusfeltet"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Vis hastighedslinje i statusfeltet"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Download-båndbredde (i Kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Overførselsbåndbredde (i Kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Vis meddelelser når en torrent er færdig."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Fortsæt seedning efter download er færdig"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Mappe til at opbevare midlertidige filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Om download automatisk skal gemmes i den angivne mappe"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Mappe til at opbevare downloadede filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Hvorvidt afsluttede downloads automatisk skal flyttes til færdigmappe"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Mappe som filer fra afsluttede downloads skal flyttes til"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Hvorvidt .torrent-filer automatisk skal kopieres til kopimappen for torrenter"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Mappe som .torrent-filer skal kopieres til"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Om en egen IP-adresse skal bruges at sende til sporeren"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Mappen der senst blev brugt som gemmemappe"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP-adresse at sende til sporeren"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Hukommelsesforbrug"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Opdateringsinterval for grafisk grænseflade"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Støtte for DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT-port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Antal overførselsnicher"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Søjler viste i Ktorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Tid tilbage-algoritme"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Når der ikke er plads tilbage til at gennemføre download og ledig diskplads er "
+"mindre end min. diskplads vil torrenten blive stoppet."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Plugin-håndtering"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Indlæs"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Læs af"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "&Indlæs alle"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Aflæs alle"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Standard UPnP-enhed at bruge"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Detekterede enheder:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Enhed"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Videresendte porte"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Forbindelse til fjernnetværk"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Videre&befordring af porte"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Fortryd videresending af porte"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Søg igen"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Aktivér søgning i mappe 1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Aktivér søgning i mappe 2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Aktivér søgning i mappe 3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Søgesti til mappe 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Søgesti til mappe 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Søgesti til mappe 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Om en torrent skal åbnes tavst eller ej."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Sletningshandling markeret."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Forflytningshandling markeret."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Mappesøgningsindstillinger"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Søg i mappe &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Søg i mappe &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Søg i mappe &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Gå til \"&indlæst\" mappe efter indlæsning"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Flyt torrent til \"indlæst\" mappe efter den er indlæst"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Åbn torrent t&avst"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Vis ikke dialogen 'Markér filer at downloade'"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Slet efter indlæsnin&g"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Sletter torrent efter indlæsning"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Mapper at søge i"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Mappe 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Mappe 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Mappe 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Søgeindstillinger"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Web-server"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Videresend port"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Sessionstid at være aktiv (i sekunder)"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Vælg grænseflade:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Brugernavn:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Ændr kodeord..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Søgesti til kørbar fil for PHP:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Portnummer"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "videresend port"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Sessionstid at være aktiv"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "grænseflades udseende"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Søgesti til kørbar fil for PHP"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "brugernavn"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "kodeord"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Blokke"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "I alt:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Nuværende download:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Hentede:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Undtagne:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Venstre:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Størrelse:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Blok"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Fremgang"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Peer"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Tildelte peers"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Seedere:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Leechere:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Gennemsnitlig hastighed nedad:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Gennemsnitlig hastighed opad:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Næste opdatering om:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Sporerens status:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Dele af den torrent som er hentet:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Dele af torrent som er tilgængelige:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Deling"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Din overførsel stoppes når delingsforholdet når denne værdi. Nul betyder ingen "
+"begrænsning."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Dit upload vil stoppe når du har uploadet i så mange timer."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Timer"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Forholdsgrænse:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Grænse virker kun i seed-tilstand"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Tids&grænse:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Opdatér sporer"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minimalt opdateringsinterval - 60 sekunder"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Tilføj spo&rere"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Fjern sporer"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Skift tr&acker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Genopret standard"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Vis peer-visningsfaneblad i hovedvinduet"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Vis visningsfaneblad for blok-download i hovedvinduet"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Vis visningfaneblad for sporere i hovedvinduet"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Vis liste over peers"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Vis liste med blokke som for ø&jeblikket hentes"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Vis liste med sporere"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Indstillinger af IP-blokering"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Vælg PeerGuardian-filterfil "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Brug PeerGuardian-filter?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP-filterfil:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "&Download og konvertér"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Hent PeerGuardian-filter fra bluetack.co.uk eller blocklist.org.\n"
+"Bemærk: ZIP-filer fra bluetack.co.uk understøttes."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Filter-url af niveau 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Brug niveau 1 filter?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Konverterer..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Klik på knappen 'Konvertér' for at påbegynde konvertering af antip2p-fil. "
+"Bemærk: Denne proces kan tage et stykke tid, selv på hurtige computere, og i "
+"den tid kan du ikke bruge Ktorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Opdatér"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Opdatér diagrammer hver"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "GUI-opdateringer"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Saml data hver"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisekunder"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maksimum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Maksimal hastighedsskala-tilstand:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Nøjagtigt"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Se 'Hvad er dette' for mere hjælp"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Sæt maksimumværdi på OY-skala som:\n"
+"- Top: Globalt opnået tophastighed\n"
+"- Nøjagtig: Maksimalt opnået hastighed som er synligt i diagrammet"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Peers-hastighed"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Peers-hastighed:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "opdatér hver"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "opdatering af diagramdata"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "Indsamling af data om mange forbundne peers kan være CPU-forbrugende."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Forbindelser til peers"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Store værdier kan tilsløre diagrammer over forbundne peers"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Vis seedere i sværme"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Vis leechere i sværme"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Målingsoptælling"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Overfør"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Forbindelser"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Skift mellem hastighedsdiagrammer for peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Interval mellem hentning af data om hastighed for peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Skift mellem tegning af leechere i sværme"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Skift mellem tegning af seedere i sværme"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Optælling af downloadmålinger"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Optælling af hastighedsmålinger for peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Optælling af uploadmålinger"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Optælling af forbindelsesmålinger"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Optælling af DHT-målinger"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Maks.tilstand for OY-akse"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importér eksisterende download"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Data:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Angiv torrent og data som allerede er hentet hjem for den torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "Impo&rtér"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "standard"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS-kanaler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Kilder"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "S&let"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Ny"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artikler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "&Opdatér automatisk"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnorér TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Genopfrisk"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Titel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Behold artikler (dage)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktiv"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtre"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Filter til at acceptere"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Filter til at forkaste"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Regulære udtryk"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Behandl som &serier"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Proces"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Kriterier for serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Match uden episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Sidste episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Sidste sæson"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Første sæson"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Første episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Testte&kst"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Test"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtrér træffere"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Skemalægning af båndbredde"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Venstreklikkategori"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kate&gori 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "Luk &af"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategori &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategori &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Højreklikskategori"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategori &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategori 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorier"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "hent:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "overfør:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "kB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 betyder ubegrænset"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Gem til fil"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Indlæs fra fil"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Nulstil skema"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O.&k."
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Indstillingsside for plugin for skemalægning"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "&Brug skemalægning af båndbredde?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Skemalægning af båndbredde"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "brug farver i stedet for p&ixmaps?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Anbefalet for langsommere systemer)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Redigér s&kema"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Aktivér skemalægning af båndbredde?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Brug farver i stedet for pixmaps?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Brug formateret tekst i log"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Meddelelsesflag for generel information"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Meddelelsesflag for forbindelser"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Meddelelsesflag for DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Meddelelsesflag i sporingsinformation"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Meddelelsesflag for information om disk ind- og uddata"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Meddelelsesflag i plugin for IP-filtrering"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Meddelelsesflag i søgeplugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Meddelelsesflag i plugin for delfilimport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Meddelelsesflag i plugin for informationskontrol"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Meddelelsesflag i UPnP-plugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Meddelelsesflag i plugin for mappesøgning"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Meddelelsesflag i plugin for skemalægning"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Meddelelsesflag i RSS-plugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Plugin for internetgrænseflade"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Logvisningstilvalg"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Plugin"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Alle"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Fejlsøgning"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Anmærkning"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Vigtigt"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Ingen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Søg:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Søg i mappe:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Skemalægger:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Delfilimport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Informationskontrol:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-plugin:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Plugin for web-grænseflade"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "System"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Generelt:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Forbindelser:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Disk ind- og uddata:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Brug formateret te&kst i log"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Ekstern browser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Åbn søgninger i ekstern browser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Brug standardbrowser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Søgesti til egen browser:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Søgetjenester"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Søgetjenestens navn:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Tilføj"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Tjenester"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Fjern alt"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Tilføj s&tandard"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Opdatér fra internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Søg"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Søgetjeneste:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Denne søgetjeneste"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Brug egen browser"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Søgesti til kørbar fil for egen browser"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dag \n"
+"%n dage "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Ja, først"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Ja, sidst"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Kan ikke åbne logfilen %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Kan ikke skrive til %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Kan ikke læse fra %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Kan ikke oprette mappen %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Kan ikke oprette symbolsk link fra %1 til %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Kan ikke flytte %1 til %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Kan ikke kopiere %1 til %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Kan ikke slette %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Kan ikke oprette %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Kan ikke beregne filstørrelse for %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Kan ikke beregne filstørrelse : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Kan ikke åbne %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Kan ikke ekspandere fil : %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Kan ikke udvide fil"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Kan ikke søge i indeksfil: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Kan ikke skrive forbi slutningen på mmap-buffer!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Status: <b>%2</b><br>Udvikler: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Indlæst"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Ikke indlæst"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Plugin-tilvalg"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Kan ikke åbne filen %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Mappen %1 eksisterer ikke"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Ulovligt symbol: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Afkodningsfejl"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Uventet slut på inddata"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Kan ikke konvertere %1 til et heltal"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent er ikke færdig!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Korrumperet torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrenten har ingen meddelelse- eller knudefelt"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Kan ikke åbne torrent-filen %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Fortolkningsfejl"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"En fejl opstod under indlæsning af torrent. Torrenten er formentlig defekt "
+"eller det er ikke en torrent-fil.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"En fejl opstod mens torrent-filen blev indlæst. Den mest sandsynlige grund er "
+"at torrent-filen er ødelagt eller slet ikke er en torrent-fil."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Kan ikke oprette %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Du er allerede ved at hente denne torrent %1, listen med sporere for begge "
+"torrenter er slået sammen."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Du henter allerede torrenten %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Kan ikke konvertere %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Datastrømmen %1 blev startet med en tidligere version af Ktorrent. For at sikre "
+"at datastrømmen stadigvæk virker med denne version af Ktorrent, konverterer vi "
+"datastrømmen. Du bliver spurgt om et sted at gemme datastrømmen. Hvis du "
+"trykker på Annullér, vælges din hjemmemappe."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Vælg mappe der skal gemmes til"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Ikke startet"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Seeder"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Downloader"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Hænger"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Stoppet"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Fejl: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Reserverer diskplads"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "I kø"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Kontrollerer data"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Stoppet. Ingen plads tilbage på enheden."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Du har ikke tilstrækkelig diskplads til at downloade denne torrent. Vil du "
+"fortsætte?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Utilstrækkelig diskplads til %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" har nået sit maksimale delingsforhold. Ignorér denne grænse og "
+"tilbyd denne torrent alligevel?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Maksimalt delingsforhold opnået."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Fejl ved at stoppe torrent %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Fejl ved start af torrent %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Annoncerer"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Ukendt klient"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+" 1 peer\n"
+"%n peers"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Kan ikke oprette filen %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Mislykkedes at skrive første del til DND-filen: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Mislykkedes at skrive sidste del til DND-filen: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Kan ikke åbne %1 til skrivning : skrivebeskyttet filsystem"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Kan ikke ekspandere filen %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Kan ikke ekspandere filen: %1 ; ukomplet skrivning"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Kan ikke ekspandere fil: %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Fejl: Læsning forbi filslutning for filen %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Fejl ved læsning fra %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Fejl ved skrivning til %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Fejl ved skrivning til %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Kan ikke reservere diskplads i forvejen: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Kan ikke binde til UDP-port %1 eller de 10 følgende porte."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Ugyldigt svar fra sporer"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Ugyldige data fra sporere"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Ugyldig URL for sporer"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Kan ikke åbne filen %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Kan ikke oprette indeksfil: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Kan ikke åbne filen :%1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Bruger UPnP for automatisk at videresende porte på routeren"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Kan ikke finde viderebefordringstjeneste for port i enhedens beskrivelse."
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP-enheder"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Gennemsøger automatisk mappen efter torrent-filer og indlæser dem."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Skan mappe"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Søg i mappe"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Søgemappetilvalg"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "indlæst"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Mappesøgning: Mappen %1: Ugyldig url eller mappen findes ikke. Vælg en gyldig "
+"mappe."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Web-grænseflade"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Tilvalg for web-grænseflade"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Kørbar fil for PHP findes ikke i standardsøgestien. Indtast søgestien manuelt."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Angiv et nyt kodeord for web-grænsefladen."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 findes og den er kørbar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 eksisterer ikke"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 er ikke kørbar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 er en mappe"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 er ikke en søgesti til kørbar fil for PHP"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Webinterface"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Tillad brugeren at kontrollere Ktorrent via browser"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Hent først"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Hent normalt"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Hent sidst"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Slet filer"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Tilgængelige"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Hvilende"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Al data i filen vil gå tabt. Er du sikker på at du vil gøre dette?\n"
+"Al data i filerne vil gå tabt. Er du sikker på at du vil gøre dette?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Ingen grænse"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Informationskontrol"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Viser yderligere information om en download, såsom hvilke dele som er hentet, "
+"antal seedere og leechere..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Kan ikke tilføje sporere for en privat torrent."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Kan ikke fjerne strømmens standardsporer."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Du kan ikke tilføje sporere for en privat torrent"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Land"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klient"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Kvalt"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Afvist"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Tilgængelighed"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Scoring"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Upload-placering"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Forespørgsler"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Spark peer af"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Bandlys peer"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Tilgængelige blokke"
+"<br><img src=\"unavailable_color\">&nbsp; - Ikke tilgængelige blokke"
+"<br><img src=\"excluded_color\">&nbsp; - Undtagne blokke"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Tilvalg for informationskomponent"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Hentede bloklke"
+"<br><img src=\"unavailable_color\">&nbsp; - Blokke at hente"
+"<br><img src=\"excluded_color\">&nbsp; - Undtagne blokke"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Konvertér"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Indlæser txt-fil..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Vent venligst..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Fil konverteret."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Kunne ikke indlæse filter:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Dårlig filterfil. Den kan være ødelagt, eller have et forkert format."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtrerer uønskede peers fra baseret på deres IP-adresse"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP-filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: Indlæst og kører."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: Ikke indlæst."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Filterfilen ikke fundet.</font> "
+"Download og konvertér filterfilen."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Markeret fil findes allerede. Vil du hente den igen?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Fil eksisterer"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "Filterfilen (level1.dat) findes allerede. Vil du konvertere den igen?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-blokeringsfilter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Tilvalg for IP-blokeringsfilter"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistik"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Statistikindstillinger"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Forbunde leechere"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Leechere i sværme"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Forbundne seedere"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Seedere i sværme"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Gennemsnitligt forbundne leechere per torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Gennemsnitligt forbundne seedere per torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Gennemsnitligt forbundne leechere per kørende torrent"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Gennemsnitligt forbundne seedere per kørende torrent"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Knudepunkter"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Opgaver"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Vis overførselsstatistik"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Hastighedsstatistik"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Forbindelsesstastistik"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Nuværende"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Gennemsnit"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Grænse"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Gennemsnit fra leecher"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Gennemsnit til leecher"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Gennemsnit fra seeder"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Fra leecher"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Fra seedere"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Påskrift"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent-filer"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Alle filer"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Kan ikke verificere data: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Kan ikke indlæse torrent-filen: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Importerer delvis eller fuldstændigt hentede torrent-filer fra andre klienter"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importér eksisterende download"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL for feed"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Skanner automatisk RSS-feeds efter torrent som matcher regulære udtryk og "
+"indlæser dem."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS-Kilder"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Kunne ikke finde og download en gyldig torrent for %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Titel"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Link"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Sæson"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episode"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tid"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Skemalægger"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Tilvalg for plugin for skemalægning"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "Man"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "Tir"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "Ons"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "Tor"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "Fre"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "Lør"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "Søn"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Skema gemt."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Fil ikke fundet."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Skema indlæst."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Plugin for skemalægning af båndbredde"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Åbn skemalægning af båndbredde"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Skemalægning af båndbredde er deaktiveret. Brug Opsætning -> "
+"Skemalægning for at aktivere den."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Logvisning"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Logvisning"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Viser KTorrents logoutput"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Brug din webbrowser til at søge efter strengen %1 (store bogstaver) på "
+"søgemaskinen du ønsker at tilføje. "
+"<br> Kopiér så URLen i adresselinjen efter søgningen er færdig, og indsæt den "
+"her. "
+"<br> "
+"<br>Søgning efter %1 på Google, vil f.eks. resultere i "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> Hvis du tilføjer denne URL her kan KTorrent søge med Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Brug din webbrowser til at søge efter strengen %1 (store bogstaver) på den "
+"søgemaskine du ønsker at tilføje. Brug den resulterende URL herunder."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Du skal udfylde i søgetjenestens navn og URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "En søgetjeneste med samme navn findes allerede. Brug et andet navn."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Forkert URL. Du skal søge efter FOOBAR med din browser og kopiere/indsætte "
+"nøjagtig URL her."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Søg"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Alternative søgetjenester"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Søger efter %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Torrent-filer"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Søgning færdig"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Maskine: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Søger efter torrenter på flere populære søgetjenester for torrenter"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Vil du hente eller gemme denne torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Download torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Download"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Finder deltagere som kører ktorrent i det lokale netværk, at dele torrenter med"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Tid tilbage-algoritme:"
diff --git a/translations/de/Makefile.am b/translations/de/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/de/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/de/messages/Makefile.am b/translations/de/messages/Makefile.am
new file mode 100644
index 0000000..b15dd61
--- /dev/null
+++ b/translations/de/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = de
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/de/messages/ktorrent.po b/translations/de/messages/ktorrent.po
new file mode 100644
index 0000000..27a65ed
--- /dev/null
+++ b/translations/de/messages/ktorrent.po
@@ -0,0 +1,4962 @@
+# translation of ktorrent.po to German
+#
+# Patrick Trettenbrein <patrick.trettenbrein@kdemail.net>, 2005, 2006.
+# Stephan Johach <hunsum@gmx.de>, 2005.
+# Thomas Reitelbach <tr@erdfunkstelle.de>, 2005, 2006, 2007.
+# Danny Kukawka <danny.kukawka@web.de>, 2006.
+# Jannick Kuhr <jannick.kuhr@kdemail.net>, 2006, 2007.
+# Jannick Kuhr <jakuhr-linux@gmx.de>, 2007.
+# Jannick Kuhr <opensource@kuhr.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-11-11 13:57+0100\n"
+"Last-Translator: Thomas Reitelbach <tr@erdfunkstelle.de>\n"
+"Language-Team: Deutsch <kde-i18n-de@lists.kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KAider 0.1\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+"Keine eingehenden Verbindungen (möglicherweise durch Firewall geblockt)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Information"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Übertragene Datenmenge während dieser Sitzung"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Gegenwärtige Geschwindigkeit aller Torrents"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Gruppen"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Starten"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Stoppen"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Alle starten"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Alle stoppen"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Torrent-URL einfügen ..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Warteschlangenverwaltung öffnen ..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "In Warteschlange einreihen/entfernen"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-Filter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Datenintegrität prüfen"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Maximale Hochladerate festlegen"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Maximale Herunterladerate festlegen"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent-Dateien"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Alle Dateien"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Adresse öffnen"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Geschwindigkeit laden: %1 / verteilen: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Heruntergeladen: %1 / Verteilt: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "VHT: %1 Knoten, %2 Aufträge"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "VHT: aus"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Alle Torrents"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Suchen:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Groß-/Kleinschreibung beachten"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "In linken Docker verschieben"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "In rechten Docker verschieben"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "In unteren Docker verschieben"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Kurzbefehl zuweisen ..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Kurzbefehl entfernen"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Knopfnummer ändern"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Neue Kurzbefehlnummer:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"IP-Adressen müssen im Format 'XXX.XXX.XXX.XXX' eingegeben werden. Außerdem "
+"können Sie mit Platzhaltern (z. B. \"127.0.0.*\") Adressbereiche angeben."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Datei auswählen"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Wählen Sie einen Dateinamen zum Speichern"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Ungültige Adresse"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Uploads"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Der festgelegte Port (%1) ist nicht verfügbar oder wird bereits von einem "
+"anderen Programm verwendet. KTorrent verwendet gegenwärtig Port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent kann keine Verbindungen annehmen, da die Ports %1 bis %2 bereits von "
+"einem anderen Programm verwendet werden."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Dieser Torrent lässt sich nicht erstellen: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Es fehlen einige Datendateien zum Torrent \"%1\". Möchten Sie diese neu "
+"erstellen oder möchten Sie sie nicht herunterladen?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Neu erstellen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Nicht herunterladen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Folgende fehlende Dateien lassen sich nicht neu erstellen: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Fehlende Datendateien"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr ""
+"Die Auswahl für folgende fehlende Dateien lässt sich nicht aufheben: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Die Datei, in der die Daten des Torrents \"%1\" gespeichert werden, ist nicht "
+"vorhanden. Möchten Sie sie neu erstellen?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Nicht neu erstellen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Folgende Datendatei lässt sich nicht neu erstellen: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Datendatei fehlt"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Datenintegrität wird geprüft"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "unendlich"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Fehler beim Einlesen der Daten: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Die Daten von <b>%1</b> werden eingelesen:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Ein BitTorrent-Client für KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Debug-Modus"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Zu öffnendes Dokument"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS-Modul"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Weboberflächen-Modul"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statistik-Modul"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Anwendungssymbol und einige andere"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Das Downloadsymbol"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Anwendungssymbol der Version 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "ChunkBars Kurzhilfe und \"IWFileTreeItem\"-Sortierung"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Länderlokalisierung für das Informationsfenster-Modul (Dieses Produkt "
+"beinhaltet von MaxMind erstellte GeoLite-Daten, verfügbar von "
+"http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Länderfahnen"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Dateipriorisierung"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+"Miniupnp wurde als Beispiel für unsere eigene UPnP-Implementierung verwendet."
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Patch zum globalen maximalen Verteilungsverhältnis"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconf-Verbesserungen"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk-Weboberfläche"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl-Code aus KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Verbesserung der Umwandlungsgeschwindigkeit im IP-Filter-Modul"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Entdeckte zwei Sicherheitslücken (beide sind inzwischen geschlossen)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Patch zum Laden mit Speicherort ohne Nachfrage"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Fehlerbereinigungen im PHP-Code der Weboberfläche."
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Reservierung von Speicherplatz für XFS-Dateisysteme"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+"Patch zur Verhinderung der Anzeige von sehr niedrigen Geschwindigkeiten"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Patch zur Anzeige des eventuellen Firewall-Status"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Diverse Fehlerkorrekturen"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Patch zum Ausblenden der Menüleiste"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Patch zur Bearbeitung der Dateieigenschaften über die Weboberfläche"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Diverse Korrekturen an der Weboberfläche"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Patch für die Filterleiste"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Patch zum Laden mit Speicherort ohne Nachfrage"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Sie müssen eine Datei oder einen Ordner auswählen."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Sie haben keinen Tracker hinzugefügt. Sind Sie sicher, dass Sie diesen Torrent "
+"erstellen wollen?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Sie müssen mindestens einen Knoten hinzufügen."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent-Dateien (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Wählen Sie eine Datei zum Speichern des Torrents."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "%1 wird erstellt ..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Benutzerdefinierte Gruppen"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Neue Gruppe"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Namen bearbeiten"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Gruppe entfernen"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Unterfenster öffnen"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Bitte geben Sie den Gruppennamen ein."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Eine Gruppe namens %1 existiert bereits."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Bitte geben Sie den neuen Gruppennamen ein."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktive Verteilvorgänge"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Eingereihte Verteilvorgänge"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Eingereihte Downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Benutzer-Downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Benutzer-Verteilvorgänge"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Inaktive Torrents"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Inaktive Downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Inaktive Verteilvorgänge"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktive Torrents"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktive Downloads"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Torrent entfernen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Torrent und Daten entfernen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Gegenstellen hinzufügen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Zusätzliche Quellen für Gegenstellen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Quellen für Torrent-Gegenstellen:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "VHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Austausch von Gegenstellen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Manuelle Bekanntmachung"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Vorschau"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Ordner öffnen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Datenordner"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Temporärer Ordner"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Speicherort festlegen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Aus Gruppe entfernen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Zu Gruppe hinzufügen"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Geschwindigkeitsbegrenzungen"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"Der Torrent existiert nicht. Berichten Sie diesen Fehler den "
+"KTorrent-Entwicklern."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Potentielle Gegenstelle hinzugefügt."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Ungültige IP-Adresse."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Einstellungen"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Einstellungen zum Herunterladen"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "Der VHT-Port muss ein anderer sein als der UDP-Tracker-Port!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Allgemein"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Allgemeine Einstellungen"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Unbekannter Rechner %1: %2\n"
+"Bitte geben Sie eine gültige IP-Adresse oder Rechnernamen ein."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Erweitert"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Erweiterte Einstellungen"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Sichtbare Spalten"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Heruntergeladen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Größe"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Verteilt"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Downloadgeschwindigkeit"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Verteilgeschwindigkeit"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Restzeit"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Seeder"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Leecher"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% vollständig"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Verteilungsverhältnis"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Herunterladezeit"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Verteilzeit"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Alle Torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Es kann nicht mehr als ein Download \n"
+"Es können nicht mehr als %n Downloads, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"und eine Verteilung gestartet werden. \n"
+"und %n Verteilungen gestartet werden. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Unter Einstellungen -> KTorrent einrichten können Sie diese Begrenzungen "
+"ändern."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Der Torrent %1 wurde nicht vollständig heruntergeladen, möchten Sie auch die "
+"unvollständigen Daten löschen?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Download entfernen"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Daten löschen"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Daten behalten"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Sämtliche heruntergeladene Daten werden gelöscht. Sind Sie sicher, dass Sie "
+"dies möchten?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Die Daten des Torrents %1 werden bereits geprüft."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Speicherort für %1 auswählen"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Sie haben die Auswahl für die folgenden vorhandenen Dateien aufgehoben. Dadurch "
+"werden sämtliche Daten in diesen Dateien gelöscht. Sind Sie sicher, dass Sie "
+"dies möchten?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Ja, Dateien löschen"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nein, Dateien behalten"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " fehlen!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Benutzer"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Warteschlangenverwaltung"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nein (privater Torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Geschwindigkeit:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Herunterladen: <font color='#1c9a1c'>%1</font></td>"
+"<td>Verteilen: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Heruntergeladen: <font color='#1c9a1c'>%3</font></td>"
+"<td>Verteilt: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> wurde vollständig heruntergeladen."
+"<br>Durchschnittliche Geschwindigkeit: %2 Herunterl. / %3 Vert."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Download beendet"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> hat sein maximales Verteilungsverhältnis von %2 erreicht und wurde "
+"angehalten."
+"<br>%3 wurden verteilt bei einer durchschnittlichen Geschwindigkeit von %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Verteilen beendet"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> hat seine maximale Verteilungszeit von %2 Stunden erreicht und wurde "
+"angehalten."
+"<br>%3 wurden verteilt bei einer durchschnittlichen Geschwindigkeit von %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> wurde aufgrund des folgenden Fehlers angehalten: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Es wurden fehlerhafte Daten im Torrent <b>%1</b> gefunden."
+"<br>Es wäre sinnvoll, eine Datenintegritätsprüfung des Torrents durchzuführen."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> hat sein maximales Verteilungsverhältnis von %2 erreicht und kann "
+"nicht in die Warteschlange eingereiht werden. Entfernen Sie die Begrenzung "
+"manuell, wenn Sie die Verteilung fortsetzen möchten."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> hat seine maximale Verteilungszeit von %2 Stunden erreicht und kann "
+"nicht in die Warteschlange eingereiht werden. Entfernen Sie die Begrenzung "
+"manuell, wenn Sie die Verteilung fortsetzen möchten."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Der Torrent kann nicht in die Warteschlange eingereiht werden."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "<b>%1</b> kann nicht gestartet werden: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Es kann nicht mehr als ein Torrent verteilt werden. "
+"<br>\n"
+"Es können nicht mehr als %n Torrents verteilt werden. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Es kann nicht mehr als ein Torrent heruntergeladen werden. "
+"<br>\n"
+"Es können nicht mehr als %n Torrents heruntergeladen werden. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Der Torrent kann nicht gestartet werden."
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Es ist nicht ausreichend Platz auf dem Datenträger verfügbar."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Der Platz auf dem Datenträger geht zur Neige.<br /><b>%1</b> "
+"wird im Moment nach '%2' heruntergeladen."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Der Torrent wurde angehalten.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Der Speicherplatz auf dem Datenträger geht zur Neige."
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Geschwindigkeitsbegrenzung in KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Unbegrenzt"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Geschwindigkeitsbegrenzung für <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Eine KDE-KPart-Anwendung"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Indexdatei %1 kann nicht geöffnet werden: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Patrick Trettenbrein, Jannick Kuhr"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "patrick.trettenbrein@kdemail.net, jakuhr-linux@gmx.de"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Wählen Sie die Dateien, die Sie herunterladen möchten"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Herunterladen nach:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Gruppe:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Ben&utzergesteuert"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Torrent starten"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Herunterladen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "&Alle auswählen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&Nichts auswählen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Auswahl umkehren"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Speicherplatz"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Benötigter Speicherplatz:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Freier Speicherplatz:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Nach dem Herunterladen:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Verschlüsselung"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Protokollverschlüsselung verwenden"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Protokollverschlüsselung wird verwendet, um die Internetanbieter am Ausbremsen "
+"von Bittorrent-Verbindungen zu hindern."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Unverschlüsselte Verbindungen erlauben"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Wenn diese Einstellung nicht aktiviert ist, können Sie nur Verbindungen mit "
+"Programmen herstellen, die Verschlüsselung unterstützen."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>V</b>erteiltes <b>H</b>ash-<b>T</b>abellen-Protokoll."
+"<br>Dezentralisiertes Gegenstellen-Austauschprotokoll. Im Handbuch finden Sie "
+"weitere Informationen."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "VHT &verwenden, um zusätzliche Gegenstellen zu ermitteln"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP-Port für VHT-Kommunikation:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Benutzerdefinierte IP-Adresse"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Benutzerdefinierte IP-Adresse oder Rechnernamen an den Tracker se&nden"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Benutzerdefinierte IP-Adresse oder Rechnername:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Symbol im Systemabschnitt der Kontrollleiste"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "&Symbol anzeigen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "&Geschwindigkeitsbalken in Symbol anzeigen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Kurzinfo-Fenster im Systemabschnitt der Kontrollleiste anzeigen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Bandbreite für Verteilen (in KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Bandbreite für Herunterladen (in KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Ordner"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Ordner zum Speichern temporärer Dateien:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Abgeschlossene Downloads verschieben nach:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Downloads &automatisch speichern nach:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr ".torrent-Dateien kopieren nach:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Download-Werkzeugleiste"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Geschwindigkeitsbegrenzungen für Torrent festlegen"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maximale Verteilrate:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maximale Downloadrate:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 = keine Begrenzung)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Potentielle Gegenstelle hinzufügen"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Gegenstellen-IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Gegenstellen-IP und -Port eingeben."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Schwarze Liste von KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Hinweis: Die schwarze Liste ist nur für die laufende Sitzung gültig. Verwenden "
+"Sie Speichern/Öffnen, um Ihre Einträge zu speichern oder nutzen Sie das "
+"IP-Filter-Modul (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Gebannte Gegenstellen"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "IP-Adresse der Gegenstelle"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Gegenstelle hinzufügen:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Fügt eine Gegenstelle zur schwarzen Liste hinzu."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Entfernt die ausgewählte Gegenstelle von der schwarzen Liste."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Leeren"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Diese Liste leeren"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Speichern &unter ..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Speichern Sie diese schwarze Liste, um sie im IP-Filter-Modul von KTorrent zu "
+"verwenden."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maximale Downloads:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maximale Verteilungen:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Downloads bei wenig Speicherplatz starten:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimaler Speicherplatz:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Nicht starten"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Immer fragen"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Start erzwingen"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 = keine Begrenzung)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maximale Downloadrate:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Globale Verbindungsbegrenzung:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Maximale Verteilungszeit:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maximale Anzahl Verbindungen pro Torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Anzahl der Slots zum Hochladen:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP-Tracker-Port:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maximales Verteilungsverhältnis:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maximale Verteilrate:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/s (0 = keine Begrenzung)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Stunden (0 = keine Begrenzung)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Nach Beendigung des Downloads weiter verteilen"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Achtung"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Die oben genannten Ports müssen weitergeleitet werden, falls Sie sich hinter "
+"einem Router befinden. Das UPnP-Modul kann dies für Sie tun."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT-Warteschlangen-Dialog"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "VHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Verteilungsverhältnis:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Verbleibende Bytes:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Gesteuert durch"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "H&ochladen"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Hochgeladen:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Nach &oben"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Nach &unten"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Ganz nach oben"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Ganz nach unten"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&WV-gesteuert "
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Ben&utzergesteuert"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "URL einfügen"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "Adresse:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&OK"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Abbrechen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Torrent erstellen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Die Datei oder der Ordner, aus dem Sie ein Torrent erstellen wollen:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Sie müssen mindestens einen Tracker oder Knoten hinzufügen."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Dateieinstellungen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Größe jedes Blocks:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Verteilung des Torrents be&ginnen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "De&zentralisiert (nur VHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privates Torrent (VHT nicht erlaubt)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Kommentare:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "Ers&tellen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Abbrechen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Tracker"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "VHT-Knoten"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Knoten:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP-Adresse oder Rechnername"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Hinweis: Einige bekanntermaßen gute VHT-Knoten sind bereits enthalten. Sie "
+"sollten auch Ihre eigene IP-Adresse und den Port einfügen, wenn Sie diesen "
+"Torrent verteilen wollen."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Erweiterte Einstellungen"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent-Algorithmus:</b> Standard-Algorithmus unter Verwendung von anderen "
+"auf unseren Tests basierenden Algorithmen."
+"<br>\n"
+"<b>Aktuelle-Geschwindigkeit-Algorithmus:</b> Einfachster Algorithmus - "
+"Verbleibende Bytes/Aktuelle Geschwindigkeit"
+"<br>\n"
+"<b>Globale-Durchschnittsgeschwindigkeit-Algorithmus:</b> "
+"Verbleibende Bytes/Durchschnittsgeschwindigkeit"
+"<br>\n"
+"<b>\"Fenster aus X\"-Algorithmus:</b> Verbleibende Zeit berechnet aus X "
+"Geschwindigkeitsproben"
+"<br>\n"
+"<b>Beweglicher-Durchschnitt-Algorithmus:</b> Bewegliche "
+"Durchschnittsgeschwindigkeit berechnet aus X Proben"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Aktuelle Geschwindigkeit"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Globale Durchschnittsgeschwindigkeit"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Fenster aus X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Beweglicher Durchschnitt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(wird nach Neustart wirksam)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Speicherplatzreservierung &deaktivieren"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "&Vollständige Speicherplatzreservierung (vermeidet Fragmentierung)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Einfach (langsam)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Dateisystemspezifisch"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Leistung"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Speicherausnutzung:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Niedrig"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Mittel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Hoch"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Aktualisierungsintervall der Benutzeroberfläche:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Schnelle CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Langsame CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Datenprüfung"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Während des Verteilens &keine erneute Prüfung von Blöcken größer als"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Daten&integritätsprüfung durchführen nach"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "fehlerhaften Blöcken"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Netzwerk"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maximale Anzahl neuer Verbindungen:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP für IP-Pakete:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "KDE-Pro&xyeinstellungen nicht für HTTP-Tracker-Verbindungen verwenden"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP-Tracker-Proxy:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Daten werden eingelesen"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Daten des folgenden Torrents werden eingelesen:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Anzahl der gefundenen Blöcke:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Anzahl der fehlgeschlagenen / nicht heruntergeladenen Blöcke:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maximale Anzahl Downloads (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maximale Anzahl Verteilungen (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Downloads bei wenig Speicherplatz starten?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maximale Anzahl der Verbindungen pro Torrent (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr ""
+"Maximale Anzahl der Verbindungen für alle Torrents (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maximale Verteilgeschwindigkeit in KB/s (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maximale Downloadgeschwindigkeit in KB/s (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maximales Verteilungsverhältnis (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maximale Verteilungszeit in Stunden (0 = keine Begrenzung)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Symbol im Systemabschnitt der Kontrollleiste anzeigen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Geschwindigkeitsbalken im Symbol anzeigen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Downloadbandbreite (in KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Hochladebandbreite (in KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Hinweisfenster anzeigen, wenn ein Torrent beendet ist."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Nach Beendigung eines Downloads weiter verteilen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Ordner zum Speichern temporärer Dateien"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Ob Transfers automatisch in den Speicherordner gespeichert werden sollen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Ordner zum Speichern heruntergeladener Dateien"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Ob abgeschlossene Transfers automatisch in den festgelegten Ordner verschoben "
+"werden sollen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Ordner, in den abgeschlossene Downloads verschoben werden"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Ob .torrent-Dateien automatisch in den festgelegten Ordner kopiert werden "
+"sollen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Ordner, in den .torrent-Dateien kopiert werden"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Ob eine veränderte IP-Adresse an den Tracker gesendet werden soll"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Ordner, der als letzter Speicherort verwendet wurde"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP-Adresse, die an den Tracker gesendet wird"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Speicherverwendung:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Aktualisierungsintervall der Benutzeroberfläche"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Unterstützung für VHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "VHT-Port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Anzahl der Slots zum Verteilen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "In KTorrent-Ansicht angezeigte Spalten"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Restzeit-Algorithmus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Wenn nicht mehr ausreichend Speicherplatz vorhanden ist, um den Download "
+"abzuschließen und der freie Speicherplatz den festgelegten Wert unterschreitet, "
+"wird der Torrent angehalten."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Modulverwaltung"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Laden"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Entladen"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Alle la&den"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Alle e&ntladen"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Standardmäßig zu benutzendes UPnP-Gerät"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Gefundene Geräte:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Gerät"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Weitergeleitete Ports"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN-Verbindung"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Ports &weiterleiten"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Ports nicht weiterleiten"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Erneut suchen"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Durchsuchen von Ordner1 aktivieren?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Durchsuchen von Ordner2 aktivieren?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Durchsuchen von Ordner3 aktivieren?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Pfad zu Ordner1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Pfad zu Ordner2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Pfad zu Ordner3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Ob ein Torrent ohne Rückmeldung geöffnet werden soll oder nicht."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Löschaktion geprüft."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Verschiebeaktion geprüft."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Einstellungen zum Durchsuchen von Ordnern"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Ordner &1 durchsuchen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Ordner &2 durchsuchen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Ordner &3 durchsuchen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "&Nach dem Laden in den \"Geladen\"-Ordner verschieben"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Torrent nach dem Laden in den Ordner \"Geladen\" verschieben"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Torrents ohne &Rückmeldung öffnen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Dialog 'Herunterzuladende Dateien auswählen' nicht anzeigen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Nach dem Laden &löschen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Löscht den Torrent nach dem Laden"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Zu durchsuchende Ordner"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Ordner 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Ordner 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Ordner 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Such-Einstellungen"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Webserver"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Port weiterleiten"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL der Sitzung (in Sekunden)"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Schnittstelle auswählen:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Benutzername:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Passwort ändern ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Pfad zur PHP-Programmdatei:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Portnummer"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Port weiterleiten"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Lebensdauer (TTL) der Sitzung"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Schnittstellenoberfläche"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Pfad zur PHP-Programmdatei"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "Benutzername"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "Passwort"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Blöcke"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Gesamt:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Laufende Downloads:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Heruntergeladen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Ausgenommen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Verbleibend:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Größe:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Block"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Fortschritt"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Gegenstelle"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Zugewiesene Gegenstellen"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Seeder:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Leecher:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Durchschnittliche Empfangsgeschwindigkeit:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Durchschnittliche Sendegeschwindigkeit:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Nächste Aktualisierung in:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Tracker-Status:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Heruntergeladene Teile des Torrents:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Verfügbare Teile des Torrents:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Verteilen"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Es wird nichts mehr verteilt, wenn das Verteilungsverhältnis diesen Wert "
+"überschreitet. Null bedeutet keine Begrenzung."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Es wird nichts mehr verteilt, wenn die Verteilungszeit diesen Wert "
+"überschreitet."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Stunden"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Verhältnisbegrenzung:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Die Begrenzung funktioniert nur im Verteilungsmodus"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Zeitbegrenzung:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Tracker akt&ualisieren"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minimales Aktualisierungsintervall - 60 Sekunden"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Trac&ker hinzufügen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Tracker entfernen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Tracker ä&ndern"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Standardeinstellungen wiederherstellen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Unterfenster \"Gegenstellen\" im Hauptfenster anzeigen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Ansicht der unfertigen Blöcke im Hauptfenster"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Unterfenster \"Gegenstellen\" im Hauptfenster anzeigen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Liste der Gegenstellen anzeigen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Liste der &Blöcke anzeigen, die gerade heruntergeladen werden"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Liste der Tracker anzeigen"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP-Blockierungseinstellungen"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "PeerGuardian-Filterdatei auswählen"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "PeerGuardian-Filter benutzen?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP-Filterdatei:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Heru&nterladen/Umwandeln"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Laden Sie den PeerGuardian-Filter von bluetack.co.uk oder blocklist.org "
+"herunter.\n"
+"Hinweis: Die ZIP-Datei von bluetack.co.uk wird unterstützt."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Ebene-1-Filteradresse"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Ebene-1-Filter benutzen?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Umwandlung läuft ..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Klicken Sie auf 'Umwandeln', um die Umwandlung der antip2p-Datei zu starten. "
+"Hinweis: Dieser Vorgang kann selbst auf schnellen Rechnern einige Zeit dauern "
+"und KTorrent kann währenddessen nicht verwendet werden."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Aktualisierung"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Diagramm aktualisieren alle"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Oberflächenaktualisierungen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Daten erfassen alle"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "Millisekunden"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maximum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Skalierungsmodus der Maximalgeschwindigkeit:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Exakt"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Siehe \"Was ist das\"-Hilfe für weitere Informationen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Legt den Maximalwert auf der OY-Skala fest als:\n"
+"- Oben: Global erreichte Maximalgeschwindigkeit\n"
+"- Ekakt: Maximal erreichte, im Diagramm sichtbare, Geschwindigkeit"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Gegenstellengeschwindigkeit"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Gegenstellengeschwindigkeit:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "Aktualisierung alle"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "Aktualisierungen der Diagrammdaten"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Das Erfassen der Daten von zahlreichen verbundenen Gegenstellen kann viel "
+"Prozessorleistung in Anspruch nehmen."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Gegenstellen-Verbindungen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Hohe Werte können die Diagramme verbundener Gegenstellen verdecken."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Seeder in Schwärmen anzeigen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Leecher in Schwärmen anzeigen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Messzählung"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Verteilungen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Verbindungen"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Gegenstellen"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Geschwindigkeitsdiagramme der Gegenstellen umschalten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Intervall zwischen den Abfragen der Gegenstellengeschwindigkeit"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Anzeige von Leechern in Schwärmen umschalten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Anzeige von Seedern in Schwärmen umschalten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Download-Messzählung"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Gegenstellengeschwindigkeit-Messzählung"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Verteilungs-Messzählung"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Verbindungen-Messzählung"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "VHT-Messzählung"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Maximummodus der OY-Achse"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Bereits begonnen Transfer importieren"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Daten:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Bitte geben Sie den Torrent und die bereits heruntergeladenen Daten für diesen "
+"Torrent an."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importieren"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "Standard"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS-Quellen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Nachrichtenquellen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Löschen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Neu"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "Adresse (&URL)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artikel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Aut&omatisch aktualisieren"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "TTL i&gnorieren"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Titel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Artikel behalten (Tage)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktiv"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filter"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Akzeptieren-Filter"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Ablehnen-Filter"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Reguläre Ausdrücke"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Als &Serie behandeln"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Ausführen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Kriterien für Serien"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Treffer ohne Episoden"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Maximum an Episoden"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Maximum an Staffeln"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Minimum an Staffeln"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Minimum an Episoden"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Testte&xt"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Testen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filterübereinstimmungen"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Bandbreitenplaner"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Linksklick-Kategorie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kategorie &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "Au&sschalten"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategorie &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategorie &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Rechtsklick-Kategorie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "K&ategorie 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategorie 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorien"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "Herunterladen:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "Hochladen:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 bedeutet keine Begrenzung"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "In Datei speichern"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "Aus Datei &laden"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Planer zurücksetzen"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&OK"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Einstellungsseite für Planer-Modul"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "&Bandbreitenplaner verwenden?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Bandbreitenplaner"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Farben statt &Graphiken verwenden?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Empfohlen für langsamere Systeme)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "&Planer bearbeiten"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Bandbreitenplaner aktivieren?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Farben statt Graphiken verwenden?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Rich Text für Protokoll verwenden"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Nachrichtenmarkierung von allgemeinen Informationen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Nachrichtenmarkierung von Verbindungen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Nachrichtenmarkierung von VHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Nachrichtenmarkierung von Tracker-Informationen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Nachrichtenmarkierung von Disk-IO-Informationen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Nachrichtenmarkierung vom IP-Filter-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Nachrichtenmarkierung vom Suche-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Nachrichtenmarkierung vom Teildatei-Import-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Nachrichtenmarkierung vom Infofenster-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Nachrichtenmarkierung vom UPnP-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Nachrichtenmarkierung vom Ordner-Durchsuchen-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Nachrichtenmarkierung vom Planer-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Nachrichtenmarkierung vom RSS-Modul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Nachrichtenmarkierung im Weboberflächen-Modul"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Einstellungen für Protokollbetrachter"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Module"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Alle"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Debug"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Hinweis"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Wichtig"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Keine"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-Filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Suchen:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Ordner durchsuchen:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Planer:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Teildatei-Import:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Informationsfenster:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-Modul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Weboberflächen-Modul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "System"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Allgemein:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Verbindungen:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Disk-I/O:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Rich Te&xt für Protokoll verwenden"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Externer Browser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Suche in externem Browser öffnen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Standard-Browser verwenden"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Pfad zu benutzerdefiniertem Browser:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Suchmaschinen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Name der Suchmaschine:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Hinzufügen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Suchmaschinen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "Adresse"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Alle &entfernen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Zie&l hinzufügen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Aktualisierung aus dem Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Suchen"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Suchmaschine:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Derzeitige Suchmaschine"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Benutzerdefinierten Browser verwenden"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Pfad zu benutzerdefiniertem Browser"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"Ein Tag \n"
+"%n Tage "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Ja, zuerst"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Ja, zuletzt"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Die Protokolldatei %1 lässt sich nicht öffnen: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Die Datei %1 kann nicht geschrieben werden: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Aus Datei %1 kann nicht gelesen werden"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Der Ordner %1 lässt sich nicht erstellen: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr ""
+"Die Symbolische Verknüpfung von %1 zu %2 lässt sich nicht erstellen: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Verschieben von %1 nach %2 ist nicht möglich: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Kopieren von %1 nach %2 ist nicht möglich: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Löschen von %1 ist nicht möglich: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Erstellen von %1 ist nicht möglich: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Die Größe der Datei %1 kann nicht berechnet werden: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Die Dateigröße kann nicht berechnet werden: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Die Datei %1 lässt sich nicht öffnen: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Die Datei kann nicht expandiert werden: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Datei kann nicht expandiert werden"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "In der Datei kann nicht gesucht werden: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Über das Ende des mmap-Buffers hinaus kann nicht geschrieben werden!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Status: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Geladen"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Nicht geladen"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Moduleinstellungen"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Die Datei %1 lässt sich nicht öffnen: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Der Ordner %1 existiert nicht"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Ungültiges Zeichen: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Dekodierungsfehler"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Unerwartetes Ende der Eingabe"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "%1 kann nicht nach int umgewandelt werden"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Der Torrent ist unvollständig."
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Die Torrent-Datei ist beschädigt!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Der Torrent hat kein Ankündigungs- oder Knotenfeld"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Torrent-Datei %1 kann nicht geöffnet werden: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Verarbeitungsfehler"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Beim Laden der Torrent-Datei ist ein Fehler aufgetreten. Möglicherweise handelt "
+"es sich nicht um eine Torrent-Datei, oder sie ist beschädigt.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Beim Laden der Torrent-Datei ist ein Fehler aufgetreten. Möglicherweise handelt "
+"es sich nicht um eine Torrent-Datei, oder sie ist beschädigt."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "%1 kann nicht erstellt werden: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Sie laden den Torrent %1 bereits herunter. Die Liste der Tracker von beiden "
+"Torrents wurde zusammengeführt."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Sie laden den Torrent %1 bereits herunter."
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "%1 kann nicht migriert werden: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Der Download %1 wurde mit einer früheren Version von KTorrent gestartet. Um "
+"sicherzustellen, dass dieser Torrent auch mit dieser Version von KTorrent "
+"funktioniert, wird dieser Torrent migriert. Sie werden nach einem Speicherort "
+"für den Torrent gefragt werden. Wenn Sie Abbrechen drücken, wird es in Ihrem "
+"persönlichen Ordner gespeichert."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Bitte den Zielordner zum Speichern wählen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Nicht gestartet"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Verteilen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Herunterladen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Stehengeblieben"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Angehalten"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Fehler: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Speicherplatz wird belegt"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Eingereiht"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Daten werden geprüft"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Angehalten. Auf dem Medium ist kein Speicherplatz mehr verfügbar."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Sie haben nicht ausreichend Speicherplatz, um diesen Torrent herunterzuladen. "
+"Sind Sie sicher, dass Sie den Vorgang fortsetzen wollen?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Unzureichend Speicherplatz für %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" hat sein maximales Verteilungsverhältnis erreicht. Soll diese "
+"Begrenzung ignoriert und die Verteilung trotzdem gestartet werden?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Maximales Verteilungsverhältnis erreicht."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Der Transfer des Torrents %1 kann nicht gestoppt werden: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Der Transfer des Torrents %1 kann nicht gestartet werden: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Anmelden"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Unbekannter Client"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 Gegenstelle\n"
+"%n Gegenstellen"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Datei %1 kann nicht erstellt werden: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Schreiben des ersten Blocks in DND-Datei fehlgeschlagen: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Schreiben des letzten Blocks in DND-Datei fehlgeschlagen: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "%1 kann nicht zum Schreiben geöffnet werden: Nur-Lesen-Dateisystem"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Die Datei %1 kann nicht expandiert werden: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr ""
+"Die Datei %1 kann nicht expandiert werden: Unvollständiger Schreibvorgang"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Die Datei %1 kann nicht expandiert werden."
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Fehler: Das Ende der Datei %1 kann nicht gelesen werden"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Fehler beim Lesen der Datei %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Fehler beim Schreiben der Datei %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Fehler beim Schreiben der Datei %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr ""
+"Der benötigte Speicherplatz kann auf dem Medium nicht reserviert werden: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+"Der UDP-Port %1 und die 10 darauffolgenden Ports können nicht verwendet werden."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Ungültige Antwort vom Tracker"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Ungültige Daten vom Tracker"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Ungültige Tracker-Adresse"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Die Datei %1 lässt sich nicht öffnen: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Die Indexdatei %1 lässt sich nicht erstellen."
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Die Datei %1 lässt sich nicht öffnen: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Verwendet UPnP, um Ports auf Ihrem Router automatisch weiterzuleiten"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"In der Beschreibung des Geräts kann kein Dienst für das Weiterleiten von Ports "
+"gefunden werden!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP-Geräte"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Durchsucht automatisch Ordner nach Torrents und lädt diese."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Ordner durchsuchen"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Ordner durchsuchen"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Einstellungen zum Durchsuchen von Ordnern"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "geladen"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Ordner durchsuchen - Ordner %1: Ungültige Adresse oder Ordner existiert nicht. "
+"Bitte wählen Sie einen gültigen Ordner aus."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Weboberfläche"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Einstellungen für die Weboberfläche"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Die PHP-Programmdatei befindet sich nicht im Standardordner. Bitte geben Sie "
+"den Pfad manuell ein."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Bitte geben Sie ein neues Passwort für die Weboberfläche ein."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 existiert und ist ausführbar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 existiert nicht"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 ist nicht ausführbar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 ist ein Ordner"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 ist nicht der Pfad zur PHP-Programmdatei"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Weboberfläche"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Erlauben, dass KTorrent über einen Browser bediehnt wird"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Zuerst herunterladen"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Normal herunterladen"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Zuletzt herunterladen"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Datei(en) löschen"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Verfügbar"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Anhängig"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Sie werden sämtliche Daten in dieser Datei verlieren. Sind Sie sicher, dass Sie "
+"dies tun möchten?\n"
+"Sie werden sämtliche Daten in diesen Dateien verlieren. Sind Sie sicher, dass "
+"Sie dies tun möchten?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Keine Begrenzung"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Informationsfenster"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Zeigt zusätzliche Informationen über einen Download. Zum Beispiel, welche "
+"Blöcke heruntergeladen wurden, die Anzahl der Seeder und Leecher ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Es können keine Tracker zu privaten Torrents hinzugefügt werden."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Der vorgegebene Tracker kann nicht entfernt werden."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Sie können keine Tracker zu privaten Torrents hinzufügen"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Land"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Client"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Gedrosselt"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Abgewiesen"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Verfügbarkeit"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Bewertung"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Slot zum Hochladen"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Anfragen"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Gegenstelle heraustreten"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Gegenstelle bannen"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Verfügbare Teile"
+"<br><img src=\"unavailable_color\">&nbsp; - Nicht verfügbare Teile"
+"<br><img src=\"excluded_color\">&nbsp; - Ausgeschlossene Teile"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Einstellungen für Informationsfenster"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Heruntergeladene Teile"
+"<br><img src=\"unavailable_color\">&nbsp; - Herunterzuladende Teile"
+"<br><img src=\"excluded_color\">&nbsp; - Ausgeschlossene Teile"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Umwandeln"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Text-Datei wird geladen ..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Bitte warten ..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Datei erfolgreich umgewandelt."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Filter kann nicht geladen werden:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Defekte Filter-Datei. Die Datei ist womöglich beschädigt oder liegt in einem "
+"falschen Format vor."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtert unerwünschte Gegenstellen anhand ihrer IP-Adresse heraus"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP-Filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: Geladen und Aktiv"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: Nicht geladen"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Filterdatei nicht gefunden.</font> "
+"Laden Sie eine Filter-Datei herunter und wandeln Sie diese um."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+"Die ausgewählte Datei existiert bereits, möchten Sie sie erneut herunterladen?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Datei existiert bereits"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Die Filterdatei (level1.dat) existiert bereits, möchten Sie sie erneut "
+"umwandeln?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-Blockierungsfilter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Einstellungen für IP-Blockierungsfilter"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistik"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Statistikoptionen"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Verbundene Leecher"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Leecher in Schwärmen"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Verbundene Seeder"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Seeder in Schwärmen"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Durchschnittlich verbundene Leecher pro Torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Durchschnittlich verbundene Seeder pro Torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Durchschnittlich verbundene Leecher pro laufendem Torrent"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Durchschnittlich verbundene Seeder pro laufendem Torrent"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Knoten"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Aufträge"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Übertragungsstatistik anzeigen"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Geschwindigkeitsstatistik"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Verbindungsstatistik"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Aktuell"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Durchschnitt"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Begrenzung"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Durchschnittlich von Leecher"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Durchschnittlich an Leecher"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Durchschnittlich von Seeder"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Von Leechern"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Von Seedern"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legende"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent-Dateien"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Alle Dateien"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Daten können nicht überprüft werden: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Der Torrent %1 kann nicht geöffnet werden"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Importiert teilweise oder vollständig heruntergeladene Torrents aus anderen "
+"Programmen"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Bereits begonnenen Transfer importieren"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "Adresse der RSS-Quelle"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Durchsucht automatisch über reguläre Ausdrücke RSS-Quellen nach Torrents und "
+"lädt diese."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS-Quellen"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Für %1 konnte kein Torrent gefunden und heruntergeladen werden."
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Titel"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Beschreibung"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Verknüpfung"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Staffel"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episode"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Zeit"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Planer"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Einstellungen für Planer-Modul"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "MO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "DI"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "MI"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "DO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "FR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SA"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "SO"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Planer gespeichert."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Datei nicht gefunden."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Planer geladen."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Bandbreitenplaner-Modul"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Bandbreitenplaner öffnen"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Der Bandbreitenplaner ist deaktiviert. Verwenden Sie das Menü Einstellungen -> "
+"Planer, um ihn zu aktivieren."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Protokollbetrachter"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Protokollbetrachter"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Zeigt die KTorrent-Protokollausgaben an"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Verwenden Sie Ihren Webbrowser, um nach der Zeichenfolge %1 (Großbuchstaben) "
+"bei der Suchmaschine, die Sie hinzufügen wollen, zu suchen. "
+"<br>Nachdem die Suche abgeschlossen ist, kopieren Sie die Adresse in der "
+"Adressleiste und fügen Sie sie hier ein."
+"<br>"
+"<br>Eine Suche nach %1 bei Google wird zum Beispiel "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8 ergeben. "
+"<br>Wenn Sie diese Adresse hier einfügen, können Torrents mittels Google "
+"gesucht werden."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Benutzen Sie Ihren Webbrowser, um nach der Zeichenfolge %1 (Großbuchstaben) bei "
+"der Suchmaschine, die Sie hinzufügen wollen, zu suchen. Verwenden Sie unten die "
+"resultierende Adresse."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Sie müssen den Namen und die Adresse der Suchmaschine eingeben."
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Eine Suchmaschine mit diesem Namen existiert bereits. Bitte vergeben Sie einen "
+"anderen Namen."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Ungültige Adresse. Sie sollten mit Ihrem Browser nach FOOBAR suchen, die "
+"Adresse kopieren und hier einfügen."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Suche"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Suchmaschinen-Einstellungen"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Suchen nach %1 ..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Torrent-Dateien"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Suche abgeschlossen"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Suchmaschine: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Suche nach Torrents auf mehreren Torrent-Suchmaschinen"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Möchten Sie den Torrent herunterladen oder speichern?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Torrent herunterladen"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Herunterladen"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Findet Gegenstellen, die KTorrent im lokalen Netzwerk betreiben, um mit ihnen "
+"Torrents zu teilen"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algorithmus zur Berechnung der Restzeit:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Block %1 kann nicht geladen werden"
+
+#~ msgid "Patch to update the FileView in a separate thread"
+#~ msgstr "Patch zur Aktualisierung der Dateiansicht in einem eigenen Thread"
+
+#~ msgid "Alt+X"
+#~ msgstr "Alt+X"
+
+#~ msgid "TrackerViewBase"
+#~ msgstr "TrackerViewBase"
diff --git a/translations/el/Makefile.am b/translations/el/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/el/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/el/messages/Makefile.am b/translations/el/messages/Makefile.am
new file mode 100644
index 0000000..da7e49a
--- /dev/null
+++ b/translations/el/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = el
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/el/messages/ktorrent.po b/translations/el/messages/ktorrent.po
new file mode 100644
index 0000000..d4109e1
--- /dev/null
+++ b/translations/el/messages/ktorrent.po
@@ -0,0 +1,4980 @@
+# translation of ktorrent.po to Greek
+#
+# Spiros Georgaras <sng@hellug.gr>, 2005, 2006, 2007.
+# Toussis Manolis <manolis@koppermind.homelinux.org>, 2005, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-08-12 20:48+0300\n"
+"Last-Translator: Spiros Georgaras <sng@hellug.gr>\n"
+"Language-Team: Greek <i18ngr@lists.hellug.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Καμία εισερχόμενη σύνδεση (μάλλον λόγω τείχους προστασίας)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Πληροφορίες"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Δεδομένα που μεταφέρθηκαν κατά την τρέχουσα συνεδρία"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Τρέχουσα ταχύτητα όλων των torrents συνδυασμένων"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Ομάδες"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Εκκίνηση"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Σταμάτημα"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Εκκίνηση όλων"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Σταμάτημα όλων"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Επικόλληση torrent URL..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Άνοιγμα διαχειριστή λίστας αναμονής..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Σε αναμονή/αφαίρεση από αναμονή"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Φίλτρο IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Έλεγχος ακεραιότητας δεδομένων"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Ορισμός μέγιστου ρυθμού αποστολής"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Ορισμός μέγιστου ρυθμού λήψης"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Αρχεία torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Όλα τα αρχεία"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Άνοιγμα τοποθεσίας"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Ταχύτητα κάτω: %1 / πάνω: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Μεταφέρθηκαν κάτω: %1 / πάνω: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 κόμβοι, %2 εργασίες"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: κλειστό"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Όλα τα Torrents"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Μετακίνηση στην αριστερή προσάρτηση"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Μετακίνηση στη δεξιά προσάρτηση"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Μετακίνηση στην κάτω προσάρτηση"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Ορισμός συντόμευσης επιτάχυνσης..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Καθαρισμός συντόμευσης επιτάχυνσης"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Τροποποίηση αριθμού κουμπιού"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Νέος αριθμός επιτάχυνσης:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Πρέπει να εισάγετε μια IP της μορφής 'XXX.XXX.XXX.XXX'. Μπορείτε να "
+"χρησιμοποιήσετε χαρακτήρες ταιριάσματος για εύρος IP όπως η '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Επιλέξτε ένα αρχείο"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Επιλέξτε όνομα αρχείου για αποθήκευση"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Λανθασμένη URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Λήψεις"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Αποστολές"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Η καθορισμένη θύρα (%1) δεν είναι διαθέσιμη ή χρησιμοποιείται από κάποια άλλη "
+"εφαρμογή. Το KTorrent συνδέθηκε στη θύρα %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"Το KTorrent δεν μπορεί να δεχτεί συνδέσεις γιατί οι θύρες %1 ως %2 "
+"χρησιμοποιούνται από κάποια άλλη εφαρμογή."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Αδύνατη η δημιουργία torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Κάποια από τα αρχεία δεδομένων του torrent \"%1\" δεν υπάρχουν. Θέλετε να τα "
+"επαναδημιουργήσετε ή να μην τα λάβετε καθόλου;"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Επαναδημιουργία"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Να μη γίνει λήψη"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Αδύνατη η επαναδημιουργία των αρχείων που λείπουν: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Λείπουν αρχεία δεδομένων"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Αδύνατη η αποεπιλογή των αρχείων που λείπουν: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"\tΤο αρχείο στο οποίο αποθηκεύτηκαν τα δεδομένα του torrent \"%1\" δεν υπάρχει. "
+"Θέλετε να επαναδημιουργηθεί;"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Επαναδημιουργία"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Αδύνατη η επαναδημιουργία του αρχείου δεδομένων: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Λείπει αρχείο δεδομένων"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Έλεγχος ακεραιότητας δεδομένων"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "άπειρο"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Σφάλμα σάρωσης δεδομένων: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Σάρωση δεδομένων για το <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Μία εφαρμογή BitTorrent για το KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Λειτουργία αποσφαλμάτωσης"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Έγγραφο για άνοιγμα"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Πρόσθετο RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Πρόσθετο διασύνδεσης ιστού"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Πρόσθετο στατιστικών"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Εικονίδιο της εφαρμογής 1.1 και κάποια άλλα"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Το εικονίδιο των λήψεων"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "εικονίδιο της εφαρμογής 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Συμβουλή ράβδου κομματιών και ταξινόμηση του IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Σημαίες χωρών"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Προτεραιότητα αρχείων"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+"Το Miniupnp χρησιμοποιήθηκε σαν παράδειγμα της δικιάς μας υλοποίησης UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Διόρθωση μέγιστης καθολικής αναλογίας μοιράσματος"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Βελτιώσεις του Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Περιβάλλον ιστού Coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Κώδικας IDEAl από το KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Βελτίωση ταχύτητας μετατροπής στο πρόσθετο ipfilter"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Ανακάλυψη 2 κενών ασφαλείας (έχουν ήδη διορθωθεί)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Διόρθωση για τη σιωπηλή φόρτωση με μια τοποθεσία αποθήκευσης"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Διορθώσεις στον κώδικα PHP της διασύνδεσης ιστοσελίδων"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Προδέσμευση δίσκου ειδικά για το XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Διόρθωση ώστε να μην εμφανίζει πολύ χαμηλές ταχύτητες"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+"Διόρθωση ώστε να εμφανίζεται πιθανή φραγή λόγω λειτουργίας τείχους προστασίας"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Διάφορες διορθώσεις"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Διάφορες διορθώσεις"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Ταιριάσματα φίλτρου"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Διόρθωση για τη σιωπηλή φόρτωση με μια τοποθεσία αποθήκευσης"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Πρέπει να επιλέξετε ένα αρχείο ή ένα φάκελο."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Δεν καθορίσατε τον ανιχνευτή. Είστε σίγουροι ότι θέλετε να δημιουργηθεί το "
+"torrent;"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Πρέπει να προσθέσετε τουλάχιστον έναν κόμβο."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Αρχεία Torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Επιλέξτε αρχείο για αποθήκευση του torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Δημιουργία %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Προσαρμοσμένες ομάδες"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Νέα ομάδα"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Επεξεργασία ονόματος"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Αφαίρεση ομάδας"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Άνοιγμα καρτέλας"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Παρακαλώ εισάγετε το όνομα της ομάδας."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Η ομάδα %1 υπάρχει ήδη."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Παρακαλώ εισάγετε το νέο όνομα ομάδας."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Ενεργές αποστολές αρχείων"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Αποστολές σε αναμονή"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Λήψεις σε αναμονή"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Λήψεις χρήστη"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Αποστολές χρήστη"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Ανενεργά torrents"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Ανενεργές λήψεις αρχείων"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Ανενεργές αποστολές αρχείων"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Ενεργά torrents"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Ενεργές λήψεις αρχείων"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Αφαίρεση Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Αφαίρεση Torrent και δεδομένων"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Προσθήκη υπολογιστών"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Επιπρόσθετες πηγές υπολογιστών"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Πηγές torrent:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Ανταλλαγή μεταξύ υπολογιστών"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Χειροκίνητη ανακοίνωση"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Προεπισκόπηση"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Άνοιγμα καταλόγου"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Κατάλογος δεδομένων"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Προσωρινός κατάλογος"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Ορισμός της τοποθεσίας λήψης"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Αφαίρεση από ομάδα"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Προσθήκη στην ομάδα"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Όρια ταχύτητας"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"Το Torrent δεν υπάρχει. Αναφέρετε αυτό το σφάλμα στους προγραμματιστές του "
+"KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Προστέθηκε ικανός υπολογιστής."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Λανθασμένη διεύθυνση IP."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Προτιμήσεις"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Επιλογές λήψης"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "Η θύρα DHT πρέπει να είναι διαφορετική από τη θύρα UDP του ανιχνευτή!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Γενικά"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Γενικές επιλογές"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Αδύνατη η αναζήτηση %1: %2\n"
+"Παρακαλώ εισάγετε μια έγκυρη διεύθυνση IP ή όνομα υπολογιστή."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Προχωρημένα"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Προχωρημένες επιλογές"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Ορατές στήλες"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Κατάσταση"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Ληφθέντα"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Μέγεθος"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Απεσταλμένα"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Ταχύτητα λήψης"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Ταχύτητα αποστολής"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Χρόνος που απομένει"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Χρήστες που μοιράζονται"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Χρήστες παράσιτα"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% ολοκληρώθηκε"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Αναλογία κοινόχρηστων"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Χρόνος λήψης"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Χρόνος μοιράσματος"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Όλα τα Torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Αδυναμία έναρξης παραπάνω από μιας λήψης, \n"
+"Αδυναμία έναρξης παραπάνω από %n λήψεις, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"και ενός μοιράσματος. \n"
+"και %n μοιρασμάτων. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Μεταβείτε στις Ρυθμίσεις -> Ρύθμιση του KTorrent, αν επιθυμείτε την τροποποίηση "
+"των ορίων."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Το torrent %1 δεν έχει τελειώσει τη λήψη, επιθυμείτε επίσης τη διαγραφή και των "
+"ημιτελών δεδομένων;"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Αφαίρεση λήψης"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Διαγραφή δεδομένων"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Διατήρηση δεδομένων"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Θα χάσετε όλα τα δεδομένα που έχουν ληφθεί. Είστε σίγουροι ότι θέλετε να το "
+"κάνετε αυτό;"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Ήδη ελέγχετε τα δεδομένα του αρχείου torrent %1!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Ορίστε την τοποθεσία λήψης για το %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Αποεπιλέξατε τα ακόλουθα υπάρχοντα αρχεία. Τα δεδομένα αυτών των αρχείων θα "
+"χαθούν. Είστε σίγουροι ότι θέλετε να το κάνετε αυτό;"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Ναι, διαγραφή των αρχείων"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Όχι, διατήρηση των αρχείων"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " λείπουν από το δίσκο!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Χρήστης"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Διαχειριστής λίστας αναμονής"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Όχι (προσωπικό torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Ταχύτητα:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Λήψη: <font color='#1c9a1c'>%1</font></td>"
+"<td>Αποστολή: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Μεταφορά:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Λήψη: <font color='#1c9a1c'>%3</font></td>"
+"<td>Αποστολή: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"Ολοκληρώθηκε η λήψη του <b>%1</b>."
+"<br>Μέση ταχύτητα: %2 λήψη / %3 αποστολή."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Η λήψη ολοκληρώθηκε"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"Το <b>%1</b> έχει φτάσει τη μέγιστη αναλογία μοιράσματος %2 και έχει "
+"σταματήσει."
+"<br>Αποστάλθηκαν %3 με μέση ταχύτητα %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Το μοίρασμα ολοκληρώθηκε"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"Το <b>%1</b> έχει φτάσει το μέγιστο χρόνο μοιράσματος των %2 ωρών και έχει "
+"σταματήσει."
+"<br>Αποστάλθηκαν %3 με μέση ταχύτητα %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "Το <b>%1</b> σταμάτησε με το παρακάτω σφάλμα: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Βρέθηκαν κατεστραμμένα δεδομένα στο torrent <b>%1</b>"
+"<br>Προτείνεται ο έλεγχος ακεραιότητας δεδομένων του torrent."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"Το <b>%1</b> έχει φτάσει τη μέγιστη αναλογία μοιράσματος %2 και έχει "
+"σταματήσει. Αφαιρέστε χειρωνακτικά το όριο αν θέλετε να συνεχίσετε το μοίρασμα."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"Το <b>%1</b> έχει φτάσει το μέγιστο χρόνο μοιράσματος των %2 ωρών και δεν "
+"μπορεί να μπει σε αναμονή. Αφαιρέστε χειρωνακτικά το όριο αν θέλετε να "
+"συνεχίσετε το μοίρασμα."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Το torrent δε μπορεί να μπει στην αναμονή."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Αδυναμία εκκίνησης <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Αδυναμία μοιράσματος πάνω από 1 torrent. "
+"<br>\n"
+"Αδυναμία μοιράσματος πάνω από %n torrent. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Αδυναμία λήψης πάνω από 1 torrent. "
+"<br>\n"
+"Αδυναμία λήψης πάνω από %n torrent. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Το torrent δε μπορεί να εκκινήσει"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Δεν υπάρχει αρκετός διαθέσιμος χώρος στο δίσκο."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Ο ελεύθερος χώρος στο δίσκο σας τελειώνει.<br />Γίνεται λήψη του <b>%1</b> "
+"στο '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Το torrent σταμάτησε.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Τελειώνει ο ελεύθερος χώρος της συσκευής"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Όριο ταχύτητας σε KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Χωρίς όριο"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Όρια ταχύτητας για το <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Μία εφαρμογή KPart του KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Αδύνατο το άνοιγμα του αρχείου ευρετηρίου %1: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Σπύρος Γεωργαράς,Τούσης Μανώλης"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "sng@hellug.gr,manolis@koppermind.homelinux.org"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Επιλέξτε τα αρχεία που επιθυμείτε να λάβετε"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Λήψη σε:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Ομάδα:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Ελεγχόμενο από &χρήστη"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Εκκίνηση torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Λήψη"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Επιλογή ό&λων"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Επιλογή &κανενός"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Αντιστροφή επιλογής"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Χώρος στο δίσκο"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Απαιτούμενος χώρος στο δίσκο:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Ελεύθερος χώρος στο δίσκο:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Μετά τη λήψη:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Κρυπτογράφηση"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Χρήση κρυπτογράφησης πρωτοκόλλου"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Η κρυπτογράφηση του πρωτοκόλλου χρησιμοποιείται για να εμποδίσει τους παρόχους "
+"να επιβραδύνουν τις συνδέσεις bittorrent."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Να επιτρέπονται συνδέσεις χωρίς κρυπτογράφηση"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Αν δεν ενεργοποιηθεί, θα μπορείτε να συνδεθείτε μόνο σε πελάτες που "
+"υποστηρίζουν κωδικοποίηση."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Πρωτόκολλο <b>D</b>istributed <b>H</b>ash <b>T</b>able."
+"<br>Πρωτόκολλο ανταλλαγής απομακρυσμένων δικτύων. Δείτε το εγχειρίδιο για "
+"περισσότερες πληροφορίες."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Χρήση DHT για την λήψη επιπλέον υπολογιστών"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP θύρα για επικοινωνία DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Προσαρμοσμένη IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Αποστολή στο&ν ανιχνευτή μιας προσαρμοσμένης IP ή όνομα υπολογιστή"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Προσαρμοσμένη IP ή όνομα υπολογιστή:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Εικονίδιο πλαισίου συστήματος"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Εμφάνιση εικονιδίου πλαισίου σ&υστήματος"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Εμφάνιση γραμμής &ταχύτητας στο πλαίσιο συστήματος"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Εμφάνιση αναδυόμενων μηνυμάτων στο πλαισίου συστήματος"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Ταχύτητα αποστολής (σε kb/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Ταχύτητα λήψης (σε kb/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Φάκελοι"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Κατάλογος για αποθήκευση προσωρινών αρχείων:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Μετακίνηση των ολοκληρωμένων λήψεων στο:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Αυτόματη αποθήκευση λήψεων στο:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Αντιγραφή αρχείων .torrent σε:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Γραμμή εργαλείων λήψεων"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Ορισμός των ορίων ταχύτητας για το torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Μέγιστος ρυθμός αποστολής:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Μέγιστος ρυθμός λήψης:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/δευτ (το 0 σημαίνει απεριόριστο)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Προσθήκη ικανού υπολογιστή"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP υπολογιστή:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Θύρα:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Εισαγωγή IP και θύρας υπολογιστή."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Μαύρη λίστα του KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Σημείωση: Η μαύρη λίστα ισχύει μόνο για την τρέχουσα συνεδρία. Χρησιμοποιήστε "
+"το άνοιγμα/αποθήκευση για την αποθήκευση των καταχωρήσεων ή χρησιμοποιήστε το "
+"πρόσθετο φίλτρου IP (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Απαγορευμένοι υπολογιστές"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Διεύθυνση IP υπολογιστή"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Προσθήκη υπολογιστή:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Προσθήκη ενός υπολογιστή στη μαύρη λίστα"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Αφαίρεση του επιλεγμένου υπολογιστή από τη μαύρη λίστα"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Καθαρισμός"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Καθαρισμός της λίστας"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Αποθήκευση &ως..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Αποθήκευση της μαύρης λίστας για χρήση με το πρόσθετο φίλτρου IP του KTorrent"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Μέγιστος αριθμός λήψεων:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Μέγιστος αριθμός μοιράσματος:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Έναρξη λήψης σε δίσκο με λίγο χώρο:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Ελάχιστος χώρος στο δίσκο:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Να μην εκκινηθεί"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Να ερωτούμαι πάντα"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Εξαναγκασμός εκκίνησης"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(το 0 σημαίνει απεριόριστο)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Μέγιστος ρυθμός λήψης:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Καθολικό όριο συνδέσεων:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Μεγ. χρόνος μοιράσματος:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Μέγιστος αριθμός συνδέσεων ανά torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Αριθμός υποδοχέων αποστολής:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Θύρα UDP ανιχνευτή:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Μεγ. αναλογία κοινόχρηστων:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Μέγιστος ρυθμός αποστολής:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/δευτ (το 0 σημαίνει απεριόριστο)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Ώρες (το 0 σημαίνει απεριόριστο)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Συνέχεια μοιράσματος μετά την ολοκλήρωση της λήψης"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Προσοχή"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Οι παραπάνω θύρες πρέπει να είναι προωθημένες αν βρίσκεστε πίσω από ένα "
+"διαμεταγωγέα. Το πρόσθετο UPnP μπορεί να το κάνει αυτό για σας."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Διάλογος λίστας αναμονής KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Κατάσταση:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Ανιχνευτής:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Αναλογία κοινόχρηστων:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Εναπομένοντα bytes:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Ελεγχόμενο από"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Αποστολές"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Απεσταλμένα:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Μετακίνηση &πάνω"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Μετακίνηση &κάτω"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Μετακίνηση στην κορυφή"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Μετακίνηση στο &τέλος"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Ελεγχόμενο από &διαχειριστή αναμονής"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Ελεγχόμενο από &χρήστη"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Επικόλληση URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "Ε&ντάξει"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Ακύρωση"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Δημιουργία torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr ""
+"Το αρχείο ή φάκελος για το οποίο επιθυμείτε να δημιουργήσετε ένα torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Πρέπει να προσθέσετε τουλάχιστον έναν ανιχνευτή ή κόμβο."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Επιλογές αρχείων"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Μέγεθος κάθε κομματιού:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Εκκίνηση &μοιράσματος του torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Αποκεντρ&ωμένο (μόνο DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Ιδιωτικό torrent (δεν επιτρέπεται DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Σχόλια:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Δημιουργία"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Α&κύρωση"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Ανιχνευτές"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Κόμβοι DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Κόμβος:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP ή όνομα υπολογιστή"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Θύρα"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"ΣΗΜΕΙΩΣΗ: Έχουν ήδη εισαχθεί κάποιοι έγκυροι κόμβοι DHT. Θα πρέπει πιθανότατα "
+"να προσθέσετε τη διεύθυνση IP και τη θύρα σας αν πρόκειται να μοιράσετε αυτό το "
+"torrent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Προχωρημένες προτιμήσεις"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Αλγόριθμος KTorrent:</b> Ο προκαθορισμένος αλγόριθμος χρησιμοποιώντας έναν "
+"συνδυασμό άλλων αλγορίθμων σε διάφορες δοκιμές μας."
+"<br>\n"
+"<b>Αλγόριθμος τρέχουσας ταχύτητας:</b> Ο απλούστερος αλγόριθμος - Εναπομένοντα "
+"Byte/Τρέχουσα Ταχύτητα"
+"<br>\n"
+"<b>Αλγόριθμος καθολικής μέσης ταχύτητας:</b> Εναπομένοντα Byte/Μέση Ταχύτητα"
+"<br>\n"
+"<b>Αλγόριθμος παραθύρου X :</b> Ο εναπομείναντας χρόνος υπολογίζεται από Χ "
+"δείγματα ταχύτητας"
+"<br>\n"
+"<b>Αλγόριθμος κινούμενου μέσου:</b> Ταχύτητα κινούμενου μέσου υπολογισμένη από "
+"Χ δείγματα"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Τρέχουσα ταχύτητα"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Καθολική μέση ταχύτητα"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Παράθυρο του Χ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Κινούμενος μέσος"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(ενεργοποιείται μετά από επανεκκίνηση)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Α&πενεργοποίηση προδέσμευσης χώρου στο δίσκο"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+"Πλήρης προδέ&σμευση χώρου (αποφεύγεται η τμηματική αποθήκευση του αρχείου)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Βασικό (αργό)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Ειδικά του συστήματος αρχείου"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Επίδοση"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Χρήση μνήμης:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Χαμηλή"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Μεσαία"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Υψηλή"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Χρονικό διάστημα ενημέρωσης:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1δ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2δ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5δ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Γρήγορη ΚΜΕ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Αργή ΚΜΕ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Έλεγχος δεδομένων"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+"Κατά την αποστολή, &να μη γίνεται έλεγχος των κομματιών που είναι μεγαλύτερα "
+"από"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Εκτέλεση ελέγχου α&κεραιότητα μετά από"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "κατεστραμμένα κομμάτια"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+"Δικτύωση<b>Αλγόριθμος KTorrent:</b> Ο προκαθορισμένος αλγόριθμος "
+"χρησιμοποιώντας έναν συνδυασμό άλλων αλγορίθμων σε διάφορες δοκιμές μας."
+"<br>\n"
+"<b>Αλγόριθμος τρέχουσας ταχύτητας:</b> Ο απλούστερος αλγόριθμος - Εναπομένοντα "
+"Byte/Τρέχουσα Ταχύτητα"
+"<br>\n"
+"<b>Αλγόριθμος καθολικής μέσης ταχύτητας:</b> Εναπομένοντα Byte/Μέση Ταχύτητα"
+"<br>\n"
+"<b>Αλγόριθμος παραθύρου X :</b> Ο εναπομείναντας χρόνος υπολογίζεται από Χ "
+"δείγματα ταχύτητας"
+"<br>\n"
+"<b>Αλγόριθμος κινούμενου μέσου:</b> Ταχύτητα κινούμενου μέσου υπολογισμένη από "
+"Χ δείγματα"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Μέγιστος αριθμός συνδέσεων ανά torrent ( 0 = απεριόριστος)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Αγνόηση του &διαμεσολαβητή του KDE για συνδέσεις ανιχνευτή μέσω HTTP"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Διαμεσολαβητής HTTP ανιχνευτή:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Σάρωση δεδομένων"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Σάρωση δεδομένων για το torrent :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Αριθμός κομματιών που βρέθηκαν:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Αριθμός αποτυχημένων/μη ληφθέντων κομματιών:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Δοκιμή"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Μέγιστος αριθμός λήψεων ( 0 = απεριόριστος)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Μέγιστος αριθμός μοιράσματος ( 0 = απεριόριστος)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Έναρξη λήψεων σε δίσκο με λίγο χώρο;㎎"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Μέγιστος αριθμός συνδέσεων ανά torrent ( 0 = απεριόριστος)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Μέγιστος αριθμός συνδέσεων για όλες τις λήψεις ( 0 = απεριόριστος)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Μέγιστη ταχύτητα αποστολής σε KB/δευτ ( 0 = απεριόριστη)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Μέγιστη ταχύτητα λήψης σε KB/δευτ ( 0 = απεριόριστη)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Μέγιστη αναλογία κοινόχρηστων (0 = απεριόριστη)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Μέγιστος χρόνος μοιράσματος σε ώρες (0 = απεριόριστος)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Εμφάνιση εικονιδίου στο πλαίσιο συστήματος"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Εμφάνιση γραμμής ταχύτητας στο πλαίσιο συστήματος"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Ταχύτητα λήψης (σε kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Ταχύτητα αποστολής (σε kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Εμφάνιση αναδυόμενων μηνυμάτων όταν ολοκληρωθεί η λήψη του torrent."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Συνέχεια μοιράσματος μετά την ολοκλήρωση της λήψης"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Φάκελος για αποθήκευση προσωρινών αρχείων"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Αν θα γίνεται αυτόματη αποθήκευση λήψεων στον κατάλογο αποθήκευσης"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Φάκελος για αποθήκευση ληφθέντων αρχείων"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Αν θα γίνεται αυτόματη αποθήκευση λήψεων στο completedDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Φάκελος για μετακίνηση ληφθέντων αρχείων"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Αν θα γίνεται αυτόματη αντιγραφή των αρχείων .torrent στο torrentCopyDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Φάκελος αντιγραφής των αρχείων .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Αν θα χρησιμοποιείται μία προσαρμοσμένη IP για αποστολή στον ανιχνευτή"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Ο τελευταίος κατάλογος που χρησιμοποιήθηκε για αποθήκευση"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP για αποστολή στον ανιχνευτή"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Χρήση μνήμης"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Χρονικό διάστημα ενημέρωσης"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Υποστήριξη DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Θύρα DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Αριθμός υποδοχέων αποστολής"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Οι στήλες που εμφανίζονται στο KTorrentView"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Αλγόριθμος ET"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Αν δεν υπάρχει διαθέσιμος χώρος για την ολοκλήρωση της λήψης και ο ελεύθερος "
+"χώρος είναι λιγότερος από τον ελάχιστο, το torrent θα σταματήσει."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Διαχειριστής προσθέτων"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Φόρτωση"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Α&ποφόρτωση"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "&Φόρτωση όλων"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Αποφόρτωση όλων"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Προκαθορισμένη UPnP συσκευή για χρήση"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Ανιχνευμένες συσκευές:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Συσκευή"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Προωθημένες θύρες"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Σύνδεση WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Προώθηση &θυρών"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Αναίρεση προώθησης θυρών"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Επανασάρωση"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Ενεργοποίηση σάρωσης του φακέλου 1;"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Ενεργοποίηση σάρωσης του φακέλου 2;"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Ενεργοποίηση σάρωσης του φακέλου 3;"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Διαδρομή του φακέλου 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Διαδρομή του φακέλου 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Διαδρομή του φακέλου 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Αν τα torrent θα ανοίγονται χωρίς ειδοποίηση ή όχι."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Διαγραφή επιλεγμένης ενέργειας."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Μετακίνηση επιλεγμένης ενέργειας."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Προτιμήσεις σάρωσης φακέλων"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Σάρωση του φακέλου &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Σάρωση του φακέλου &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Σάρωση του φακέλου &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Μετακίνηση στον κατάλογο \"φορτωμένων'\" &μετά τη φόρτωση"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+"Μετακίνηση του torrent στον κατάλογο \"φορτωμένων\" μετά τη φόρτωσή του"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Άνοιγμα των torrent &χωρίς ειδοποίηση"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Να μην εμφανίζεται ο διάλογος επιλογής αρχείου για λήψη"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Διαγραφή μετά τη &φόρτωση"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Διαγράφει το torrent μετά τη φόρτωσή του"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Φάκελοι για σάρωση"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Φάκελος 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Φάκελος 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Φάκελος 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Προτιμήσεις αναζήτησης"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Εξυπηρετητής ιστού"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Προώθηση θύρας"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL συνεδρίας (σε δευτ):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Επιλογή διεπαφής:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Όνομα χρήστη:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Αλλαγή κωδικού πρόσβασης..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Διαδρομή εκτελέσιμου της Php:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Αριθμός θύρας"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "προώθηση θύρας"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Χρόνος time to live της συνεδρίας"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Θέμα περιβάλλοντος"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "διαδρομή εκτελέσιμου της Php"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "όνομα χρήστη"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "κωδικός πρόσβασης"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Τμήματα"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Σύνολο:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Τρέχουσα λήψη:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Ληφθέντα:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Εξαιρέσεις:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Απομένουν:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Μέγεθος:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Κομμάτι"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Πρόοδος"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Υπολογιστής"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Επιλεγμένοι υπολογιστές"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Χρήστες που μοιράζονται:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Χρήστες παράσιτα:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Μέση ταχύτητα λήψης:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Μέση ταχύτητα αποστολής:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Επόμενη ενημέρωση σε:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Κατάσταση ανιχνευτή:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Τμήματα του αρχείου torrent που λήφθηκαν:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Τμήματα του αρχείου torrent που είναι διαθέσιμα:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Κοινόχρηστα"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Η αποστολή θα σταματήσει όταν η αναλογία κοινόχρηστων φτάσει σε αυτή την τιμή. "
+"Το μηδέν σημαίνει ότι δεν υπάρχει όριο."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Η αποστολή θα σταματήσει αφού έχει παραμείνει ενεργή για τόσες ώρες."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Ώρες"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Όριο αναλογίας μοιράσματος:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Περιορισμός εργασιών σε λειτουργία μοιράσματος"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Όριο &χρόνου:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Ενημέρωση ανιχνευτή"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Ελάχιστο μεσοδιάστημα ενημέρωσης - 60 δευτερόλεπτα"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "&Προσθήκη ανιχνευτή"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Αφαίρεση ανιχνευτή"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "&Τροποποίηση ανιχνευτή"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Επαναφορά προκαθορισμένων"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Εμφάνιση καρτέλας προβολής υπολογιστών στο κύριο παράθυρο"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Εμφάνιση καρτέλας προβολής κομματιών λήψης στο κύριο παράθυρο"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Εμφάνιση καρτέλας προβολής ανιχνευτών στο κύριο παράθυρο"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Εμφάνιση λίστας υπολογιστών"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Εμφάνιση λίστας των κομματιών που &γίνεται λήψη"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Εμφάνιση λίστας ανιχνευτών"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Προτιμήσεις μπλοκαρίσματος IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Επιλογή αρχείου φίλτρου PeerGuardian "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Χρήση φίλτρου PeerGuardian;"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Αρχείο φίλτρων IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "&Λήψη/μετατροπή"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Μπορείτε να λάβετε το φίλτρο PeerGuardian από το bluetack.co.uk ή το "
+"blocklist.org.\n"
+"ΣΗΜΕΙΩΣΗ: Υποστηρίζεται το αρχείο ZIP από το bluetack.co.uk."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Url Level1 φίλτρου"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Χρήση φίλτρου level1;"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Μετατροπή..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Κάντε κλικ στο κουμπί 'Μετατροπή' για να αρχίσει η μετατροπή του αρχείου "
+"antip2p. Σημείωση: Αυτή η διαδικασία μπορεί να πάρει πολλή ώρα κατά τη διάρκεια "
+"της οποίας δε θα μπορείτε να χρησιμοποιήσετε το KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Ενημέρωση"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Ενημέρωση γραφημάτων κάθε"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Ενημέρωση γραφικού περιβάλλοντος"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Συγκέντρωση δεδομένων κάθε"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "miliseconds"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Μέγιστο"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Μέγιστος αριθμός μοιράσματος:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Ακριβής"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Δείτε το 'Τι είναι αυτό' για περισσότερες πληροφορίες"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Ταχύτητα υπολογιστών"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Ταχύτητα υπολογιστών:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "Ενημέρωση κάθε"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Η συγκέντρωση δεδομένων για πολλούς συνδεδεμένους υπολογιστές μπορεί να "
+"φορτώσει την KME."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Συνδέσεις υπολογιστών:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Εμφάνιση γραμμής ταχύτητας στο πλαίσιο συστήματος"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Αποστολή"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Συνδέσεις"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Υπολογιστές"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Εναλλαγή γραφημάτων ταχύτητας υπολογιστών"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+"Μεσοδιάστημα μεταξύ διαδοχικών λήψεων δεδομένων σχετικά με την ταχύτητα "
+"υπολογιστών"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Λήψη torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, fuzzy, no-c-format
+msgid "Connections mesurments count"
+msgstr "Σημαία μηνυμάτων συνδέσεων"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Εισαγωγή μιας υπάρχουσας λήψης"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Δεδομένα:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Παρακαλώ ορίστε το torrent καθώς και τα ήδη ληφθέντα δεδομένων για το torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "Ε&ισαγωγή"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "προκαθορισμένο"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Ροές ειδήσεων Rss"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Ροές ειδήσεων"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "Δια&γραφή"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Νέο"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Άρθρα"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Αυτόματη ανανέ&ωση"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "Α&γνόηση TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Ανανέωση"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Τίτλος"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Διατήρηση άρθρων (ημέρες)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Ενεργό"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Φίλτρα"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Αποδοχή φίλτρων"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Απόρριψη φίλτρων"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Κανονικές εκφράσεις"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Χειρισμός ως μια &σειρά"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Διεργασία"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Κριτήρια σειράς"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, fuzzy, no-c-format
+msgid "Match Without Episode"
+msgstr "Λήψη ταιριασμάτων χωρίς επεισόδιο"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Μέγιστος επεισόδιο"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Μέγιστη περίοδος"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Ελάχιστη περίοδος"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Ελάχιστο επεισόδιο"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Δοκιμή &κειμένου"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Δοκιμή"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Ταιριάσματα φίλτρου"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Προγραμματιστής εύρους δικτύου"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Αριστερό κλικ σε κατηγορία"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Κ&ατηγορία 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "Κ&λείσιμο"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Κανονικό"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Κατηγορία &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Κατηγορία &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Δεξί κλικ σε κατηγορία"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Κατηγορία &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Κατηγορία 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Κατηγορίες"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Κατηγορία</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Κατηγορία</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "λήψη:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "απεστάλη:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Κατηγορία</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* το 0 σημαίνει χωρίς όριο"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Αποθήκευση σε αρχείο"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Φόρτωση από αρχείο"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Μηδενισμός προγραμματισμού"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "Ε&ντάξει"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Σελίδα προτιμήσεων πρόσθετου προγραμματιστή"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Χρήση του προγραμματιστή εύ&ρους δικτύου;"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Προγραμματιστής εύρους δικτύου"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "&Χρήση χρωμάτων αντί εικόνων;"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Προτείνεται για αργά συστήματα)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Επεξεργασία &προγράμματος"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Ενεργοποίηση προγραμματιστή εύρους δικτύου;"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Χρήση χρωμάτων αντί εικόνων;"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Χρήση εμπλουτισμένου κειμένου στην καταγραφή"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Σημαία μηνυμάτων γενικών πληροφοριών"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Σημαία μηνυμάτων συνδέσεων"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Σημαία μηνυμάτων DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Σημαία μηνυμάτων πληροφοριών ανιχνευτή"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Σημαία μηνυμάτων πληροφοριών χρήσης δίσκου"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου IPFilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου αναζήτησης"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου InfoWidget"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου ScanFolder"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου Scheduler"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Σημαία μηνυμάτων προσθέτου διασύνδεσης ιστού"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Επιλογές προβολέα καταγραφής"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Πρόσθετα"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Όλες"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Αποσφαλμάτωση"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Ειδοποίηση"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Σημαντικές"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Καμία"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "Φίλτρο IP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Αναζήτηση:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Σάρωση φακέλων:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Προγραμματιστής χρόνου:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Συστατικό εισαγωγής αρχείων:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Συστατικό πληροφοριών:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Πρόσθετο RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Πρόσθετο διασύνδεσης ιστού:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Σύστημα"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Γενικά:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Συνδέσεις:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Χρήση δίσκου:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "&Χρήση εμπλουτισμένου κειμένου στην καταγραφή"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Εξωτερικός περιηγητής"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Άνοιγμα αναζητήσεων σε εξωτερικό περιηγητή"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Χρήση εξωτερικού περιηγητή"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Διαδρομή προσαρμοσμένου περιηγητή:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Μηχανές αναζήτησης"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Όνομα μηχανής αναζήτησης:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Προσθήκη"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Μηχανές"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Αφαίρεση όλων"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Προσθήκη &προκαθορισμένης"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Ενημέρωση από το Διαδίκτυο"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Αναζήτηση"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Μηχανή αναζήτησης:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Τρέχουσα μηχανή αναζήτησης"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Χρήση προσαρμοσμένου περιηγητή"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Διαδρομή εκτελέσιμου προσαρμοσμένου περιηγητή"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/δευτ"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 ημέρα \n"
+"%n ημέρες"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Ναι, πρώτο"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Ναι, τελευταίο"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Αδύνατο το άνοιγμα του αρχείου καταγραφής %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Αδυναμία εγγραφής στο %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Αδύνατη η ανάγνωση από το %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Αδύνατη η δημιουργία του καταλόγου %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Αδύνατη η δημιουργία συμβολικού δεσμού %1 στο %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Αδύνατη η μετακίνηση το %1 στο %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Αδύνατη η αντιγραφή του %1 στο %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Αδύνατη η διαγραφή του %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Δεν μπορεί να δημιουργηθεί το %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Αδυναμία υπολογισμού του μεγέθους αρχείου %1 : %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Αδύνατος ο υπολογισμός του μεγέθους του αρχείου: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Αδύνατο το άνοιγμα του αρχείου %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Αδύνατη η ανάπτυξη του αρχείου: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Αδύνατη η ανάπτυξη του αρχείου"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Αδύνατη η αναζήτηση στο αρχείο: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Αδυναμία εγγραφής πέρα από το τέλος της ενδιάμεσης μνήμης mmap!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Κατάσταση: <b>%2</b><br>Δημιουργός: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Φορτωμένο"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Μη φορτωμένο"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Επιλογές πρόσθετου"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Αδύνατο το άνοιγμα του αρχείου %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Ο κατάλογος %1 δεν υπάρχει"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Εσφαλμένο αναγνωριστικό: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Σφάλμα αποκωδικοποίησης"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Μη αναμενόμενο τέλος της εισόδου"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Αδυναμία μετατροπής του %1 σε ακέραιο"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Το torrent δεν είναι ολοκληρωμένο!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Κατεστραμμένο torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Το Torrent δεν περιέχει πεδίο ανακοίνωσης ή κόμβων"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Αδύνατο το άνοιγμα του αρχείου torrent %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Σφάλμα ανάλυσης"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Παρουσιάστηκε σφάλμα κατά τη φόρτωση του αρχείου torrent. Πιθανότατα το αρχείο "
+"είναι κατεστραμμένο, ή δεν είναι αρχείο torrent.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Παρουσιάστηκε σφάλμα κατά τη φόρτωση του αρχείου torrent. Ο πιο πιθανός λόγος "
+"είναι ότι το αρχείο είναι κατεστραμμένο, ή δεν είναι αρχείο torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Αδυναμία δημιουργίας %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Ήδη λαμβάνετε αυτό το αρχείο torrent (%1). Η λίστα ανιχνευτών των δύο αρχείων "
+"συγχωνεύτηκε."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Ήδη λαμβάνετε αυτό το αρχείο torrent (%1)"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Αδυναμία μεταφοράς του %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Το torrent %1 ξεκίνησε με μια προηγούμενη έκδοση του KTorrent. Για να "
+"σιγουρευτείτε ότι αυτό το torrent λειτουργεί ακόμη με την υπάρχουσα έκδοση του "
+"KTorrent, θα γίνει μεταφορά αυτού του torrent. Θα ερωτηθείτε για την τοποθεσία "
+"αποθήκευσης του torrent. Αν πατήσετε την ακύρωση, θα επιλεγεί ο προσωπικός σας "
+"κατάλογος."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Επιλογή καταλόγου για αποθήκευση"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Δεν εκκινήθηκε"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Μοίρασμα"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Λήψη"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Σταματημένο"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Σταμάτησε"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Σφάλμα: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Κατακράτηση χώρου στο δίσκο"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Σε αναμονή"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Έλεγχος δεδομένων"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Σταματημένο. Δεν υπάρχει ελεύθερος χώρος στη συσκευή."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Δεν έχετε αρκετό ελεύθερο χώρο στο δίσκο για τη λήψη αυτού του torrent. "
+"Επιθυμείτε σίγουρα τη συνέχεια;"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Μη επαρκής χώρος στο δίσκο για το %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Το torrent \"%1\" έφτασε στο μέγιστη αναλογία κοινόχρηστων του. Να παραβλεφθεί "
+"αυτό το όριο και να ξεκινήσει το μοίρασμά του;"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Συμπληρώθηκε η μέγιστη αναλογία κοινόχρηστων."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Σφάλμα κατά το σταμάτημα του torrent %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Σφάλμα κατά την εκκίνηση του torrent %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Ανακοίνωση"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Άγνωστος πελάτης"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 υπολογιστής\n"
+"%n υπολογιστές"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Δεν μπορεί να δημιουργηθεί το %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Απέτυχε η εγγραφή του πρώτου κομματιού του αρχείου DND: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Απέτυχε η εγγραφή του τελευταίου κομματιού του αρχείου DND: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+"Αδύνατο το άνοιγμα του %1 για εγγραφή. Το σύστημα αρχείων είναι μόνο για "
+"ανάγνωση."
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Αδύνατη η ανάπτυξη του αρχείου: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Αδύνατη η ανάπτυξη του αρχείου %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Αδύνατη η ανάπτυξη του αρχείου %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Σφάλμα: Η ανάγνωση πέρασε το τέλος του αρχείου %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Σφάλμα ανάγνωσης από το %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Σφάλμα εγγραφής στο %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Σφάλμα εγγραφής στο %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Αδύνατη η κατακράτηση χώρου στο δίσκο : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Αδυναμία σύνδεσης στη θύρα udp %1 ή σε μια από τις ακόλουθες 10 θύρες."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Μη έγκυρη απάντηση από ανιχνευτή"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Μη έγκυρα δεδομένα από τον ανιχνευτή"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Μη έγκυρο URL ανιχνευτή"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Αδύνατο το άνοιγμα του αρχείου %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Αδύνατη η δημιουργία αρχείου ευρετηρίου: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Αδύνατο το άνοιγμα του αρχείου : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Χρησιμοποιεί το UPnP για την αυτόματη προώθηση θυρών στο διαμεταγωγέα"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Αδυναμία εύρεσης υπηρεσίας προώθησης θυρών, στην περιγραφή της συσκευής!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Συσκευές UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Αυτόματη σάρωση καταλόγων για αρχεία torrent και φόρτωση αυτών."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Σάρωση φακέλων"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Σάρωση φακέλων"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Επιλογές σάρωσης φακέλων"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "φορτωμένο"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"ScanFolder - Φάκελος %1: Μη έγκυρο URL ή ο φάκελος δεν υπάρχει. Παρακαλώ "
+"επιλέξτε έναν έγκυρο κατάλογο."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Διασύνδεσης ιστού"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Επιλογές WebInterface"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+#, fuzzy
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Το εκτελέσιμο της php δεν είναι στο PATH· παρακαλώ εισάγετε τη διαδρομή "
+"χειροκίνητα"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Παρακαλώ εισάγετε το νέο κωδικό πρόσβασης για τη διασύνδεση ιστού."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "Το %1 υπάρχει και δεν είναι εκτελέσιμο"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "Το %1 δεν υπάρχει"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+#, fuzzy
+msgid "%1 is not executable"
+msgstr "Το %1 δεν είναι εκτελέσιμο"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "Το %1 είναι κατάλογος"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+#, fuzzy
+msgid "%1 is not php executable path"
+msgstr "Το %1 δεν είναι διαδρομή εκτελέσιμου της Php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Διασύνδεσης ιστού"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Επιτρέπεται ο έλεγχος του ktorrent μέσω περιηγητή"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Λήψη πρώτο"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Λήψη κανονικά"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Λήψη τελευταίο"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Διαγραφή αρχείου(ων)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Διαθέσιμοι"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Σε εκκρεμότητα"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Τα δεδομένα αυτού του αρχείου θα χαθούν. Είστε σίγουροι ότι θέλετε να το κάνετε "
+"αυτό;\n"
+"Τα δεδομένα αυτών των αρχείων θα χαθούν. Είστε σίγουροι ότι θέλετε να το κάνετε "
+"αυτό;"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Χωρίς όριο"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Συστατικό πληροφοριών"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Εμφάνιση πρόσθετων πληροφοριών σχετικά με μία λήψη. Όπως τα κομμάτια που έχουν "
+"ληφθεί, πόσοι χρήστες μοιράζονται και πόσοι χρήστες λειτουργούν σαν παράσιτα..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Αδυναμία προσθήκης ενός ανιχνευτή σε ιδιωτικό torrent."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Αδυναμία αφαίρεσης προκαθορισμένου ανιχνευτή torrent."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Δεν μπορείτε να προσθέσετε ανιχνευτές σε ένα ιδιωτικό torrent"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Χώρα"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Πελάτης"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Συμφορισμένο"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Αγνοήθηκε"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Διαθεσιμότητα"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Βαθμολογία"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Αποφόρτωση υποδοχής"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Αιτήσεις"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Διώξιμο υπολογιστή"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Απαγόρευση υπολογιστή"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Διαθέσιμα κομμάτια"
+"<br><img src=\"unavailable_color\">&nbsp; - Μη διαθέσιμα κομμάτια"
+"<br><img src=\"excluded_color\">&nbsp; - Εξαιρούμενα κομμάτια"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Επιλογές συστατικού πληροφοριών"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Κομμάτια που λήφθηκαν"
+"<br><img src=\"unavailable_color\">&nbsp; - Κομμάτια για λήψη"
+"<br><img src=\"excluded_color\">&nbsp; - Εξαιρούμενα κομμάτια"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Μετατροπή"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Φόρτωση αρχείου txt..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Παρακαλώ περιμένετε..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Το αρχείο μετατράπηκε."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Αδυναμία φόρτωσης του φίλτρου:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Εσφαλμένο αρχείο φίλτρου. Μπορεί να είναι κατεστραμμένο ή να έχει λάθος μορφή."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Αποκλείει υπολογιστές βασιζόμενο στη διεύθυνση IP τους"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Φίλτρο IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Κατάσταση: Φορτώθηκε και εκτελείται."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Κατάσταση: Δε φορτώθηκε."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Κατάσταση: <font color=\"#ff0000\">Το αρχείο φίλτρου δε βρέθηκε.</font> "
+"Κάντε λήψη και μετατροπή του αρχείου φίλτρου."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Το επιλεγμένο αρχείο υπάρχει ήδη, επιθυμείτε να το κατεβάσετε ξανά;"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Το αρχείο υπάρχει"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Το αρχείο φίλτρου (level1.dat) υπάρχει ήδη, επιθυμείτε να το μετατρέψετε ξανά;"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Φίλτρο μπλοκαρίσματος IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Επιλογές φίλτρου μπλοκαρίσματος IP"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Στατιστικά"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Επιλογές στατιστικών"
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Συνδέσεις:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Εμφάνιση γραμμής ταχύτητας στο πλαίσιο συστήματος"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Συνδέσεις:"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Εμφάνιση γραμμής ταχύτητας στο πλαίσιο συστήματος"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Μέγιστος αριθμός συνδέσεων ανά torrent:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Μέγιστος αριθμός συνδέσεων ανά torrent:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Κόμβοι"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Εργασίες"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Εμφάνιση στατιστικών μεταφορών"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Στατιστικά ταχύτητας"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Στατιστικά σύνδεσης"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Τρέχον"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Μέσος όρος"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Όριο"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Μέση ταχύτητα λήψης:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Μέση ταχύτητα λήψης:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Μέση ταχύτητα λήψης:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Χρήστες παράσιτα"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Φάκελοι"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Λεζάντα"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Αρχεία torrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Όλα τα αρχεία"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Αδυναμία επαλήθευσης δεδομένων : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Αδύνατη η φόρτωση του αρχείου torrent: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Εισαγωγή μερικώς ληφθέντων ή ολοκληρωμένων torrents από άλλες εφαρμογές"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Εισαγωγή υπάρχουσας λήψης"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL της ροής"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Αυτόματη σάρωση ροών rss για ταίριασμα torrent με τη βοήθεια κανονικών "
+"εκφράσεων και φόρτωση αυτών."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Ροές RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Τίτλος"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Περιγραφή"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Δεσμός"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Περίοδος"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Επεισόδιο"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Ώρα"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Προγραμματιστής χρόνου"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Επιλογές πρόσθετου προγραμματιστή χρόνου"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "ΔΕΥ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "ΤΡΙ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "ΤΕΤ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "ΠΕΜ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "ΠΑΡ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "ΣΑΒ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "ΚΥΡ"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Το πρόγραμμα αποθηκεύτηκε."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Το αρχείο δε βρέθηκε."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Το πρόγραμμα φορτώθηκε."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Πρόσθετο προγραμματισμού εύρους δικτύου"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Άνοιγμα προγραμματιστή εύρους δικτύου"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Ο προγραμματιστής εύρους δικτύου είναι απενεργοποιημένος. Μεταβείτε στις "
+"Προτιμήσεις->Προγραμματιστής για την ενεργοποίησή του."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Προβολέας καταγραφής"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Προβολέας καταγραφής"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Εμφανίζει την έξοδο καταγραφής του ktorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Χρησιμοποιήστε τον περιηγητή ιστοσελίδων σας για αναζήτηση της συμβολοσειράς %1 "
+"(κεφαλαία γράμματα) στη μηχανή αναζήτησης που επιθυμείτε να προσθέσετε. "
+"<br>Έπειτα αντιγράψτε το URL στη γραμμή διεύθυνσης μετά το τέλος της αναζήτησης "
+"και κάντε επικόλληση το εδώ. "
+"<br>"
+"<br>Η αναζήτηση για το %2 στο Google για παράδειγμα θα επιστρέψει το "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br>Αν προσθέσετε αυτό το URL εδώ, το ktorrent θα μπορεί να αναζητά μέσω του "
+"Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Χρησιμοποιήστε τον περιηγητή ιστοσελίδων σας για αναζήτηση της συμβολοσειράς %1 "
+"(κεφαλαία γράμματα) στη μηχανή αναζήτησης που επιθυμείτε να προσθέσετε. "
+"Χρησιμοποιήστε το παρακάτω παραγόμενο URL."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Πρέπει να εισάγετε ένα όνομα μηχανής αναζήτησης και ένα URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Υπάρχει μια μηχανή αναζήτησης με το ίδιο όνομα. Παρακαλώ χρησιμοποιήστε ένα "
+"διαφορετικό όνομα."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Εσφαλμένο URL. Πρέπει να αναζητήσετε για το FOOBAR με τον περιηγητή ιστοσελίδων "
+"σας και να κάνετε αντιγραφή/επικόλληση του ακριβούς URL εδώ."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Αναζήτηση"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Επιλογές μηχανής αναζήτησης"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Αναζήτηση για %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "αρχεία torrent"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Η αναζήτηση ολοκληρώθηκε"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Μηχανή: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Αναζήτηση για torrents σε πολλές δημοφιλείς μηχανές αναζήτησης torrent"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Επιθυμείτε τη λήψη ή την αποθήκευση του torrent;"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Λήψη torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Λήψη"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Αναζήτηση στο τοπικό δίκτυο για υπολογιστές που τρέχουν το ktorrent για "
+"μοίρασμα torrent"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Αλγόριθμος ΕΤΑ:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Αδύνατη φόρτωση του κομματιού %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Ανιχνευτές"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "Τύπος πεδίου υπηρεσίας των πακέτων IP"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+Ν"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+Σ"
diff --git a/translations/en_GB/Makefile.am b/translations/en_GB/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/en_GB/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/en_GB/messages/Makefile.am b/translations/en_GB/messages/Makefile.am
new file mode 100644
index 0000000..ce472fa
--- /dev/null
+++ b/translations/en_GB/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = en_GB
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/en_GB/messages/ktorrent.po b/translations/en_GB/messages/ktorrent.po
new file mode 100644
index 0000000..f9eef54
--- /dev/null
+++ b/translations/en_GB/messages/ktorrent.po
@@ -0,0 +1,5148 @@
+# translation of ktorrent.po to British English
+# Andrew Coles <andrew_coles@yahoo.co.uk>, 2005.
+# Malcolm Hunter <malcolm.hunter@gmx.co.uk>, 2005, 2006.
+# Simon Horsburgh <simondo42@ihug.co.nz>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2006-01-16 22:31+0000\n"
+"Last-Translator: Malcolm Hunter <malcolm.hunter@gmx.co.uk>\n"
+"Language-Team: British English <kde-en-gb@kde.me.uk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Info"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Data transferred during the current session"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Current speed of all torrents combined"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Start"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Stop"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Start All"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Stop All"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Paste Torrent URL..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+#, fuzzy
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Open QueueManager..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "IP filter file:"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+#, fuzzy
+msgid "Set max upload rate"
+msgstr "Maximum upload rate:"
+
+#: apps/ktorrent/ktorrent.cpp:574
+#, fuzzy
+msgid "Set max download rate"
+msgstr "Maximum download rate:"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent Files"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "All Files"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Open Location"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Speed up: %1 / down: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "Transferred up: %1 / down: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "Move &up"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "Move &up"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "Move &up"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "Choose File to Save Torrent"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Malformed URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "Uploaded"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+#, fuzzy
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is bound to port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Cannot create torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Recreate"
+msgstr "Cre&ate"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "Download"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Cannot create index file: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Cannot create index file: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Cre&ate"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Cannot create index file: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "infinity"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Error writing to %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Error writing to %1"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "A BitTorrent program for KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Debug mode"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Document to open"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "Plugins"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "General Options"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+#, fuzzy
+msgid "Application icon and a couple of others"
+msgstr "1.1 Application icon and a couple of others"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "The downloads icon"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 application icon"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "ChunkBar's tooltip and IWFileTreeItem sorting"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "Controlled by"
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "File Options"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Fi&les"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Fi&les"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Fi&les"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Unable to open torrent file %1: %2"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "You must select a file or a folder."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "You must add at least one tracker."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent Files (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Choose File to Save Torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Creating %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "Custom IP"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "Name"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "Tracker"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Uploaded"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "The downloads icon"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Download"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Uploaded"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Create Torrent"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "Download"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Uploaded"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "Download"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Create Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Create Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Assigned Peers"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Manual Announce"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Preview"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "Folders"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+#, fuzzy
+msgid "Data Directory"
+msgstr "Folders"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+#, fuzzy
+msgid "Temporary Directory"
+msgstr "Folders"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "The downloads icon"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+#, fuzzy
+msgid "Add to Group"
+msgstr "Custom IP"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "Malformed URL."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Preferences"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Download Options"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "General"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "General Options"
+
+#: apps/ktorrent/pref.cpp:283
+#, fuzzy
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Cannot look up %1 : %2\n"
+"Please provide a valid IP address or hostname."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "File Options"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Downloaded"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Size"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Uploaded"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Down Speed"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Up Speed"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Time Left"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "Seeders:"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "Leechers:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Complete"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "Share ratio:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Downloaded"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "Time Left"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Torrent"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"1 peer\n"
+"%n peers"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+#, fuzzy
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"The torrent %1 has not finished downloading. Do you want to delete the "
+"incomplete data too?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Remove Download"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "You are already downloading this torrent."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "The downloads icon"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "User"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Queue Manager"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "Create Torrent"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Download completed"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Download completed"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> has been stopped with the following error: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Error writing to %1"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr ""
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Cannot open index file %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Andrew Coles"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "andrew_coles@yahoo.co.uk"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Select Which Files You Want to Download"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Download"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "&User controlled"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Start seedin&g the torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Download"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Select &All"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Select &None"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Invert Selection"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "Download"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, fuzzy, no-c-format
+msgid "Encryption"
+msgstr "Description"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Custom IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Send the tracker a c&ustom IP or hostname"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Custom IP or hostname:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "Show s&ystem tray icon"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Show s&ystem tray icon"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Show s&ystem tray icon"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Show s&ystem tray icon"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Folders"
+msgstr "Fi&les"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Folder to store temporary files:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Download"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Automatically save downloads to:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "torrent files"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Download Toolbar"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Start seedin&g the torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "Maximum upload rate:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Maximum download rate:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/sec (0 is no limit)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "Peer"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Torrent files"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, fuzzy, no-c-format
+msgid "Banned Peers"
+msgstr "Assigned Peers"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maximum downloads:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maximum seeds:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "Not started"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "Not started"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 is no limit)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maximum download rate:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "Share ratio:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, fuzzy, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maximum connections per download:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP tracker port:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "Share ratio:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maximum upload rate:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/sec (0 is no limit)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(0 is no limit)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Keep seeding after download is finished"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Attention"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"The above ports must be forwarded if you are behind a router. The UPnP plugin "
+"can do this for you."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT Queue Dialogue"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, fuzzy, no-c-format
+msgid "Tracker:"
+msgstr "Tracker"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Share ratio:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Controlled by"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "Uploaded"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "Uploaded"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, fuzzy, no-c-format
+msgid "M&ove up"
+msgstr "Move &up"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Move dow&n"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "Move &up"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, fuzzy, no-c-format
+msgid "&QM Controlled"
+msgstr "&QM controlled"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, fuzzy, no-c-format
+msgid "&User Controlled"
+msgstr "&User controlled"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Paste URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "C&ancel"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Create Torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "The file or folder of which you want to create a torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "You must add at least one tracker."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "File Options"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Size of each chunk:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Start seedin&g the torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Comments:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "Cre&ate"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Ca&ncel"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackers"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Name:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "Custom IP or hostname:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Search Preferences"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "Current search engine"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Preferences"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Memory usage:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Low"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Medium"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "High"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "GUI update interval:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maximum number of connections per download (0 = no limit)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "UDP tracker port:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maximum number of downloads (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maximum number of seeds (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, fuzzy, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maximum number of connections per download (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, fuzzy, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Maximum number of connections per download (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maximum upload speed in KB/sec (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maximum download speed in KB/sec (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maximum number of seeds (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maximum number of seeds (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Show a system tray icon"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Show s&ystem tray icon"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Keep seeding after download has finished"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Folder to store temporary files"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, fuzzy, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "&Automatically save downloads to:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Folder to store downloaded files"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "&Automatically save downloads to:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Folder to store downloaded files"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "&Automatically save downloads to:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Folder to store temporary files"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, fuzzy, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "IP to pass to the tracker"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP to pass to the tracker"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Memory usage"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "GUI update interval"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Plugin Manager"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Load"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "U&nload"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Load All"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Unload All"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Default UPnP device to use"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Detected devices:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Device"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Ports Forwarded"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, fuzzy, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Forward Ports"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Undo Port Forwarding"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Rescan"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, fuzzy, no-c-format
+msgid "Folder1 path"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, fuzzy, no-c-format
+msgid "Folder2 path"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, fuzzy, no-c-format
+msgid "Folder3 path"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Unable to open torrent file %1: %2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Search Preferences"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, fuzzy, no-c-format
+msgid "Alt+2"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, fuzzy, no-c-format
+msgid "Alt+3"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "torrent files"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, fuzzy, no-c-format
+msgid "Folders to scan"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, fuzzy, no-c-format
+msgid "Folder 1:"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, fuzzy, no-c-format
+msgid "Folder 2:"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, fuzzy, no-c-format
+msgid "Folder 3:"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Search Preferences"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "Forward Ports"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "Select &None"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "User"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "Forward Ports"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "General Options"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Chunks"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Total:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Currently downloading:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Downloaded:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Excluded:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, fuzzy, no-c-format
+msgid "Size:"
+msgstr "Size"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Chunk"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Progress"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Peer"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Assigned Peers"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Seeders:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Leechers:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, fuzzy, no-c-format
+msgid "Average Down Speed:"
+msgstr "Average Speed"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, fuzzy, no-c-format
+msgid "Average Up Speed:"
+msgstr "Average Speed"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Next update in:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Trackers"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Parts of the file which have been downloaded:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Parts of the file which are available:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Sharing"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "IP to pass to the tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, fuzzy, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Gui update interval"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, fuzzy, no-c-format
+msgid "Restore Defaults"
+msgstr "Add Defau&lt"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Show peer view tab in main window"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Show chunk download view tab in main window"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, fuzzy, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Show peer view tab in main window"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Show list of peers"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Show list of chunks currentl&y downloading"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, fuzzy, no-c-format
+msgid "Show list of trackers"
+msgstr "Show list of peers"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP Blocking Preferences"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Use KTorrent filter?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Use KTorrent filter?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP filter file:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Dow&nload/Convert"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Level 1 filter URL"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Use level1 filter?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Converting..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "GUI update interval"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Maximum seeds:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Maximum seeds:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "Peers"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "Peer"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Show s&ystem tray icon"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Uploaded"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Download Torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Import an Existing Download"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "Torrent"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, fuzzy, no-c-format
+msgid "Data:"
+msgstr "Data"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Please specify the torrent and the data already downloaded for that torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, fuzzy, no-c-format
+msgid "&Import"
+msgstr "Impo&rt"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "Add Defau&lt"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "Seeders:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "IP filter file:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "All Files"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Progress"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "Share ratio:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "Download"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, fuzzy, no-c-format
+msgid "upload:"
+msgstr "Uploaded"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, fuzzy, no-c-format
+msgid "* zero means no limit"
+msgstr "(0 is no limit)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, fuzzy, no-c-format
+msgid "O&k"
+msgstr "&Ok"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Plugin Options"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "File Options"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Plugin Options"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Plugin Options"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Plugin Options"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "File Options"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Plugins"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, fuzzy, no-c-format
+msgid "Debug"
+msgstr "Debug mode"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, fuzzy, no-c-format
+msgid "Important"
+msgstr "Impo&rt"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "IP filter file:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, fuzzy, no-c-format
+msgid "Search:"
+msgstr "Search"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, fuzzy, no-c-format
+msgid "UPnP:"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "Fi&les"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, fuzzy, no-c-format
+msgid "Scheduler:"
+msgstr "Seeders:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, fuzzy, no-c-format
+msgid "InfoWidget:"
+msgstr "Information Widget"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "General Options"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, fuzzy, no-c-format
+msgid "General:"
+msgstr "General"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, fuzzy, no-c-format
+msgid "Custom browser path:"
+msgstr "Custom IP"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Search Engines"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Search engine name:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Add"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Engines"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "R&emove All"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Add Defau&lt"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "GUI update interval"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Search"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Search engine:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Current search engine"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+#, fuzzy
+msgid "%1 KB/s"
+msgstr "%1 KB/sec"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 day \n"
+"%n days "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Cannot open log file %1: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Cannot write to %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Cannot read from %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Cannot create folder %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Cannot symlink %1 to %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Cannot move %1 to %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Cannot copy %1 to %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Cannot delete %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Cannot create %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Cannot open file : %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Cannot open file : %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Cannot open %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+#, fuzzy
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Cannot write beyond end of the mmap buffer!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Loaded"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Not loaded"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Plugin Options"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Cannot open file %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "The folder %1 does not exist"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Illegal token: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Decode error"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Unexpected end of input"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Cannot convert %1 to an int"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent is incomplete!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Corrupted torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Unable to open torrent file %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Parse Error"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Unable to open torrent file %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "You are already downloading this torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Cannot migrate %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, the torrent will be "
+"migrated. You will be asked for a location to save the torrent to. If you press "
+"cancel, your home folder will be selected."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Select Folder to Save To"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Not started"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Seeding"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Downloading"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Stalled"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Stopped"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Error: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Error stopping torrent %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Error starting torrent %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Unknown client"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 peer\n"
+"%n peers"
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "Cannot create %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Error: Reading past the end of file %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Error reading from %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Error writing to %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Error writing to %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Cannot bind to UDP port %1 or the 10 following ports."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "Invalid response"
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr "Invalid response"
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "Invalid response"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Cannot open file %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Cannot create index file: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Cannot open file : %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+#, fuzzy
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Cannot find port forwarding service in the device description!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP Devices"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Fi&les"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder"
+msgstr "Fi&les"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "File Options"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+#, fuzzy
+msgid "loaded"
+msgstr "Uploaded"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "General Options"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "The folder %1 does not exist"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+#, fuzzy
+msgid "%1 is a directory"
+msgstr "Folders"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "General Options"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "Downloads"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "Download completed"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "Downloads"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "All Files"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Available"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Pending"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "(0 is no limit)"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Information Widget"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "Cannot create torrent: %1"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+#, fuzzy
+msgid "Country"
+msgstr "Controlled by"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Client"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Choked"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Snubbed"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Availability"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "Unload All"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+#, fuzzy
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Ban Peer"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Information Widget Options"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Convert"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Loading txt file..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "File converted."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Could not load filter:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Bad filter file. It may be corrupted or has a bad format."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IP filter file:"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: Loaded and running."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: Not loaded."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Selected file already exists. Do you want to download it again?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "File Exists"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Filter file (level1.dat) already exists. Do you want to convert it again?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP Blocking Filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IP Blocking Filter Options"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Status"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Leechers:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Show s&ystem tray icon"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Download completed"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Show s&ystem tray icon"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Maximum connections per download:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Maximum connections per download:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Name:"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Trackers"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Torrent"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "(0 is no limit)"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Average Speed"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Average Speed"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Average Speed"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Leechers:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Fi&les"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent files"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "All files"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "Cannot verify data : %s"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Cannot load the torrent file: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+#, fuzzy
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"KTorrent partial file importing plugin. This plugin allows you to import "
+"partially or fully downloaded torrents from other clients"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Import existing download"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Description"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "Share ratio:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "Time Left"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "Plugin Options"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+#, fuzzy
+msgid "File not found."
+msgstr "File converted."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "KTorrent's search plugin"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "File Options"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Then copy the URL in the addressbar after the "
+"search is finished, and paste it here."
+"<br>Searching for %2 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. If you add this URL "
+"here, KTorrent can search using Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "You must enter the search engine's name and URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"A search engine with the same name already exists. Please use a different name."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Bad URL. You should search for the URL with your Internet browser and paste the "
+"exact URL here."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Search"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Search Engine Options"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "Searching for %1 ..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent files"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Search finished"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Engines"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Do you want to download or save the torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Download Torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Download"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Cannot load chunk %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Trackers"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "You must add at least one tracker."
+
+#~ msgid "DownloadPref"
+#~ msgstr "DownloadPref"
+
+#~ msgid "Alt+K"
+#~ msgstr "Alt+K"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#~ msgid "Alt+U"
+#~ msgstr "Alt+U"
+
+#~ msgid "Alt+A"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+U"
+
+#, fuzzy
+#~ msgid "Max ratio:"
+#~ msgstr "Share ratio:"
+
+#~ msgid "Name"
+#~ msgstr "Name"
+
+#~ msgid "Author"
+#~ msgstr "Author"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Download completed"
+
+#, fuzzy
+#~ msgid "Tracker URL:"
+#~ msgstr "Tracker"
+
+#, fuzzy
+#~ msgid "Tracker status:"
+#~ msgstr "Trackers"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "Specified UDP port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Select Folder to Save To"
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Downloads"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Uploaded"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "Search Engines"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "Torrent"
+
+#~ msgid "Tracker"
+#~ msgstr "Tracker"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "St&atus"
+
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+Y"
+
+#~ msgid "InfoWidgetBase"
+#~ msgstr "InfoWidgetBase"
+
+#, fuzzy
+#~ msgid "Tracker request timed out"
+#~ msgstr "Trackers"
+
+#, fuzzy
+#~ msgid "Alt+G"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+1"
+
+#~ msgid "finished"
+#~ msgstr "finished"
+
+#~ msgid "Cannot bind to port %1 or the 10 following ports."
+#~ msgstr "Cannot bind to port %1 or the 10 following ports."
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "Search Engines"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "Download completed"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "Download completed"
+
+#~ msgid "Completed"
+#~ msgstr "Completed"
+
+#~ msgid "Alt+C"
+#~ msgstr "Alt+C"
+
+#~ msgid "Unreachable"
+#~ msgstr "Unreachable"
+
+#~ msgid "Parse error"
+#~ msgstr "Parse error"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "Search"
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Cannot start more than one download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+
+#~ msgid "Alt+O"
+#~ msgstr "Alt+O"
+
+#~ msgid "Select Filter File with IP Ranges in KTorrent Format"
+#~ msgstr "Select Filter File with IP Ranges in KTorrent Format"
+
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "Use &KTorrent filter?"
+
+#~ msgid "Select Level1 Filter File (from Bluetack.co.uk or Openmedia.info)"
+#~ msgstr "Select Level 1 Filter File (from Bluetack.co.uk or Openmedia.info)"
+
+#~ msgid "Use level&1 filter?"
+#~ msgstr "Use level&1 filter?"
+
+#~ msgid "IP filter file"
+#~ msgstr "IP filter file"
+
+#~ msgid "You must fill in the name field."
+#~ msgstr "You must fill in the name field."
+
+#, fuzzy
+#~ msgid "Alt+R"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Available trackers:"
+#~ msgstr "Available"
+
+#~ msgid "Down:"
+#~ msgstr "Down:"
+
+#~ msgid "Up:"
+#~ msgstr "Up:"
+
+#, fuzzy
+#~ msgid "Fi&les"
+#~ msgstr "Fi&les"
+
+#~ msgid "KTorrent's UPnP plugin"
+#~ msgstr "KTorrent's UPnP plugin"
+
+#~ msgid "KTorrent's information widget plugin, it shows additional information about a download."
+#~ msgstr "KTorrent information widget plugin. This shows additional information about a download."
+
+#~ msgid "KTorrent's IP filter plugin"
+#~ msgstr "KTorrent IP filter plugin"
+
+#~ msgid "KTorrent's log viewer plugin"
+#~ msgstr "KTorrent log viewer plugin"
+
+#~ msgid "KTorrent's search plugin"
+#~ msgstr "KTorrent's search plugin"
+
+#, fuzzy
+#~ msgid "Re&store default."
+#~ msgstr "Add Defau&lt"
+
+#~ msgid "Alt+Q"
+#~ msgstr "Alt+Q"
+
+#, fuzzy
+#~ msgid "Downlo&ad"
+#~ msgstr "Download"
+
+#, fuzzy
+#~ msgid "&Seed"
+#~ msgstr "Seeding"
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+1"
+
+#~ msgid "yes"
+#~ msgstr "yes"
+
+#~ msgid "no"
+#~ msgstr "no"
+
+#~ msgid "This could take a couple of minutes. Please wait..."
+#~ msgstr "This could take a couple of minutes. Please wait..."
+
+#, fuzzy
+#~ msgid "Cannot preallocate diskspace : %s"
+#~ msgstr "Cannot create index file: %1"
+
+#, fuzzy
+#~ msgid "&Status"
+#~ msgstr "Status"
+
+#~ msgid "Miscelanious"
+#~ msgstr "Miscellaneous"
diff --git a/translations/es/Makefile.am b/translations/es/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/es/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/es/messages/Makefile.am b/translations/es/messages/Makefile.am
new file mode 100644
index 0000000..d3df28d
--- /dev/null
+++ b/translations/es/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = es
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/es/messages/ktorrent.po b/translations/es/messages/ktorrent.po
new file mode 100644
index 0000000..8619673
--- /dev/null
+++ b/translations/es/messages/ktorrent.po
@@ -0,0 +1,4920 @@
+# Translation of ktorrent to Spanish
+# This file is distributed under the same license as the KTorrent package.
+# Copyright (C) 2005 Joris Guisson <joris.guisson@gmail.com>
+#
+# Pablo de Vicente <pablo.devicente@gmail.com>, 2005.
+# Enrique Matias Sanchez (aka Quique) <cronopios@gmail.com>, 2005, 2006, 2007.
+# Jaime Robles <jaime@kde.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-12-23 11:26+0100\n"
+"Last-Translator: Enrique Matias Sanchez (aka Quique) <cronopios@gmail.com>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+"No hay conexiones entrantes (posiblemente esté detrás de un cortafuegos)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Información"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Datos transferidos durante la sesión actual"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Velocidad actual de todos los torrents combinados"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupos"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Comenzar"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Detener"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Iniciar todo"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Detener todo"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Pegar el URL del torrent..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Abrir el gestor de la cola..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Encolar/Desencolar"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Filtro de IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Verificar la integridad de los datos"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Definir la tasa máxima de envío"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Definir la tasa máxima de descarga"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Ficheros torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Todos los ficheros"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Abrir ubicación"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Velocidad de descarga: %1 / envío: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Descargado: %1 / enviado: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 nodos, %2 tareas"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: desconectado"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Todos los torrents"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Buscar:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Diferenciar mayúsculas y minúsculas"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Mover al punto de anclaje izquierdo"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Mover al punto de anclaje derecho"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Mover al punto de anclaje inferior"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Asignar un acelerador..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Limpiar el acelerador"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Cambiar el número del botón"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Número del nuevo acelerador:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Debe introducir una IP en el formato «XXX.XXX.XXX.XXX». También puede usar "
+"caracteres comodín para intervalos, como «127.0.0.*»."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Escoja un fichero"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Escoja un nombre de fichero en el que grabar"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL mal formado."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Descargas"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Envíos"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"El puerto indicado (%1) no está disponible o está siendo utilizado por otra "
+"aplicación. KTorrent está utilizando ahora el puerto %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent no puede aceptar conexiones porque los puertos %1 a %2 ya están siendo "
+"usados por otro programa."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "No se puede crear el torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Faltan varios ficheros de datos del torrent «%1»; ¿desea crearlos de nuevo o "
+"prefiere no descargarlos?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Crear de nuevo"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "No descargar"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "No se puede crear de nuevo los ficheros que faltan: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Faltan ficheros de datos"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "No se puede deseleccionar los ficheros que faltan: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Falta el fichero en el que están guardados los datos del torrent «%1»; ¿desea "
+"crearlo de nuevo?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "No crear de nuevo"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "No se puede crear de nuevo el fichero de datos: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Falta el fichero de datos"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Verificando la integridad de los datos"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "infinito"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Error al analizar los datos: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Analizando los datos de <b>%1</b>:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Un programa de BitTorrent para KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Modo de depuración"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Documento a abrir"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Complemento de RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Complemento de la interfaz web"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Complemento de estadísticas"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Icono de la aplicación y algunos otros"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Icono de descargas"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Icono de la aplicación 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Consejo de ChunkBar y ordenación de IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Ubicador del país para el complemento InfoWidget (este producto incluye datos "
+"de GeoLite creados por MaxMind, disponibles en http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Banderas de los países"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Prioridad del fichero"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+"Se usó Miniupnp como ejemplo para nuestra propia implementación de UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Parche de la proporción máxima de compartición global"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Mejoras de Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Interfaz web Coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Código de IDEAI de KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Mejora en la velocidad de conversión en el complemento de filtro de IP"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Descubiertas dos vulnerabilidades de seguridad (ambas corregidas)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Parche de carga silenciosas con una ubicación de grabación"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Arreglos al código PHP de la interfaz web"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Preasignación de disco específica de XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Parche para no mostrar velocidades muy bajas"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Parche para mostrar la posibilidad de estar tras un cortafuegos"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Diversos parches"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Parche para ocultar la barra de menús"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+"Parche para modificar las prioridades de los ficheros en la interfaz web"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Diversos parches para la interfaz web"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Parche para la barra de filtros"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Parche para la actualización de la vista de fichero no multihilo"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Optimización de la generación del hash SHA1"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Parche para arreglar el cálculo del espacio libre en disco en FreeBSD"
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Parche de carga silenciosas con una ubicación de grabación"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Debe seleccionar un fichero o una carpeta."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "No ha añadido ningún localizador,¿seguro que desea crear este torrent?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Debe añadir al menos un nodo."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Ficheros torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Seleccione el fichero para guardar el torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Creando %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Grupos personalizados"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nuevo grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Editar el nombre"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Eliminar el grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Abrir una solapa"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Introduzca el nombre del grupo."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "El grupo %1 ya existe."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Introduzca el nombre del nuevo grupo."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Envíos activos"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Envíos en espera"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Descargas en espera"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Descargas del usuario"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Envíos del usuario"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Torrents inactivos"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Descargas inactivas"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Envíos inactivos"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Torrents activos"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Descargas activas"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Eliminar el torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Eliminar el torrent y los datos"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Añadir compañeros"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Fuentes de compañeros adicionales"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Fuentes de compañeros del torrent:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Intercambio de compañeros"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Anuncio manual"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Vista previa"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Abrir un directorio"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Directorio de datos"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Directorio temporal"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Establecer la ubicación de las descargas"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Eliminar del grupo"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Añadir al grupo"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Límites de velocidad"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"El torrent no existe. Informe de este error a los desarrolladores de KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Se ha añadido un compañero potencial."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Dirección IP mal formada."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Preferencias"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opciones de descarga"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+"El puerto de DHT necesita ser diferente del puerto del localizador UDP."
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "General"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opciones generales"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"No se puede buscar %1: %2\n"
+"Proporcione una dirección IP o nombre de máquina válido."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avanzado"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Opciones avanzadas"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Columnas visibles"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Estado"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Descargado"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Tamaño"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Enviado"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Velocidad de descarga"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Velocidad de envío"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tiempo restante"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Sembradores"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Sanguijuelas"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% completado"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Proporción de compartición"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Tiempo de descarga"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Tiempo de siembra"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Todos los torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"No se puede iniciar más de una transferencia, \n"
+"No se puede iniciar más de %n transferencias, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"y una semilla. \n"
+"y %n semillas. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Vaya a Preferencias -> Configurar KTorrent si desea cambiar los límites."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"El torrent %1 no ha acabado de descargarse; ¿desea borrar también los datos "
+"incompletos?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Eliminar la descarga"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Borrar los datos"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Mantener los datos"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Perderá todos los datos descargados. ¿Seguro que desea hacer esto?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Ya está verificando los datos del torrent %1."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Elija la ubicación de descarga de %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Ha deseleccionado los siguientes ficheros existentes. Perderá todos los datos "
+"de estos ficheros. ¿Seguro que desea hacer esto?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Sí, borrar los ficheros"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "No, mantener los ficheros"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " corto."
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Usuario"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Gestor de cola"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "No (torrent privado)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Velocidad:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Descarga: <font color='#1c9a1c'>%1</font></td>"
+"<td>Envío: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transferencias:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Descarga: <font color='#1c9a1c'>%3</font></td>"
+"<td>Envío: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> ha terminado de descargarse."
+"<br>Velocidad media: %2 Descarga / %3 Envío."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Descarga completa"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> ha alcanzado su proporción máxima de compartición de %2 y ha sido "
+"detenido."
+"<br>Enviado %3 a una velocidad media de %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Siembra finalizada"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> ha alcanzado su tiempo máximo de siembra de %2 horas y ha sido "
+"detenido."
+"<br>Enviado %3 a una velocidad media de %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> ha sido detenido por el siguiente error: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Se han encontrado datos dañados en el torrent <b>%1</b> "
+"<br>Sería buena idea realizar una verificación de integridad de datos sobre el "
+"torrent."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> ha alcanzado su proporción máxima de compartición de %2 y ha sido "
+"puesto en espera. Elimine el límite manualmente si desea continuar sembrando."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> ha alcanzado su tiempo máximo de siembra de %2 horas y no se puede "
+"poner en espera.. Elimine el límite manualmente si desea continuar sembrando."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "El torrent no puede ser puesto en espera."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "No se puede iniciar <b>%1</b>: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"No se puede iniciar más de un torrent. "
+"<br>\n"
+"No se puede iniciar más de %n torrents. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"No se puede descargar más de un torrent. "
+"<br> \n"
+"No se puede descargar más de %n torrents. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "No se puede iniciar el torrent."
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "No hay disponible suficiente espacio en disco."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Su disco se está quedando sin espacio.<br /><b>%1</b> "
+"se está descargando a «%2»."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Se ha detenido el torrent.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "El dispositivo se está quedando sin espacio"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Velocidad límite en kB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Sin límite"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Límites de velocidad para <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Una aplicación KPart de KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "No se puede abrir el fichero índice %1: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Víctor Fernández,Enrique Matías Sánchez (Quique)"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "vfernandez@polinux.upv.es,cronopios@gmail.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Seleccione que ficheros desea descargar"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Descargar a:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupo:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Controlado por el &usuario"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Iniciar el torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Descarga"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Seleccionar &todo"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "No seleccionar &nada"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Invertir la selección"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Espacio en disco"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Espacio en disco necesario:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Espacio libre en disco:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Tras la descarga:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Cifrado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Usar cifrado del protocolo"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"El cifrado del protocolo se utiliza para evitar que los ISP ralenticen las "
+"conexiones bittorrent."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Permitir conexiones no cifradas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Si no está marcado, sólo podrá conectarse a clientes que admitan cifrado."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Protocolo <b>T</b>abla de <b>H</b>ash <b>D</b>istribuido"
+"<br>Protocolo de intercambio entre compañeros descentralizado. Vea más "
+"información en el manual."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Usar DHT para obtener compañeros adicionales"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Puerto UDP para la comunicación de DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP personalizada"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+"E&nviar al localizador una dirección IP o nombre de máquina personalizado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Dirección IP o nombre de máquina personalizado:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Icono de la bandeja del sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Mostrar el icono en la bandeja del &sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Mostrar la &barra de velocidad en la bandeja del sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Mostrar mensajes emergentes en la bandeja del sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Ancho de banda de envío (en kB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Ancho de banda de descarga (en kB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Carpetas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Carpeta en la que guardar los ficheros temporales:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Mover las descargas finalizadas a:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Guardar &automáticamente las descargas en:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Copiar los ficheros .torrent a:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barra de descargas"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Establecer los límites de velocidad para el torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Tasa máxima de envío:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Tasa máxima de descarga:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "kB/s (0 = sin límite)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Añadir un compañero potencial"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP del compañero:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Puerto:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Introduzca la IP y puerto del compañero."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Lista negra de KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Nota: la lista negra sólo se aplica a la sesión actual. Use guardar/abrir para "
+"guardar sus entradas o use el complemento de filtro IP (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Compañeros prohibidos"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Dirección IP del compañero"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Añadir un compañero:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Añade un compañero a la lista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Elimina el compañero seleccionado de la lista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Limpiar"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Limpia esta lista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Gu&ardar como..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Guardar esta lista negra para usarla con el complemento de filtro de IP de "
+"KTorrent"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Número máximo de descargas:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Número máximo de semillas:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Iniciar la descarga con poco espacio en disco:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Espacio mínimo en disco:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "No iniciar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Preguntar siempre"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Forzar el inicio"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 = sin límite)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Tasa máxima de descarga:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Límite global de conexiones:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Tiempo máximo de siembra:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Número máximo de conexiones por torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Número de bloques de envío:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Puerto UDP del sistema de localización:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Proporción máxima de compartición:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Tasa máxima de envío:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "kB/s (0 = sin límite)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Horas (0 = sin límite)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Seguir haciendo de semilla después de que la descarga haya terminado"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Atención"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Los puertos de arriba deben ser redireccionados si se encuentra detrás de un "
+"encaminador. El complemento de UPnP puede hacerlo por usted."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Ventana de cola de KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Estado:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Sistema de localización:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Proporción de compartición:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Bytes restantes:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Controlado por"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Envío&s"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Enviado:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "&Subir"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "&Bajar"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Mover arriba del todo"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Mover a&bajo del todo"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Controlado por el &GC"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Controlado por el &usuario"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Pegar URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&Aceptar"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "C&ancelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Crear torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "El fichero o carpeta del que quiere crear un torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Debe añadir al menos un localizador o nodo."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opciones del fichero"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Tamaño de cada bloque:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "kB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Empezar a &sembrar el torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Descentrali&zado (sólo DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Torrent privado (no se permite DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Comentarios:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Crear"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Ca&ncelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Sistemas de localización"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Nodos DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Nodo:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP o nombre de máquina"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Puerto"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"NOTA: Ya hay insertados algunos buenos nodos DHT. Probablemente debería "
+"insertar su propia dirección IP y puerto si piensa sembrar este torrent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Preferencias avanzadas"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Algoritmo de KTorrent:</b> Algoritmo predefinido que usa una combinación de "
+"otros algoritmos en base a nuestras pruebas."
+"<br>\n"
+"<b>Algoritmo de velocidad actual:</b> El algoritmo más simple - Bytes "
+"restantes/Velocidad actual"
+"<br>\n"
+"<b>Algoritmo de velocidad media global:</b> Bytes restantes/Velocidad media"
+"<br>\n"
+"<b>Algoritmo de ventana de X:</b> TE calculado a partir de X muestras de "
+"velocidad"
+"<br>\n"
+"<b>Algoritmo de media móvil:</b> La velocidad media móvil calculada a partir de "
+"X muestras"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Velocidad actual"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Velocidad media global"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Ventana de X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Media móvil"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(surte efecto tras reiniciar)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Inha&bilitar la reserva previa de espacio en disco"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Preasignar &totalmente el espacio en disco (evita la fragmentación)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Básico (lento)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Específico del sistema de ficheros"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Rendimiento"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Uso de la memoria:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Baja"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Media"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Alta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Intervalo de actualización de la interfaz:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "CPU rápida"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "CPU lenta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Verificación de datos"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Durante el envío, &no volver a verificar los bloques mayores de"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Realizar una verificación de &integridad de datos tras"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "bloques dañados"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Red"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Número máximo de configuraciones de conexión:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP para paquetes IP:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+"No usar las preferencias del «prox&y» de KDE para las conexiones HTTP al "
+"localizador"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Proxy HTTP al localizador:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Analizando los datos"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Analizando los datos del torrent:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Número de bloques encontrado:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Número de bloques fallidos/no descargados:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Probar"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Número máximo de descargas (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Número máximo de semillas (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "¿Iniciar las descargar si hay poco espacio en disco?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Número máximo de conexiones por torrent (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Número máximo de conexiones para todos los torrents (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Velocidad máxima de subida en kB/s (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Velocidad máxima de descarga en kB/s (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Proporción máxima de compartición (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Tiempo máximo de siembra en horas (0 = sin límite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Mostrar un icono en la bandeja del sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Mostrar la barra de velocidad en la bandeja del sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Ancho de banda de descarga (en kB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Ancho de banda de envío (en kB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Mostrar un mensaje emergente cuando finalice un torrent."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Seguir haciendo de semilla cuando la descarga ha terminado"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Carpeta donde guardar los ficheros temporales"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Se debe grabar automáticamente las descargas en la carpeta de grabación"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Carpeta en la que guardar los ficheros descargados"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Se deben mover automáticamente las descargas finalizadas a completedDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Carpeta a la que mover los ficheros totalmente descargados"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Se deben copiar automáticamente los ficheros .torrent a torrentCopyDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Carpeta a la que copiar los ficheros .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Se debe pasar una IP personalizada al localizador"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Último directorio usado como directorio de grabación"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP a pasar al localizador"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Utilización de la memoria"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Intervalo de actualización de la interfaz"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Soporte para DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Puerto DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Número de bloques de envío"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Columnas mostradas en KTorrentView"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algoritmo de ET"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Si no queda espacio para terminar la descarga y el espacio libre en disco es "
+"menor que minDiskSpace, el torrent se detendrá."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Gestor de complementos"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Cargar"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Descargar"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "C&argar todo"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Descargar todo"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Dispositivo UPnP a usar por omisión"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Dispositivos detectados:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Dispositivo"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Puertos redireccionados"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Conexión WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Redireccion&ar los puertos"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Deshacer la redirección de puertos"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Explorar de nuevo"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "¿Habilitar el análisis de la carpeta1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "¿Habilitar el análisis de la carpeta2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "¿Habilitar el análisis de la carpeta3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Ruta de la carpeta1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Ruta de la carpeta2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Ruta de la carpeta3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Si desea abrir el torrent de forma silenciosa o no."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Marcada la acción de borrado."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Marcada la acción de movimiento."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Preferencias de la búsqueda de carpetas"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Buscar la carpeta &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Buscar la carpeta &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Buscar la carpeta &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Mover al directorio «loaded» tr&as la carga"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Mover el torrent al directorio «loaded» después de cargarlo"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Abrir los torrents &silenciosamente"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "No mostrar la ventana «Seleccionar los ficheros a descargar»"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Borrar tras la &carga"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Borra el torrent después de la carga"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Carpetas a buscar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Carpeta 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Carpeta 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Carpeta 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Preferencias de búsqueda"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Servidor web"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Puerto de redirección"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL de la sesión (en s):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Seleccionar la interfaz:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Usuario:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Cambiar la contraseña..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Ruta del ejecutable «php»:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Número del puerto"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Puerto de redirección"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Tiempo de vida de la sesión"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Piel de la interfaz"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Ruta del ejecutable «php»"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "usuario"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "contraseña"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Bloques"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Total:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Descargando actualmente:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Descargado:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Excluido:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Queda:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Tamaño:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Bloque"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Progreso"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Compañero"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Compañeros asignados"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Sembradores:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Sanguijuelas:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Velocidad media de descarga:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Velocidad media de envío:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Siguiente actualización en:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Estado del localizador:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Partes del torrent que han sido descargadas:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Partes del torrent que están disponibles:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Compartido"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Su envío se detendrá cuando la proporción de compartición alcance este valor. "
+"Cero significa sin límite."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Su envío se detendrá cuando haya estado enviando durante esta cantidad de "
+"horas."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Horas"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Límite de proporciones:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "El límite sólo funciona en el modo semilla"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Límite de tiempo:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Act&ualizar el localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Intervalo mínimo de actualización - 60 segundos"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Añadir un lo&calizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Eliminar el localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "C&ambiar el localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Restaurar los valores predefinidos"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Mostrar la solapa de compañeros en la ventana principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Mostrar la solapa de bloques descargados en la ventana principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Mostrar la solapa de localizadores en la ventana principal"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Mostrar lista de compañeros"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Mostrar la lista de bloques descargándose &actualmente"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Mostrar lista de localizadores"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Preferencias de bloqueo de IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Seleccione el fichero del filtro de PeerGuardian "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "¿Usar el filtro de PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Fichero de filtro de IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "&Descargar/Convertir"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Descargue el filtro PeerGuardian de bluetack.co.uk o blocklist.org.\n"
+"NOTA: Se admite el fichero ZIP de bluetack.co.uk."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL del filtro de nivel 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "¿Usar el filtro de nivel 1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Convirtiendo..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Pulse el botón «convertir» para comenzar la conversión del fichero antip2p. "
+"NOTA: Este proceso podría llevar algún tiempo, incluso en máquinas rápidas, y "
+"durante ese tiempo no podrá usar KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Actualizar"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Actualizar las gráficas cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Actualizaciones de la interfaz"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Recoger datos cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisegundos"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Máximo"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Modo de escala de la velocidad máxima:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Exacta"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Consulte «¿Qué es esto?» para obtener ayuda"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Establecer el valor máximo en la escala OY como:\n"
+"- Tope: La velocidad máxima alcanzada a nivel global\n"
+"- Exacta: La velocidad máxima alcanzada visible en la gráfica"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Velocidad de los compañeros"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Velocidad de los compañeros:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "actualizar cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "actualizaciones de los datos de la gráfica"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"La recogida de datos de muchos compañeros conectados puede consumir bastante "
+"CPU."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Conexiones de compañeros"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+"Unos valores muy grandes pueden oscurecer las gráficas de los compañeros "
+"conectados"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Mostrar los sembradores en enjambres"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Mostrar las sanguijuelas en enjambres"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Cuenta de mediciones"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Envío"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Conexiones"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Compañeros"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Conmutar las gráficas de velocidad de los compañeros"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Intervalo de obtención de datos de la velocidad de los compañeros"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Conmutar el dibujo de sanguijuelas en enjambres"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Conmutar el dibujo de sembradores en enjambres"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Cuenta de mediciones de descarga"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Cuenta de mediciones de velocidades de los compañeros"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Cuenta de mediciones de envío"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Cuenta de mediciones de conexión"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Cuenta de mediciones de DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Modo de los máximos del eje OY"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importar una descarga existente"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Datos:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Indique el torrent y los datos ya descargados de ese torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importar"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "por omisión"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Fuentes RSS"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Fuentes"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Borrar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nuevo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artículos"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Actualiza&r automáticamente"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnorar el TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Actualizar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Título"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Mantener los artículos (días)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Activo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Aceptar los filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Rechazar los filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Expresiones regulares"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Tratar como &serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Proceso"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Criterio de la serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Coincidencia sin episodio"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Episodio mínimo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Temporada máxima"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Temporada mínima"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Episodio mínimo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Probar el te&xto"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Probar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Coincidencias del filtro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Planificador del ancho de banda"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Categoría del botón izquierdo"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "&Categoría 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Desconectar"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Categoría &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Categoría &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Categoría del botón derecho"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Categoría &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Categoría 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Categorías"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Categoría</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Categoría</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "descarga:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "envío:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "kB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Categoría</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* el cero significa ilimitado"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Guardar en un fichero"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Cargar de un fichero"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Reiniciar la planificación"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&Aceptar"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Página de preferencias del complemento de planificación"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "¿Usar el planificador del ancho de &banda?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Planificador del ancho de banda"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "¿Usar colores en vez de &imágenes?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Recomendado para los sistemas más lentos)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Editar la planifi&cación"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "¿Habilitar el planificador del ancho de banda?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "¿Usar colores en vez de imágenes?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Usar texto enriquecido en el registro"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Señal de mensajes de información general"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Señal de mensajes de conexión"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Señal de mensajes DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Señal de mensajes de información del localizador"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Señal de mensajes de información de E/S del disco"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Señal de mensajes del complemento IPfilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Señal de mensajes del complemento de búsqueda"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Señal de mensajes del complemento PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Señal de mensajes del complemento InfoWidget"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Señal de mensajes del complemento de UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Señal de mensajes del complemento de carpeta de búsquedas"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Señal de mensajes del complemento de planificación"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Señal de los mensajes del complemento de RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Señal de los mensajes del complemento de la interfaz web"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Opciones del visualizador del registro"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Complementos"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Todo"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Depuración"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Aviso"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Importante"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Ninguno"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "Filtro de IP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Buscar:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Carpeta de búsquedas:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Planificador:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Complemento de RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Complemento de la interfaz web:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistema"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "General:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Conexiones:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "E/S de disco:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Usar te&xto enriquecido en el registro"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Navegador externo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Abrir las búsquedas en un navegador externo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Usar el navegador predefinido"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Ruta al navegador personalizado:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Motores de búsqueda"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Nombre del motor de búsqueda:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Añadir"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Motores"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Eliminar todo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Añadir &predeterminado"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Actualizar por Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Buscar"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Motor de búsqueda:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Motor de búsqueda actual"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Usar un navegador personalizado"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Ruta del ejecutable del navegador personalizado"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 kB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 kB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 día\n"
+"%n días"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Sí, primero"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Sí, último"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "No se puede abrir el fichero de registro %1: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "No se puede escribir en %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "No se puede leer de %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "No se puede crear el directorio %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "No se puede crear el enlace simbólico de %1 a %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "No se puede mover %1 a %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "No se puede copiar %1 a %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "No se puede borrar %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "No se puede crear %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "No se puede calcular el tamaño del fichero %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "No se puede calcular el tamaño del fichero: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "No se puede abrir %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "No se puede expandir el fichero: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "No se puede expandir el fichero"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "No se puede buscar en el fichero: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "No se puede escribir más allá del final del búfer mmap."
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Estado: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Cargado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "No cargado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opciones del complemento"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "No se puede abrir el fichero %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "El directorio %1 no existe"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Elemento no válido: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Error de decodificación"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Fin de entrada inesperado"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "No se puede convertir %1 a un entero"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "El torrent está incompleto."
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrent dañado."
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "El torrent no tiene un campo de anuncio o de nodos"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " No se puede abrir el fichero torrent %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Error de análisis sintáctico"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Se ha producido un error mientras se descargaba el torrent. Probablemente el "
+"torrent esté dañado, o no sea realmente un fichero torrent.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Se ha producido un error mientras se descargaba el torrent. Probablemente el "
+"torrent esté dañado, o no sea realmente un fichero torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "No se ha podido crear %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Ya está descargando este torrent %1, la lista de localizadores de ambos "
+"torrents ha sido fusionada."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Ya está descargando el torrent %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "No se puede migrar %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"El torrent %1 fue iniciado con una versión anterior de KTorrent. Para "
+"garantizar que este torrent siga funcionando con esta versión de KTorrent, será "
+"migrado. Se le pedirá una ubicación en la que guardar el torrent. Si pulsa "
+"Cancelar, se seleccionará su carpeta de inicio."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Seleccione la carpeta en la que guardar"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "No comenzado"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Sembrando"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Descargando"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Estancado"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Detenido"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Error: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Asignando espacio en disco"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "En cola"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Verificando los datos"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Detenido. No queda espacio en el dispositivo."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"No tiene suficiente espacio en disco para descargar este torrent. ¿Seguro que "
+"desea continuar?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Espacio en disco insuficiente para %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Este torrent «%1» ha alcanzado su proporción de compartición máxima. ¿Desea "
+"ignorar el limite y comenzar a sembrar de todas formas?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Se ha alcanzado el límite de proporción de compartición."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Error al detener el torrent %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Error al iniciar el torrent %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Anunciando"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Cliente desconocido"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 compañero\n"
+"%n compañeros"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "No se puede crear el fichero %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "No se ha podido escribir el primer bloque en el fichero DND: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "No se ha podido escribir el último bloque en el fichero DND: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "No se puede escribir en %1: sistema de ficheros de sólo lectura"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "No se puede expandir el fichero %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "No se puede expandir el fichero %1: escritura incompleta"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "No se puede expandir el fichero %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Error: Al leer tras el fin del fichero %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Error al leer de %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Error al escribir en %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Error al escribir en %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "No se puede preasignar espacio en disco: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+"No se puede conectar al puerto UDP %1 ni a los diez puertos siguientes."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Respuesta no válida del localizador"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Datos no válidos del localizador"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "URL no válido del localizador"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "No se puede abrir el fichero %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "No se puede crear el fichero índice: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "No se puede abrir el fichero: %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Usa UPnP para redireccionar automáticamente puertos de su router"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"No se puede encontrar el servicio de redireccionamiento de puertos en la "
+"descripción del dispositivo."
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Dispositivos UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Busca automáticamente ficheros torrent en los directorios y los carga."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Carpeta de búsquedas"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Carpeta de búsquedas"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opciones de la carpeta de búsquedas"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "cargado"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Carpeta de búsquedas - Carpeta %1: URL no válido o la carpeta no existe. Escoja "
+"un directorio válido."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Interfaz web"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Opciones de la interfaz web"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"El ejecutable «php» no está en la ruta predeterminada, introduzca la ruta a "
+"mano"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Introduzca una nueva contraseña para la interfaz web."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 existe y es ejecutable"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 no existe"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 no es ejecutable"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 es un directorio"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 no es la ruta al ejecutable «php»"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Interfaz web"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Permitir controlar ktorrent mediante un navegador"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Descargar primero"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Descargar normalmente"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Descargar al final"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Borrar los ficheros"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Disponible"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Pendiente"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Perderá todos los datos de este fichero, ¿seguro que desea hacer esto?\n"
+"Perderá todos los datos de estos ficheros, ¿seguro que desea hacer esto?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Sin límite"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Ventana de información"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Muestra información adicional sobre una descarga, como que bloques han sido "
+"descargados, cuantos sembradores y sanguijuelas..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "No se puede añadir un localizador a un torrent privado."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "No se puede eliminar el localizador predeterminado."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "No puede añadir localizadores a un torrent privado"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "País"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Cliente"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Obstruido"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Desdeñado"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Disponibilidad"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Puntuación"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Bloque de envío"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Peticiones"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Expulsar al compañero"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Prohibir al compañero"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Bloques disponibles"
+"<br><img src=\"unavailable_color\">&nbsp; - Bloques no disponibles"
+"<br><img src=\"excluded_color\">&nbsp; - Bloques excluidos"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opciones de la ventana de información"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Bloques descargados"
+"<br><img src=\"unavailable_color\">&nbsp; - Bloques a descargar"
+"<br><img src=\"excluded_color\">&nbsp; - Bloques excluidos"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Convertir"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Cargando fichero TXT..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Por favor, espere..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "El fichero ha sido convertido."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "No se ha podido cargar el filtro:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"El fichero de filtro no es válido. Puede estar dañado o tener un formato no "
+"válido."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtra los peers indeseados basándose en su dirección IP"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "Filtro de IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Estado: Cargado y en ejecución."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Estado: No cargado."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Estado: <font color=\"#ff0000\">No se ha encontrado el fichero de filtro.</font> "
+"Descargue y convierta el fichero del filtro."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "El fichero seleccionado ya existe, ¿desea descargarlo de nuevo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "El fichero existe"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"El fichero del filtro (level1.dat) ya existe, ¿desea convertirlo de nuevo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtro de bloqueo de IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opciones del filtro de bloqueo de IP"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Estadísticas"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Opciones de las estadísticas"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Sanguijuelas conectadas"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Sanguijuelas en enjambres"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Sembradores conectados"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Sembradores en enjambres"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Media de sanguijuelas conectadas por torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Media de sembradores conectados por torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Media de sanguijuelas conectadas por torrent en ejecución"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Media de sembradores conectados por torrent en ejecución"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Nodos"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Tareas"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Muestra las estadísticas de las transferencias"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Estadísticas de velocidad"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Estadísticas de conexión"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Actual"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Media"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Límite"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Media de la sanguijuela"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Media a la sanguijuela"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Media del sembrador"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "De las sanguijuelas"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "De los sembradores"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Leyenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Ficheros torrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Todos los ficheros"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "No se pueden verificar los datos: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "No se puede cargar el fichero torrent: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importa torrents descargados parcial o totalmente desde otros clientes"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importar una descarga existente"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL de la fuente"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Analiza automáticamente las fuentes RSS buscando expresiones regulares que "
+"coincidan con torrents, y los carga."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Fuentes RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Fallo al buscar y descargar un torrent válido para %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Título"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Descripción"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Enlace"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Temporada"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episodio"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tiempo"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Planificador"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opciones del complemento de planificación"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "LUN"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "MAR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "MIÉ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "JUE"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "VIE"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SÁB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "DOM"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Planificación guardada."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "El fichero no ha sido encontrado."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Planificación cargada."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Complemento de planificación del ancho de banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Abrir el planificador del ancho de banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"El planificador del ancho de banda está inhabilitado. Vaya a Preferencias -> "
+"Planificador para habilitarlo."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Visualizador del registro"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Visualizador del registro"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Muestra la salida del registro de KTorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Utilice su navegador web para buscar la cadena %1 (en mayúsculas) en el motor "
+"de búsqueda que quiera añadir. "
+"<br>Cuando haya finalizado la búsqueda, copie el URL de la barra de dirección, "
+"y péguelo aquí."
+"<br>"
+"<br>Por ejemplo, buscar %1 en Google producirá "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br>Si añade este URL aquí, KTorrent puede buscar usando Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Utilice su navegador web para buscar la cadena %1 (en mayúsculas) en el motor "
+"de búsqueda que desee añadir. Utilice abajo el URL resultante."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Debe introducir el nombre y URL del motor de búsqueda"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Ya existe un motor de búsqueda con el mismo nombre. Utilice un nombre "
+"diferente."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"URL incorrecto. Debe buscar FOOBAR con su navegador web y copiar/pegar el URL "
+"exacto aquí."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Búsqueda"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opciones del motor de búsqueda"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Buscando %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "ficheros torrent"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Búsqueda finalizada"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Motor: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Busca torrents en varios motores de búsqueda de torrents populares"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "¿Desea descargar o guardar el torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Descargar el torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Descargar"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Encontrar compañeros ejecutando ktorrent en la red local con los que compartir "
+"torrents"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algoritmo de ETA:"
diff --git a/translations/et/Makefile.am b/translations/et/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/et/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/et/messages/Makefile.am b/translations/et/messages/Makefile.am
new file mode 100644
index 0000000..21009b2
--- /dev/null
+++ b/translations/et/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = et
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/et/messages/ktorrent.po b/translations/et/messages/ktorrent.po
new file mode 100644
index 0000000..c43ee72
--- /dev/null
+++ b/translations/et/messages/ktorrent.po
@@ -0,0 +1,4892 @@
+# translation of ktorrent.po to Estonian
+# translation of ktorrent.po to
+#
+# Marek Laane <bald@starman.ee>, 2005-2008.
+# Hasso Tepper <hasso@kde.org>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-03-23 22:27+0300\n"
+"Last-Translator: Marek Laane <bald@starman.ee>\n"
+"Language-Team: Estonian <kde-et@linux.ee>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Sisenevaid ühendusi pole (tulemüüri taga?)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Info"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Aktiivse seansi ajal ülekantud andmed"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Kõigi torrentide kiirus kokku"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupid"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Alusta"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Peata"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Alusta kõiki"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Peata kõik"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Aseta torrenti URL..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Ava järjekorrahaldur..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Järjekorda/järjekorrast ära"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP filter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Andmeühtluse kontroll"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Määra maks. üleslaadimise kiirus"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Määra maks. allalaadimise kiirus"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent-failid"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Kõik failid"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Asukoha avamine"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Kiirus alla: %1 / üles: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Andmeid liigutatud alla: %1 / üles: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 sõlme, %2 ülesannet"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: väljas"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Kõik torrentid"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Otsing:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Tõstutundlik"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Liiguta vasakusse dokki"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Liiguta paremasse dokki"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Liiguta alumisse dokki"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Omista kiirklahv..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Eemalda kiirklahv"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Nupu numbri muutmine"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Uus kiirklahvi number:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"IP tuleb sisestada kujul 'XXX.XXX.XXX.XXX'. Vahemike jaoks võib kasutada ka "
+"metamärke, näiteks '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Faili valimine"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Salvestatava faili nime valimine"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Vigane URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Allalaadimised"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Üleslaadimised"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Määratud port (%1) ei ole kättesaadav või kasutab seda mõni muu rakendus. "
+"KTorrent seotakse pordiga %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent ei saa ühendusi vastu võtta, sest porte %1 kuni %2 kasutab juba mingi "
+"muu rakendus."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Torrenti loomine ebaõnnestus: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Mõned torrenti \"%1\" andmefailid on puudu. Kas soovid need uuesti luua või ei "
+"tahagi sa neid alla laadida?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Loo uuesti"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Ära laadi alla"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Puuduvate failide taasloomine ebaõnnestus: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Andmefailid puuduvad"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Puuduvate failide valiku tühistamine ebaõnnestus: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Fail, kuhu on salvestatud torrenti \"%1\" andmed, puudub. Kas soovid selle "
+"uuesti luua?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Ära loo uuesti"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Andmefaili taasloomine ebaõnnestus: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Andmefail puudub"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Andmeühtluse kontroll"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "∞"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Viga andmete uurimisel: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "<b>%1</b> andmete uurimine: "
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "KDE BitTorrenti programm"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Silumisrežiim"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr "URL-iga määratud torrenti vaikimisi salvestamine"
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Avatav dokument"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS-plugin"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Veebiliidese plugin"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statistikaplugin"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Rakenduse ikoon ja veel mitu ikooni"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Allalaadimiste ikoon"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 rakenduse ikoon"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Tükiriba kohtspikrid ja IWFileTreeItemi sortimine"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Infoplugina asukohalokaator (sisaldab MaxMindi loodud GeoLite andmeid, mille "
+"leiab aadressilt http://www.maxmind.com/)."
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Riigilipud"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Faili prioriteet"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Meie UPnP teostuse näites on kasutusel miniupnp"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Globaalse maks. jagamise suhte paik"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconfi täiendused"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilki veebivälimus"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "KDevelopi IDEAl kood"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Teisenduse kiiruse parandamine IP filtri pluginas"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Kahe turvaprobleemi avastamine (mõlemad on parandatud)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Paik vaikimisi laadimiseks salvestatud asukohaga"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Parandused veebiliidese PHP koodis"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS-i spetsiifiline ketta eeleraldamine"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Väga väikese kiiruse mittenäitamise paik"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Võimaliku tulemüüri näitamise paik"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Mitu paika"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Menüüriba peitmise paik"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Failiprioriteetide muutmise paik veebiliideses"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Mitu veebiliidese paika"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Filtririba paik"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Lõimedeta failivaate uuendamise paik"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "SHA1 räsi genereerimise optimeerimine"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Paik vaba kettaruumi arvutamise parandamiseks FreeBSD-s"
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr "Paik torrentide vaikimisi laadimiseks käsurealt"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Valida tuleb fail või kataloog."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "Sa ei ole tracker'it lisanud. Kas tõesti soovid luua selle torrenti?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Lisada tuleb vähemalt üks sõlm."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrenti failid (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Torrentina salvestatava faili valimine"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "%1 loomine.."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Kohandatud grupid"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Uus grupp"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Muuda nime"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Eemalda grupp"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Ava kaart"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Palun sisesta grupi nimi."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Grupp %1 on juba olemas."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Palun sisesta grupi uus nimi."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktiivsed üleslaadimised"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Järjekorras üleslaadimised"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Järjekorras allalaadimised"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Kasutaja allalaadimised"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Kasutaja üleslaadimised"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Mitteaktiivsed torrentid"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Mitteaktiivsed allalaadimised"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Mitteaktiivsed üleslaadimised"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktiivsed torrentid"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktiivsed allalaadimised"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Eemalda torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Eemalda torrent ja andmed"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Lisa masinaid"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Täiendavad lähtemasinad"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Torrenti lähtemasinad:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Lähtemasina vahetus"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Käsitsi teatamine"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Eelvaatlus"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Ava kataloog"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Andmekataloog"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Ajutine kataloog"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Määra allalaadimiste asukoht"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Eemalda grupist"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Lisa gruppi"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Kiiruse piirangud"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"Torrentit ei ole olemas. Palun anna veast teada KTorrenti arendajatele."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Võimalik masin lisatud."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Vigane IP-aadress."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Seadistused"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Allalaadimisvalikud"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT port peab erinema tracker'i UDP pordist!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Üldine"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Üldised valikud"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"%1 otsing ebaõnnestus: %2\n"
+"Palun määra korrektne IP-aadress või masinanimi."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Muud"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Muud valikud"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Nähtavad veerud"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Olek"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Allalaaditud"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Suurus"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Üleslaaditud"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Tõmbamiskiirus"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Saatmiskiirus"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Aega jäänud"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Levitajad"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Tõmbajad"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% valmis"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Jagamissuhe"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Allalaadimise aeg"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Levitamise aeg"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Kõik torrentid %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Ei saa alustada enam kui 1 allalaadimist \n"
+"Ei saa alustada enam kui %n allalaadimist "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"ja 1 levitamist. \n"
+"ja %n levitamist. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Kui soovid piiranguid muuta, vali Seadistused -> KTorrenti seadistamine."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Torrent %1 ei ole allalaadimist lõpetanud. Kas kustutada ka ebatäielikud "
+"andmed?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Allalaadimise eemaldamine"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Kustuta andmed"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Säilita andmed"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Kaotad kõik alla laaditud andmed. Kas tõesti soovid seda?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Sa juba kontrollid torrenti %1 andmeid!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Vali %1 allalaadimise asukoht"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Oled eemaldanud valikust järgmised olemasolevad failid. Sa kaotad kogu nendes "
+"failides leiduva info. Kas tõesti soovid seda?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Jah, kustuta failid"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Ei, säilita failid"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " lühike!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Kasutaja"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Järjekorrahaldur"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Ei (eratorrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Kiirus:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Allalaadimine: <font color='#1c9a1c'>%1</font></td>"
+"<td>Üleslaadimine: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Ülekanne:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Allalaadimine: <font color='#1c9a1c'>%3</font></td>"
+"<td>Üleslaadimine: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> lõpetas allalaadimise."
+"<br>Keskmine kiirus: %2 alla / %3 üles."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Allalaadimine valmis"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> saavutas maksimaalne jagamissuhte %2 ja peatati."
+"<br>Laaditi üles %3 keskmise kiirusega %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Levitamine valmis"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> saavutas maksimaalne levitamisaja %2 tundi ja peatati."
+"<br>Laaditi üles %3 keskmise kiirusega %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> peatati järgmise veaga: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Torrentis <b>%1</b> leiti vigaseid andmeid"
+"<br>Vahest tasuks kontrollida torrenti andmete terviklikkust."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> saavutas maksimaalne jagamissuhte %2 ja seda ei saa järjekorda seada. "
+"Kui soovid seda edasi jagada, eemalda piirang."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> saavutas maksimaalne levitamisaja %2 tundi ja seda ei saa järjekorda "
+"seada. Kui soovid seda edasi jagada, eemalda piirang."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torrentit ei saa järjekorda seada."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "<b>%1</b> alustamine nurjus: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Ei saa levitada enam kui 1 torrentit. "
+"<br>\n"
+"Ei saa levitada enam kui %n torrentit. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Ei saa alla laadida enam kui 1 torrentit. "
+"<br>\n"
+"Ei saa alla laadida enam kui %n torrentit. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Torrenti alustamine nurjus"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Kettaruumi napib."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "Kettal pole enam ruumi.<br /><b>%1</b> laaditakse alla asukohta '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent on peatatud.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Seadmel napib ruumi"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Kiiruse piirang KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Piiramatu"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "<b>%1</b> kiiruse piirangud:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE KPart rakendus"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Indeksifaili %1 avamine ebaõnnestus: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Marek Laane"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "bald@starman.ee"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Allalaaditavate failide valimine"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Allalaadimise asukoht:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupp:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "&Kontrollib kasutaja"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Alusta torrentit"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Allalaadimine"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "V&ali kõik"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Ä&ra vali midagi"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Valik teistpidi"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Kettaruum"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Vajalik kettaruum:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Vaba kettaruum:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Pärast allalaadimist:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Krüptimine"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Krüptimise kasutamine"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Protokolli krüptimist kasutatakse selleks, et ISP ei aeglustaks bittorrenti "
+"ühendusi."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Krüptimata ühenduste lubamine"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Märkimata jätmisel saab ühendust luua ainult krüptimist toetavate klientidega."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Hajusräsitabeli (<b>D</b>istributed <b>H</b>ash <b>T</b>able) protokoll."
+"<br>Detsentraliseeritud masinate infovahetuse protokoll. Lähemalt räägib "
+"sellest käsiraamat."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "DHT kas&utamine lisamasinate hankimiseks"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP port DHT suhtluseks:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Kohandatud IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Tracker'isse saadetakse koha&ndatud IP või masinanimi"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Kohandatud IP või masinanimi:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Süsteemse salve ikoon"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Ikoon &süsteemses salves"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Kiiruseri&ba näitamine süsteemses salves"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Süsteemse salve hüpikteadete näitamine"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Üleslaadimise ribalaius (KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Allalaadimise ribalaius (KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Kataloogid"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Ajutiste failide salvestamise kataloog:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Lõpetatud allalaadimised liigutatakse asukohta:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Allalaadimised salvestatakse automaatselt kataloogi:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr ".torrent-failid kopeeritakse asukohta:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Allalaadimisriba"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Torrenti kiirusepiirangute määramine"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maks. üleslaadimise kiirus:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maks. allalaadimise kiirus:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 tähendab piirangu puudumist)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Võimaliku masina lisamine"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Masina IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Sisesta masina IP ja port."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrenti must nimekiri"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Märkus: must nimekiri käib ainult aktiivse seansi kihta. Kirjete salvestamiseks "
+"salvesta nimekiri või kasuta IP filtri pluginat."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Keelatud masinad"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Masina IP aadress"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Masina lisamine:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Lisab masina musta nimekirja"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Eemaldab valitud masina mustast nimekirjast"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Puhasta"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Puhastab nimekirja"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "&Salvesta kui..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Salvestab musta nimekirja, et KTorrenti IP filtri plugin saaks seda kasutada"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maks. allalaaditavate torrentite arv:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maks. levitatavate torrentite arv:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Allalaadimise alustamine napi kettaruumi korral: "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimaalne kettaruum:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Ei alustata"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Alati küsitakse"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Alati alustatakse"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 tähendab piirangu puudumist)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maks. allalaadimise kiirus:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Globaalne ühenduste piirang:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Maks. levitamisaeg:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maks. ühenduste arv torrenti kohta:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Üleslaadimispesade arv:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Tracker'i UDP port:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maks. üles- ja allalaadimise suhe:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maks. üleslaadimise kiirus:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/sek (0 tähendab piirangu puudumist)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "tundi (0 tähendab piirangu puudumist)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Pärast allalaadimise lõpetamist jätkatakse torrenti levitamist"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Tähelepanu"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Ülaltoodud pordid tuleb ka siis edasi suunata, kui oled ruuteri taga. Seda võib "
+"sinu eest teha UPnP plugin."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KTorrenti tööjärjekorra dialoog"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Olek:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Üles- ja allalaadimise suhe:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Baite jäänud:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Kontrollija"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Üle&slaadimised"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Üleslaaditud:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "L&iiguta üles"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Lii&guta alla"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Liiguta ette"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Liiguta ta&ha"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Kontrollib &järjekorrahaldur"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "&Kontrollib kasutaja"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "URL-i asetamine"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Loobu"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Torrenti loomine"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Fail või kataloog, millest torrentit luua soovid:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Lisada tuleb vähemalt üks tracker või sõlm."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Failivalikud"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Tükkide suurus:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Alusta torrenti le&vitamist"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "&Detsentraliseeritud (ainult DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privaattorrent (DHT pole lubatud)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Kommentaarid:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Loo"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Katkesta"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Tracker'id"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT sõlmed"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Sõlm:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP või masinanimi"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"MÄRKUS: mõned teadaolevalt head DHT sõlmed on juba lisatud. Kui kavatsed seda "
+"torrentit levitada, tuleb tõenäoliselt lisada ka enda IP-aadress ja port."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Muud seadistused"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr "Kuluva aja hindamise algoritm:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrenti algoritm:</b> vaikealgoritm, mida kasutatakse koos teiste "
+"algoritmidega vastavalt meie testidele."
+"<br>\n"
+"<b>Praeguse kiiruse algoritm:</b> lihtsaim algoritm - baite jäänud/praegune "
+"kiirus"
+"<br>\n"
+"<b>Globaalse keskmise kiiruse algoritm:</b> baite jäänud/keskmine kiirus"
+"<br>\n"
+"<b>X-akna algoritm:</b> hinnangulise aja arvutus X'i kiiruse näidete põhjal"
+"<br>\n"
+"<b>Liigutamise keskmise algoritm:</b> liigutamise keskmise kiiruse arvutus X'i "
+"näidete põhjal"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Praegune kiirus"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Globaalne keskmine kiirus"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "X-aken"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Liigutamise keskmine"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(rakendub pärast taaskäivitamist)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Ketta&ruumi eeleraldamise keelamine"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Kettar&uumi täielik eeleraldamine (väldib defragmenteerumist)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Elementaarne (aeglane)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Failisüsteemile omane"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Jõudlus"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Mälukasutus:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Väike"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Keskmine"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Suur"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Kasutajaliidese uuendamise intervall:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 msek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 sek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 sek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 sek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Kiire protsessor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Aeglane protsessor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Andmete kontroll"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Üleslaadimisel ei ko&ntrollita üle suuremaid tükke kui"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "A&ndmete terviklikkust kontrollitakse pärast"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "vigaseid tükke"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Võrk"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Ühenduste maksimaalne arv:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "IP-pakettide DSCP:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "&HTTP-tracker'i ühendusteks ei kasutata KDE puhverserverit"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP puhverserver tracker'itele:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Andmete uurimine"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Torrenti andmete uurimine: "
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Leitud tükkide arv: "
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Ebaõnnestunud/allalaadimata tükkide arv: "
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Allalaadimiste maksimaalne arv (0 = piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Levitamiste maksimaalne arv (0 = piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Kas alustada allalaadimist napi kettaruumi korral?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Ühenduste maksimaalne arv torrenti kohta (0 = piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Ühenduste maksimaalne arv kõigi torrentide kohta (0 = piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Üleslaadimise maksimaalne kiirus KB/sek (0 = piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Allalaadimise maksimaalne kiirus KB/sek (0 = piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maks. jagamissuhe (0=piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maks. levitamisaeg tundides (0=piirang puudub)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Ikoon süsteemses salves"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Kiiruseriba näitamine süsteemses salves"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Allalaadimise ribalaius (KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Üleslaadimise ribalaius (KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Hüpikakna näitamine torrenti lõpetamisel."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Pärast allalaadimise lõpetamist jätkatakse torrenti levitamist"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Ajutiste failide salvestamise kataloog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Kas salvestada allalaadimised automaatselt salvestamiskataloogi"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Allalaaditud failide salvestamise kataloog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Kas salvestada allalaadimised automaatselt lõpetatud allalaadimiste kataloogi"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Lõpetatud allalaaditud failide salvestamise kataloog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Kas salvestada .torrent-failid automaatselt torrentite kataloogi"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr ".torrent-failide salvestamise kataloog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Kas lubada kohandatud IP saatmist tracker'isse"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Kataloog, mida kasutati viimati salvestamiskataloogina"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "Tracker'isse saadetav IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Mälukasutus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "GUI uuendamise intervall"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "DHT toetus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Üleslaadimispesade arv"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "KTorrenti vaates nähtavad veerud"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Ajahinnangu algoritm"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Kui allalaadimise lõpetamiseks pole enam kettaruumi ja vaba kettaruumi on vähem "
+"kui minimaalse kettaruumiga määratud, torrent peatatakse."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Pluginahaldur"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Lülita sisse"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Lüli&ta välja"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Lüli&a kõik sisse"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Lülita &kõik välja"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Vaikimisi kasutatav UPnP seade"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Tuvastatud seadmed:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Seade"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Edasi suunatud pordid"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN-ühendus:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Ed&astamispordid"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Tühista portide edasisuunamine"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Uuri uuesti"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Kas lubada kataloog1 uurimine?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Kas lubada kataloog2 uurimine?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Kas lubada kataloog3 uurimine?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Kataloog1 asukoht"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Kataloog2 asukoht"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Kataloog3 asukoht"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Kas avada torrent vaikselt või mitte."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Kustutamistoiming märgitud."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Liigutamistoiming märgitud."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Kataloogide uurimise seadistused"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Kataloogi &1 uurimine"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Kataloogi &2 uurimine"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Kataloogi &3 uurimine"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Liigut&amine pärast laadimist kataloogi \"laaditud\""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Torrent liigutatakse pärast laadimist kataloogi \"laaditud\""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "To&rrentide avamine vaikselt"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Dialoogi 'Allalaaditavate failide valik' ei näidata"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Kustutami&ne pärast laadimist"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Torrent kustutatakse pärast laadimist"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Uuritavad kataloogid"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Kataloog 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Kataloog 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Kataloog 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Otsingu seadistused"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Veebiserver"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Edastamisport"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Seansi elushoidmise aeg (sek):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Liides:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Kasutajanimi:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Muuda parooli..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "PHP programmi asukoht:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Pordinumber"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Edastamisport"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Seansi elushoidmise aeg"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Liides"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "PHP programmi asukoht"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "Kasutajanimi"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "Parool"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Tükid"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Kokku:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Parajasti allalaaditavad:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Allalaaditud:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Väljajäetavad:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Jäänud:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Suurus:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Tükk"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Edenemine"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Masin"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Määratud masinad"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Levitajad:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Tõmbajad:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Keskmine allalaadimise kiirus:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Keskmine üleslaadimise kiirus:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Järgmine uuendus:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Tracker'i olek:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Juba alla laaditud torrenti osad:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Kättesaadavad torrenti osad:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Jagamine"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Sinu üleslaadimine peatub, kui suhe jõuab selle väärtuseni. Null tähendab "
+"piirangu puudumist."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Sinu üleslaadimine peatub, kui oled laadinud määratud arvu tunde."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "tundi"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Suhte piirang:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Piirang toimib ainult levitamisel"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "A&japiirang"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Uuend&a tracker'it"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Min. uuendamisintervall - 60 sekundit"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Lisa t&racker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Eemalda tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "&Muuda tracker'it"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Vaikeväärtused"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Masinate kaardi näitamine peaaknas"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Tükkide allalaadimise kaardi näitamine peaaknas"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Tracker'ite kaardi näitamine peaaknas"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Masinate nimekirja näitamine"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "&Parajasti allalaaditavate tükkide nimekirja näitamine"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Tracker'ite nimekirja näitamine"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP blokeerimise seadistused"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "PeerGuardiani filtri faili valimine "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "PeerGuardiani filtri kasutamine"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP filtri fail:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Laa&di alla/Teisenda"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Laadi PeerGuardiani filter alla saidilt bluetack.co.uk või blocklist.org.\n"
+"Märkus: toetatud on ka bluetack.co.uk ZIP-fail."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Level1 filtri URL"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Level1 filtri kasutamine"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Teisendamine..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Klõpsa antip2p faili teisendamise alustamiseks nupule 'Teisenda'. MÄRKUS: see "
+"võib võtta tükk aega isegi kiiretel masinatel ning sel ajal ei saa KTorrentit "
+"kasutada."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Uuendamine"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Diagrammide uuendamise intervall"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "GUI uuendamine"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Andmete kogumise intervall"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "msek"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maksimum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Maks. kiiruse skaleerimise režiim:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Täpne"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Vaata lähemalt 'Mis see on?' abi"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Maksimumi määramine 0Y-skaalal:\n"
+"- Tipp: globaalselt võimalik maksimumkiirus\n"
+"- Täpne: diagrammil nähtav maksimaalselt saavutatud kiirus"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Masinate kiirus"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Masinate kiirus:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "uuendamise intervall"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "diagrammiandmete uuendamine"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "Andmete kogumine, kui palju ühendatud masinaid protsessor vastu peab."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Masinate ühendused"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+"Suured väärtused võivad muuta ühendatud masinate diagrammid ebaülevaatlikuks"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Levitajate näitamine"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Tõmbajate näitamine"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Mõõtmiste hulk"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Üleslaadimine"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Ühendused"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Masinad"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Masinate kiiruse diagrammide lülitamine"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Intervall masinate kiiruse andmete hankimise vahel"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Tõmbajate näitamise lülitamine"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Levitajate näitamise lülitamine"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Allalaadimise mõõtmiste hulk"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Masinate kiiruse mõõtmise hulk"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Üleslaadimise mõõtmiste hulk"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Ühenduste mõõtmiste hulk"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "DHT mõõtmiste hulk"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "0Y-telje maksimumi režiim"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Olemasoleva allalaadimise import"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Andmed:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Palun määra torrent ja selle juba allalaaditud andmed."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Impordi"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "vaikimisi"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS-vood"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Uudistevood"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Kustuta"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Uus"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "U&RL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artiklid"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "A&utomaatne uuendamne"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "Elus&hoidmise aega eiratakse"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Uuenda"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Pealkiri"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Artikleid hoitakse alles (päevades)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktiivne"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtrid"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Nõustumine filtritega"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Keeldumine filtritest"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Regulaaravaldised"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Kohtlemine &sarjana"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Töötlemine"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Sarja kriteerium"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Episoodita sobivused"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Maks. episood"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Maks. hooaeg"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Min. hooaeg"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Min. episood"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Te&ksti tekstimine"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&st"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtri sobivus"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Ribalaiuse ajastaja"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Vasakklõpsu kategooria"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kate&gooria 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Väljas"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normaalne"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategooria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategooria &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Paremklõpsu kategooria"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategooria &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategooria 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategooriad"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. kategooria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. kategooria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "allalaadimine:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "üleslaadimine:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. kategooria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 tähendab piirangu puudumist"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Salvesta faili"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "Laa&di failist"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Lähtesta ajastaja"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&OK"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Ajastamisplugina seadistustedialoog"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Ri&balaiuse ajastaja kasutamine"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Ribalaiuse ajastaja"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "&Värvide kasutamine piltide asemel"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Soovitatav aeglasematele masinatele)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Muuta a&jastamist"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Ribalaiuse ajastaja kasutamine"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Värvide kasutamine piltide asemel"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Vormindatud logi kasutamine"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Üldiste teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Ühendusteadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "DHT teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Tracker'i teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Ketta IO-teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "IP filtri plugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Otsimisplugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Osalise faili importimise plugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Infoplugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "UPnP plugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Kataloogide uurimise plugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Ajastamisplugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "RSS-plugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Veebiliidese plugina teadete lipp"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Loginäitaja valikud"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Pluginad"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Kõik"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Silumine"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Märguanne"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Tähtis"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Puudub"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Otsing:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Kataloogi uurimine:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Ajastaja:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Osalise faili import:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Infoplugin:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-plugin:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Veebiliidese plugin:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Süsteem"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Üldine:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Ühendused:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Ketta IO:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "&Vormindatud teksti kasutamine logis"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Väline brauser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Otsin&gutulemused avatakse välises brauseris"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Vaikimisi brauseri kasutamine"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Kohandatud brauseri asukoht:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Otsingumootorid"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Otsingumootori nimi:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "Lis&a"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Mootorid"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Eemalda kõik"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "&Lisa vaikimisi"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Uuenda Internetist"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Otsing"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Otsingumootor:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Aktiivne otsingumootor"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Kohandatud brauseri kasutamine"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Kohandatud brauseri käivitatava faili asukoht"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/sek"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+" 1 päev \n"
+" %n päeva "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Jah, esimene"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Jah, viimane"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Logifaili %1 avamine ebaõnnestus: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "%1 kirjutamine ebaõnnestus: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "%1 lugemine ebaõnnestus"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Kataloogi %1 loomine ebaõnnestus: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Nimeviida %1 -> %2 loomine ebaõnnestus: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "%1 liigutamine asukohta %2 ebaõnnestus: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "%1 kopeerimine asukohta %2 ebaõnnestus: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "%1 kustutamine ebaõnnestus: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Ei õnnestunud luua %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "%1 faili suuruse arvutamine ebaõnnestus: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Faili suuruse arvutamine ebaõnnestus: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "%1 avamine ebaõnnestus: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Avamine ebaõnnestus: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Faili avamine ebaõnnestus"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Otsing failis ebaõnnestus: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Üle mmap-puhvri lõpu ei saa kirjutada!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Olek: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Sisse lülitatud"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Välja lülitatud"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Plugina valikud"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Faili %1 avamine ebaõnnestus: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Kataloogi %1 ei ole olemas"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Vigane märgis: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Dekodeerimise viga"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Ootamatu sisendi lõpp"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "%1 teisendamine täisarvuks ebaõnnestus"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent pole täielik!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Vigane torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrentil puudub teadaande- või sõlmeväli"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Torrent-faili %1 avamine ebaõnnestus: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Parsimisviga"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Torrenti laadimisel tekkis viga. Arvatavasti on torrent vigane või pole see "
+"üldse torrenti fail.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Torrenti laadimisel tekkis viga. Arvatavasti on torrent vigane või pole see "
+"üldse torrenti fail."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "%1 loomine ebaõnnestus: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Sa juba laadid torrentit %1 alla, mõlema torrenti tracker'ite nimekiri on "
+"ühendatud."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Sa juba laadid torrentit %1 alla"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "%1 migreerimine ebaõnnestus: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Torrent %1 on alustatud KTorrenti varasema versiooniga. Tagamaks torrenti "
+"töötamise ka KTorrenti praeguses versioonis see migreeritakse. Sinu käest "
+"päritakse, kuhu torrent salvestada. Kui klõpsad 'Loobu', salvestatakse see sinu "
+"kodukataloogi."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Salvestamiskataloogi valimine"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Pole alustatud"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Levitamine"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Allalaadimine"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Seiskunud"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Peatatud"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Viga: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Kettaruumi eraldamine"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Järjekorras"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Andmete kontroll"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Peatatud. Kettal pole ruumi."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Selle torrenti allalaadimiseks pole kettal piisavalt ruumi. Kas tõesti soovid "
+"jätkata?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "%1 jaoks napib kettaruumi"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" on jõudnud maksimaalse jagamissuhteni. Kas ignoreerida piirangut "
+"ja alustada sellele vaatamata levitamist?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Jõuti maksimaalse jagamissuhteni."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Viga torrenti %1 peatamisel: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Viga torrenti %1 käivitamisel: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Teatamine"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Tundmatu klient"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 masin\n"
+"%n masinat"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Faili %1 loomine ebaõnnestus: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Esimese tüki kirjutamine faili ebaõnnestus: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Viimase tüki kirjutamine faili ebaõnnestus: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "%1 avamine kirjutamiseks nurjus: kirjutuskaitstud failisüsteem"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Faili %1 avamine nurjus: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Faili %1 avamine nurjus: kirjutamine ei ole lõpetatud"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Faili %1 avamine ebaõnnestus"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Viga: loeti üle faili %1 lõpu"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Viga %1 lugemisel"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Viga %1 kirjutamisel: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Viga %1 kirjutamisel"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Kettaruumi eraldamine ebaõnnestus: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Sidumine UDP pordiga %1 ja 10 järgneva pordiga ebaõnnestus."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Vigane vastus tracker'ist"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Vigased andmed tracker'ist"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Vigane tracker'i URL"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Faili %1 avamine ebaõnnestus: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Indeksifaili loomine ebaõnnestus: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Faili avamine ebaõnnestus: %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "UPnP kasutamine portide automaatseks edasisuunamiseks ruuteris"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Seadme pakutavate teenuste hulgas pole pordi edasisuunamist!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP seadmed"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Kataloogide automaatne uurimine ja leitud torrentide laadimine"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Kataloogide uurimine"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Kataloogide uurimine"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Kataloogide uurimise valikud"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "laaditud"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Kataloogide uurimine - kataloog %1: vigane URL või pole kataloogi olemas. Palun "
+"vali olemasolev kataloog."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Veebiliides"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Veebiliidese valikud"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "PHP programm ei asu otsinguteel, palun sisesta asukoht käsitsi"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Palun sisesta veebiliidese uus parool."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 on olemas ja käivitatav"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 ei ole olemas"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 ei ole käivitatav"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 on kataloog"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 ei ole PHP programmi asukoht"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Veebiliides"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "KTorrenti juhtimise lubamine brauseri vahendusel"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Allalaadimine esimesena"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Tavaline allalaadimine"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Allalaadimine viimasena"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Failide kustutamine"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Saadaolev"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Ootel"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Kaotad kõik faili andmed. Kas tõesti soovid seda?\n"
+"Kaotad kõik failide andmed. Kas tõesti soovid seda?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Piirang puudub"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Infoplugin"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Lisainfo allalaadimiste kohta, näiteks millised tükid on alla laaditud, kui "
+"palju on tõmbajaid ja levitajaid..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Privaattorrentile ei saa tracker'it lisada."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Torrenti vaikimisi tracker'it ei saa eemaldada."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Privaattorrentile ei saa tracker'it lisada"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Riik"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klient"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Ummistunud"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Tõrjutud"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Saadavus"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Skoor"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Üleslaadimispesa"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Soovid"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Viska masin välja"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Pagenda masin"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Saadaolevad tükid"
+"<br><img src=\"unavailable_color\">&nbsp; - Kättesaamatud tükid"
+"<br><img src=\"excluded_color\">&nbsp; - Väljajäetavad tükid"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Infoplugina valikud"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Allalaaditud tükid"
+"<br><img src=\"unavailable_color\">&nbsp; - Allalaaditavad tükid"
+"<br><img src=\"excluded_color\">&nbsp; - Väljajäetavad tükid"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Teisenda"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Tekstifaili laadimine..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Palun oota..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Fail teisendatud."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Filtri laadimine ebaõnnestus:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Vigane filtrifail. See on kas vigastatud või vales vormingus."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtreerib soovimatud masinad välja IP-aadressi põhjal"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Olek: sisse lülitatud ja töötab."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Olek: välja lülitatud."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Olek: <font color=\"#ff0000\">filtrifaili ei leitud.</font> "
+"Laadi filtrifail alla ja teisenda see."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Valitud fail on juba olemas. Kas soovid selle uuesti alla laadida?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Fail on olemas"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Filtrifail (level1.dat) on juba olemas. Kas soovid selle uuesti teisendada?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP blokeerimise filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IP blokeerimise filtri valikud"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistika"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Statistika valikud"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Ühendatud tõmbajaid"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Tõmbajaid sülemis"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Ühendatud levitajaid"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Levitajaid sülemis"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Ühendatud tõmbajate keskmine arv torrenti kohta"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Ühendatud levitajate keskmine arv torrenti kohta"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Ühendatud tõmbajate keskmine arv töötava torrenti kohta"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Ühendatud levitajate keskmine arv töötava torrenti kohta"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Sõlmed"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Ülesanded"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Ülekandestatistika näitamine"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Kiiruse statistika"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Ühenduse statistika"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Aktiivne"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Keskmine"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Piirang"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Keskmiselt tõmbajalt"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Keskmiselt tõmbajale"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Keskmiselt levitajalt"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Tõmbajatelt"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Levitajatelt"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legend"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrenti failid"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Kõik failid"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Andmete kontroll ebaõnnestus: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Torrenti faili laadimine ebaõnnestus: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Osalise faili importimise plugin võimaldab importida osaliselt või täielikult "
+"allalaaditud torrenteid teistest klientidest"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Olemasoleva allalaadimise import"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "Uudistevoo URL"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"RSS-voogude automaatne uurimine regulaaravaldisele vastava torrenti leidmiseks "
+"ja nende laadimiseks."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS-vood"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "%1 jaoks ei leitud ega saadud alla laadida korrektset torrentit"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Pealkiri"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Kirjeldus"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Link"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Hooaeg"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episood"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Aeg"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Ajastaja"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Ajastamisplugina valikud"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "E"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "T"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "K"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "N"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "R"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "L"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "P"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Ajastus salvestatud."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Faili ei leitud."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Ajastus laaditud."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Ribalaiuse ajastamise plugin"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Ava ribalaiuse ajastaja"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Ribalaiuse ajastaja ei ole sisse lülitatud. Selleks vali Seadistused->Ajastaja."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Loginäitaja"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Loginäitaja"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "KTorrenti logiväljundi näitamine"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Kasuta oma veebilehitsejat stringi %1 (suurtähtedega) otsimiseks "
+"otsingumootoriga, mida soovid lisada."
+"<br>Kui otsing on tehtud, kopeeri aadressiribal leiduv URL ning aseta see siia."
+"<br>"
+"<br>Näiteks stringi %1 otsimisel Google'is on tulemuseks "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8."
+"<br>Kui lisad selle URL-i siia, kasutab KTorrent otsimiseks Google'it."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Kasuta oma veebilehitsejat stringi %1 (suurtähtedega) otsimiseks "
+"otsingumootoriga, mida soovid lisada. Saadud URL-i kasuta allpool."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Määrata tuleb otsingumootori nimi ja URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Selle nimega otsingumootor on juba olemas. Palun vali mõni muu nimi."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Vigane URL. Sa peaksid oma veebilehitsejas otsima stringi FOOBAR ning kopeerima "
+"sealt siia täpse URL-i."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Otsing"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Otsingumootori valikud"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "%1 otsimine..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Torrent-failid"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Otsimine lõpetatud"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Mootor: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Torrentide otsimine mitmes populaarses torrentide otsingumootoris"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Kas torrent alla laadida või salvestada?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Torrenti allalaadimine"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Laadi alla"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Leiab kohtvõrgust töötava KTorrentiga masinad, kellega torrenteid jagada"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Tüki %1 laadimine ebaõnnestus"
+
+#~ msgid "Patch to update the FileView in a separate thread"
+#~ msgstr "Paik failivaate uuendamiseks eraldi lõimes"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "IP-pakettide teenusevälja tüüp"
diff --git a/translations/fa/Makefile.am b/translations/fa/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/fa/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/fa/messages/Makefile.am b/translations/fa/messages/Makefile.am
new file mode 100644
index 0000000..7155ae2
--- /dev/null
+++ b/translations/fa/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = fa
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/fa/messages/ktorrent.po b/translations/fa/messages/ktorrent.po
new file mode 100644
index 0000000..f1c4096
--- /dev/null
+++ b/translations/fa/messages/ktorrent.po
@@ -0,0 +1,5067 @@
+# translation of ktorrent.po to Persian
+#
+# MaryamSadat Razavi <razavi@itland.ir>, 2007.
+# Nasim Daniarzadeh <daniarzadeh@itland.ir>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-01-15 14:30+0330\n"
+"Last-Translator: Nasim Daniarzadeh <daniarzadeh@itland.ir>\n"
+"Language-Team: Persian <kde-i18n-fa@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "اطلاعات"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "دادۀ انتقال‌یافته طی نشست جاری"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "سرعت جاری کل torrentهای ادغام‌شده"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "آغاز"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "ایست"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "آغاز همه"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "ایست همه"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "چسباندن نشانی وب Torrent..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "باز کردن مدیر صف..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "صف کردن/از صف خارج کردن"
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "پالایۀ IP:"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "بررسی مجتمع‌سازی داده"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "تنظیم میزان بیشینۀ بارگذاری"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "تنظیم میزان بیشینۀ بارگیری"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "پرونده‌های Torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "همۀ پرونده‌ها"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "باز کردن محل"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "سرعت بالا: %1 / پایین: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "انتقال‌یافته بالا: %1 / پایین: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 گره، %2 تکلیف"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: خاموش"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Torrent بارگیری"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "&حرکت به بالا‌"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "&حرکت به بالا‌"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "&حرکت به بالا‌"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "انتخاب یک پرونده"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "انتخاب یک نام پرونده برای ذخیره تحت"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "نشانی وب بدشکل."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "بارگیریها"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "بارگذاریها"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+#, fuzzy
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"درگاه مشخص )%1( موجود نیست یا کاربرد دیگری از آن استفاده می‌کند. KTorrent به "
+"درگاه %2 محدود است."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "torrent را نمی‌توان ایجاد کرد: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+#, fuzzy
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"چندین پروندۀ دادۀ torrent »%1« مفقود می‌شود، می‌خواهید آنها را دوباره ایجاد "
+"کنید، یا می‌خواهید آنها را بارگیری نکنید ؟"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "ایجاد مجدد"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "عدم بارگیری"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "پرونده‌های مفقود را نمی‌توان مجدداً‌ ایجاد کرد : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "پرونده‌های داده مفقود می‌شوند"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "پرونده‌های مفقود را نمی‌توان از گزینش خارج کرد : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+#, fuzzy
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"پرونده‌ای که از torrent »%1« داده در آن ذخیره شده است مفقود می‌شود، می‌خواهید "
+"آن را ایجاد کنید ؟"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "ایجاد مجدد"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "پروندۀ داده را نمی‌توان مجدداً ایجاد کرد : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "پروندۀ داده مفقود می‌شود"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "بررسی مجتمع‌سازی داده"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "بی‌نهایت"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 ٪"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "خطای پویش داده : %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "دادۀ پویش برای توده‌ها :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "یک برنامۀ BitTorrent برای KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "حالت اشکال‌زدایی"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "سند برای باز کردن"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "وصله‌ها"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "گزینه‌های عمومی"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "شمایل کاربرد و یک زوج دیگر"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "شمایل بارگیریها"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "۱.۰ شمایل کاربرد"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "نکته ابزار میلۀ توده‌ای و مرتب کردن IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "کشور"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "اولویت‌دهی پرونده"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp به عنوان یک مثال برای پیاده‌سازی شخصی UPnP استفاده می‌شد"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "مسیر پوشۀ ۱"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "مسیر پوشۀ ۱"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "مسیر پوشۀ ۱"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr " آیا torrent به صورت خاموش باز شود یا خیر."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "باید یک پرونده یا یک پوشه برگزینید."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+#, fuzzy
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "نمی‌توانید ردیابها را به یک torrent خصوصی اضافه کنید"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "باید حداقل یک ردیاب اضافه کنید."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "پرونده‌های Torrent )*.torrent("
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "انتخاب پرونده برای ذخیرۀ Torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "ایجاد %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "IP سفارشی‌"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "نام"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "حذف ردیاب"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "بارگذاریها"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+#, fuzzy
+msgid "Queued uploads"
+msgstr "صف‌شده"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "شمایل بارگیریها"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "بارگیری:"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "بارگذاریها"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "ایجاد Torrent"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "بارگیری:"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "بارگذاریها"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Torrent بارگیری"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "بارگیری:"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "ایجاد Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "جفتهای انتساب‌شده"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "اعلام راهنما"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "پیش‌نمایش"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "شمایل بارگیریها"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, fuzzy, no-c-format
+msgid "Speed Limits"
+msgstr "حد سرعت بر حسب کیلوبایت/ثانیه"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "نشانی وب بدشکل."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "تنظیمات"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "گزینه‌های بارگیری"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+#, fuzzy
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "لازم است که درگاه DHT از درگاه ردیاب UDP متفاوت باشد !"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "عمومی"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "گزینه‌های عمومی"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"نمی‌توان به %1 مراجعه کرد: %2\n"
+"لطفاً، یک نشانی اینترنتی یا نام میزبان معتبر فراهم کنید."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "گزینه‌های پویش پوشه"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "وضعیت"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "بارگیری‌شده"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "اندازه"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "بارگذاری‌شده"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "سرعت پایین"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "سرعت بالا"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "زمان باقی‌مانده"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "بذرافشانها:"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "بذرافشانها:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "٪ کامل"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "ضریب اشتراک:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "بارگیری‌شده"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "زمان باقی‌مانده"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Torrent بارگیری"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "%n جفت"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"torrent %1 بارگیری را تمام نکرده است، می‌خواهید دادۀ ناقص را هم حذف کنید؟"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "حذف بارگیری"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+#, fuzzy
+msgid "Delete Data"
+msgstr "حذف پس از &بار کردن‌"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "شمایل بارگیریها"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"پرونده‌های موجود زیر را از گزینش خارج کردید. با این کار، کل داده‌های این "
+"پرونده‌ها را از دست می‌دهید، مطمئن هستید که می‌خواهید این کار را انجام دهید ؟"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "بله، پرونده‌ها را حذف کن"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "نه، پرونده‌ها را حفظ کن"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "کاربر"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "مدیر صف"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "نه )torrent خصوصی("
+
+#: apps/ktorrent/trayicon.cpp:90
+#, fuzzy
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<center><b>KTorrent</b></center><table cellpadding='2' cellspacing='2' "
+"align='center'>"
+"<tr>"
+"<td><b>سرعت:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>بارگیری: <font color='#1c9a1c'>%1</font></td>"
+"<td>بارگذاری: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>انتقال:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>بارگیری: <font color='#1c9a1c'>%3</font></td>"
+"<td>بارگذاری: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> بارگیری را کامل کرده است.<br>سرعت متوسط: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "بارگیری کامل شد"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "بارگیری کامل شد"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> با خطای زیر ایستاده است: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "دادۀ پویش برای توده‌ها :"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "حد سرعت بر حسب کیلوبایت/ثانیه"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "نامحدود"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+#, fuzzy
+msgid "Speed limits for <b>%1</b>:"
+msgstr "حد سرعت بر حسب کیلوبایت/ثانیه"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "یک کاربرد KPart KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "پروندۀ نمایۀ %1 را نمی‌توان باز کرد : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "مریم سادات رضوی"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "razavi@itland.ir"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "پرونده‌هایی که می‌خواهید بارگیری کنید را برگزینید"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "بارگیری"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "&کاربر کنترل شد‌"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "آغاز &بذرافشانی torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "بارگیری"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "برگزیدن &همه‌"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "برگزیدن &هیچ‌کدام‌"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "گزینش وارونه"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "بارگیری:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "رمزبندی"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "استفاده از رمزبندی قرارداد"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "اجازه به اتصالهای رمزبندی‌نشده"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"اگر علامت زده نشود، می‌توانید فقط به کارخواههایی متصل شوید که رمزبندی را "
+"پشتیبانی می‌کنند."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>قرارداد <b>جدول <b>درهم</b>."
+"<br>قرارداد مبادلۀ جفتهای از مرکز خارج‌شده. برای اطلاعات بیشتر، به راهنما "
+"مراجعه کنید."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&استفاده از DHT برای گرفتن جفتهای اضافی‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "درگاه UDP برای ارتباط DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP سفارشی‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "&ارسال یک IP یا نام میزبان سفارشی به ردیاب‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "IP یا نام میزبان سفارشی:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "پوشه‌ها"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "پوشه برای ذخیرۀ پرونده‌های موقت:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "عدم بارگیری"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "ذخیرۀ &خودکار بارگیریها در:‌"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "پرونده‌های torrent"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "میله ابزار بارگیری"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "آغاز &بذرافشانی torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "میزان بیشینۀ بارگذاری:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "میزان بیشینۀ بارگیری:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "کیلوبایت/ثانیه )۰ بدون حد است("
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "جفت"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "درگاه:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "پرونده‌های Torrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, fuzzy, no-c-format
+msgid "Banned Peers"
+msgstr "جفتهای انتساب‌شده"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "بارگیریهای بیشینه:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "دانه‌های بیشینه:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, fuzzy, no-c-format
+msgid "Minimum disk space:"
+msgstr "اختصاص فضای دیسک"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "آغازنشده"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "آغازنشده"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr ")۰ بدون حد است("
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "میزان بیشینۀ بارگیری:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Global connection limit:"
+msgstr "حد اتصال سراسری"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "ضریب اشتراک:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "اتصالهای بیشینه در هر torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "تعداد شکافهای بارگذاری:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "درگاه ردیاب UDP:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "ضریب اشتراک:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "میزان بیشینۀ بارگذاری:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "کیلوبایت/ثانیه )۰ بدون حد است("
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr ")۰ بدون حد است("
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&حفظ بذرافشانی پس از اتمام بارگیری‌"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "توجه"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"اگر پشت یک ره‌یاب هستید، درگاههای بالا باید پیش‌سو شوند. وصلۀ UPnP می‌تواند این "
+"کار را برای شما انجام دهد."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "محاورۀ صف KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "وضعیت:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "ردیاب:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "ضریب اشتراک:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "بایت باقی‌مانده:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "کنترل‌شده با"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&بارگذاریها‌"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "بارگذاری‌شده:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "&حرکت به بالا‌"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "حرکت به &پایین‌"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "&حرکت به بالا‌"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&QM کنترل شد"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "&کاربر کنترل شد‌"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "چسباندن نشانی وب"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "نشانی وب:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&تأیید‌"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&لغو‌"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "ایجاد Torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "پرونده یا پوشه‌ای که می‌خواهید یک torrent از آن ایجاد کنید:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "باید حداقل یک ردیاب اضافه کنید."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "گزینه‌های پرونده"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "اندازۀ هر توده:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "۳۲"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "۶۴"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "۱۲۸"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "۲۵۶"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "۵۱۲"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "۱۰۲۴"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "۲۰۴۸"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "۴۰۹۶"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "۸۱۹۲"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "کیلوبایت"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "آغاز &بذرافشانی torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "torrent خصوصی )DHT مجاز نیست("
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "توضیحات:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "&ایجاد‌"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&لغو‌"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "ردیابها"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "هیچ‌کدام"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "IP یا نام میزبان سفارشی:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "درگاه"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "تنظیمات جستجو"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "موتور جستجوی جاری"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "تنظیمات"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "کاربرد حافظه:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "کم"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "متوسط"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "زیاد"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "فاصلۀ به‌روزرسانی ونک:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "۵۰۰ میلی‌ثانیه‌"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "۱ ثانیه"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "۲ ثانیه"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "۵ ثانیه"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, fuzzy, no-c-format
+msgid "Data Checking"
+msgstr "بررسی داده"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "تعداد بیشینۀ اتصالها در هر torrent )۰ = بدون حد("
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "درگاه ردیاب UDP:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "دادۀ پویش"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, fuzzy, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "دادۀ پویش برای توده‌ها :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "تعداد توده‌های یافت‌شده :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "تعداد توده‌های خراب / بارگیری‌نشده :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "۰"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "آزمون"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "تعداد بیشینۀ بارگیریها )۰ = بدون حد("
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "تعداد بیشینۀ دانه‌ها )۰ = بدون حد("
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "تعداد بیشینۀ اتصالها در هر torrent )۰ = بدون حد("
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "تعداد بیشینۀ اتصالها برای همۀ torrentها )۰ = بدون حد("
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "سرعت بارگذاری بیشینه بر حسب کیلوبایت/ثانیه )۰ = بدون حد("
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "سرعت بارگیری بیشینه بر حسب کیلوبایت/ثانیه )۰ = بدون حد("
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "به حد ضریب اشتراک بیشینه رسید."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "به حد ضریب اشتراک بیشینه رسید."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "نمایش یک شمایل سینی سیستم"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "نمایش پیامهای بالاپر، هنگامی که torrent تمام می‌شود."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "حفظ بذرافشانی پس از اتمام بارگیری"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "پوشه برای ذخیرۀ پرونده‌های موقت"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr " آیا بارگیریها به طور خودکار در فهرست ذخیره، ذخیره شوند"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "پوشه برای ذخیرۀ پرونده‌های بارگیری‌شده"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr " آیا بارگیریها به طور خودکار در فهرست ذخیره، ذخیره شوند"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "پوشه برای ذخیرۀ پرونده‌های بارگیری‌شده"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr " آیا بارگیریها به طور خودکار در فهرست ذخیره، ذخیره شوند"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "پوشه برای ذخیرۀ پرونده‌های موقت"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr " آیا از یک IP سفارشی برای گذر به ردیاب استفاده شود"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP برای گذر به ردیاب"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "کاربرد حافظه"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "فاصلۀ به‌روزرسانی ونک"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "پشتیبان برای DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "درگاه DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "تعداد شکافهای بارگذاری"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "مدیر وصله"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "بار کردن"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&خالی کردن‌"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "بار کردن همه"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "خالی کردن همه"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "دستگاه UPnP پیش‌فرض مورد استفاده"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "دستگاههای آشکارشده:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "دستگاه"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "درگاههای پیش‌سوشده"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, fuzzy, no-c-format
+msgid "WAN Connection"
+msgstr "اتصالها:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, fuzzy, no-c-format
+msgid "Forw&ard Ports"
+msgstr "پیش‌سو کردن درگاهها"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "واگرد پیش‌سوی درگاه"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "پویش مجدد"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "پویش پوشۀ ۱ فعال شود؟"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "پویش پوشۀ ۲ فعال شود؟"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "پویش پوشۀ ۳ فعال شود؟"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "مسیر پوشۀ ۱"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "مسیر پوشۀ ۲"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "مسیر پوشۀ ۳"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr " آیا torrent به صورت خاموش باز شود یا خیر."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "کنش حذف علامت خورد."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "کنش حرکت علامت خورد."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "تنظیمات پوشۀ پویش"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "پویش پوشۀ &۱‌"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "دگرساز+۱"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "پویش پوشۀ &۲‌"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "دگرساز+۲"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "پویش پوشۀ &۳‌"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "دگرساز+۳"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "حرکت به فهرست راهنمای »بارشده« &پس از بار کردن‌"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "حرکت torrent به فهرست راهنمای »بارشده« پس از بار کردن آن"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "باز کردن &خاموش torrentها‌"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "محاورۀ »برگزیدن پرونده‌ها برای بارگیری« را نمایش نده"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "حذف پس از &بار کردن‌"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "پس از بار کردن، torrent را حذف می‌کند"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "پوشه‌ها برای پویش"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "پوشۀ ۱:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "پوشۀ ۲:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "پوشۀ ۳:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "تنظیمات جستجو"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "پیش‌سو کردن درگاهها"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "برگزیدن &هیچ‌کدام‌"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "کاربر"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "پیش‌سو کردن درگاهها"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "توده‌ها"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "کل:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "بارگیری جاری:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "بارگیری‌شده:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "مستثنی:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "اندازه:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "توده"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "پیشرفت"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "جفت"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "جفتهای انتساب‌شده"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "بذرافشانها:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "سرعت متوسط پایین:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "سرعت متوسط بالا:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "به‌روزرسانی بعدی در:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "وضعیت ردیاب:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "اجزائی از torrent که بارگیری شده است:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "اجزائی از torrent که موجود است:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "اشتراک"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"بارگذاری شما زمانی می‌ایستد که ضریب اشتراک به این مقدار برسد. صفر یعنی بدون حد."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, fuzzy, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"بارگذاری شما زمانی می‌ایستد که ضریب اشتراک به این مقدار برسد. صفر یعنی بدون حد."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, fuzzy, no-c-format
+msgid "Ratio limit:"
+msgstr "حد اتصال سراسری"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "حد فقط در حالت دانه کار می‌کند"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "از حد &استفاده شود؟‌"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "&به‌روزرسانی ردیاب‌"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "فاصلۀ بیشینۀ به‌روزرسانی - ۶۰ ثانیه"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "افزودن &ردیاب‌"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "حذف ردیاب"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "&تغییر ردیاب‌"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, fuzzy, no-c-format
+msgid "Restore Defaults"
+msgstr "بازگردانی پیش‌فرضها"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "نمایش تب نمای جفت در پنجرۀ اصلی"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "نمایش تب نمای بارگیری توده در پنجرۀ اصلی"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "نمایش تب نمای ردیابها در پنجرۀ اصلی"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "نمایش فهرست جفتها"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "نمایش فهرست توده‌هایی که &در حال حاضر بارگیری می‌شوند‌"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "نمایش فهرست ردیابها"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "تنظیمات IPBlocking"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "از پالایۀ KTorrent استفاده شود؟"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "پروندۀ پالایۀ IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "&بارگیری/تبدیل‌"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "نشانی وب پالایۀ سطح ۱"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "از پالایۀ سطح ۱ استفاده شود؟"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr " تبدیل..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"برای آغاز تبدیل پروندۀ antip2p، دکمۀ »تبدیل« را فشار دهید. نکته: این فرایند حتی "
+"در ماشینهای سریع و طی زمانی که نمی‌توانستید از KTorrent استفاده کنید، مقداری "
+"طول می‌کشید."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "فاصلۀ به‌روزرسانی ونک"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "دانه‌های بیشینه:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "دانه‌های بیشینه:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "جفتها"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "جفت"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "اتصالها:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "بارگذاریها"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "اتصالها:"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "جفتها"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Torrent بارگیری"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, fuzzy, no-c-format
+msgid "Connections mesurments count"
+msgstr "پرچم پیامهای اتصالها"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "واردات یک بارگیری موجود"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "داده:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"لطفاً، torrent و داده‌ای که از قبل برای آن torrent بارگیری شده را مشخص کنید."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&واردات‌"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "افزودن &پیش‌فرض‌"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "بذرافشانها:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "نشانی وب"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "پالایۀ IP:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "همۀ پرونده‌ها"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "پیشرفت"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "ضریب بیشینه:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, fuzzy, no-c-format
+msgid "Te&st"
+msgstr "آزمون"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "مسیر پوشۀ ۱"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "زمان‌بند پهنای باند"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "فشار چپ دسته"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "&دستۀ ۱"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&خاموش‌"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&عادی‌"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "دستۀ &۳‌"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "دستۀ &۲‌"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "فشار راست دسته"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "دستۀ &۱‌"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&دستۀ ۳‌"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "دسته‌ها"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>۱. دسته</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>۳. دسته</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "بارگیری:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "بارگذاری:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "کیلوبایت/ثانیه *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>۲. دسته</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* صفر یعنی بدون حد"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "ذخیره در پرونده"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&بار کردن از پرونده‌"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "بازنشانی زمان‌بندی"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&تأیید‌"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "صفحۀ تنظیم وصلۀ زمان‌بند"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "از زمان‌بند &پهنای باند استفاده شود؟"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "زمان‌بند پهنای باند"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "به جای &نگاشتهای تصویردانه‌ای، از رنگها استفاده شود؟‌"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ")توصیه‌شده برای سیستمهای کندتر("
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "ویرایش &زمان‌بندی‌"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "زمان‌بند پهنای باند فعال شود؟"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "به جای نگاشتهای تصویردانه‌ای، از رنگها استفاده شود؟‌"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "استفاده از متن ثبت غنی"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "پرچم پیامهای اطلاعات عمومی"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "پرچم پیامهای اتصالها"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "پرچم پیامهای DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "پرچم پیامهای اطلاعات ردیاب"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "پرچم پیامهای اطلاعات IO دیسک"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ IPFilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ جستجو"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ InfoWidget"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ ScanFolder"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ زمان‌بند"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ جستجو"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "پرچم پیامهای وصلۀ IPFilter"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "گزینه‌های LogViewer"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "وصله‌ها"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "همه"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "اشکال‌زدایی"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "اخطار"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "مهم"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "هیچ‌کدام"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "پالایۀ IP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "جستجو:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "پویش پوشه:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "زمان‌بند:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "عنصر اطلاعات:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "سیستم"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "عمومی:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "اتصالها:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "دیسک ورودی/خروجی:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "استفاده از &متن غنی برای ثبت‌"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, fuzzy, no-c-format
+msgid "Use default browser"
+msgstr "بازگردانی پیش‌فرضها"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "موتورهای جستجو"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "نام موتور جستجو:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&افزودن‌"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "موتورها"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "نشانی وب"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&حذف همه‌"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "افزودن &پیش‌فرض‌"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "به‌روزرسانی از اینترنت"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "جستجو"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "موتور جستجو:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "موتور جستجوی جاری"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 گیگابایت"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 مگابایت"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 کیلوبایت"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 بایت"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 کیلوبایت/ثانیه"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "%n روز"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "بله، اولین"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "بله، آخرین"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "پروندۀ ثبت %1 را نمی‌توان باز کرد : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "در %1 نمی‌توان نوشت : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "از %1 نمی‌توان خواند"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "فهرست راهنمای %1 را نمی‌توان ایجاد کرد: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "%1 را نمی‌توان به %2 پیوند نمادی زد: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "%1 را نمی‌توان به %2 حرکت داد: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "%1 را نمی‌توان در %2 رونوشت کرد: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "%1 را نمی‌توان حذف کرد: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "%1 را نمی‌توان ایجاد کرد: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "اندازه پروندۀ %1 را نمی‌توان محاسبه کرد: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "اندازه پرونده را نمی‌توان محاسبه کرد : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "%1 را نمی‌توان باز کرد : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "پرونده را نمی‌توان بسط داد : %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "پروندۀ %1 را نمی‌توان بسط داد"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "در پرونده نمی‌توان پیگردی کرد : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "فراتر از پایان میان‌گیر mmap نمی‌توان نوشت!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "بارشده"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "بارنشده"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "گزینه‌های وصله"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "پروندۀ %1 را نمی‌توان باز کرد : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "فهرست راهنمای %1 موجود نیست"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "نشانۀ غیرمجاز: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "خطای کدگشایی"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "پایان غیرمنتظرۀ ورودی"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "%1 را نمی‌توان به یک نوع درست تبدیل کرد"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent ناقص است!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "torrent خراب‌شده!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrent اعلام یا حوزۀ گره ندارد"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " قادر به باز کردن پروندۀ torrent %1 نیست : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "خطای تجزیه"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"هنگام بار کردن torrent، خطایی رخ داد. شاید torrent خراب است یا یک پروندۀ "
+"torrent نیست."
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"هنگام بار کردن torrent، خطایی رخ داد. شاید torrent خراب است یا یک پروندۀ "
+"torrent نیست."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr " قادر به باز کردن پروندۀ torrent %1 نیست : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+#, fuzzy
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"در حال بارگیری این torrent هستید، فهرست ردیابهای دو torrent ادغام شده است."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "می‌خواهید torrent را بارگیری یا ذخیره کنید؟"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "%1 را نمی‌توان جابه‌جا کرد : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"torrent %1 با نسخۀ قبلی KTorrent آغاز می‌شد. برای اطمینان از این که این torrent "
+"هنوز با این نسخۀ KTorrent کار می‌کند، این torrent را جابه‌جا می‌کنیم. دربارۀ "
+"محلی برای ذخیرۀ torrent از شما سؤال می‌شود. اگر لغو را فشار دهید، فهرست راهنمای "
+"آغازه را برمی‌گزینید."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "برگزیدن پوشه برای ذخیره در"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "آغازنشده"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "بذرافشانی"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "بارگیری"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "متوقف"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "ایستاده"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "خطا: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "اختصاص فضای دیسک"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "صف‌شده"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "بررسی داده"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy, c-format
+msgid "Insufficient disk space for %1"
+msgstr "اختصاص فضای دیسک"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent »%1« به ضریب اشتراک بیشینۀ خود رسیده است. در هر صورت از حد چشم‌پوشی "
+"کرده و بذرافشانی را آغاز می‌کنید؟"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "به حد ضریب اشتراک بیشینه رسید."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "خطای ایست torrent %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "خطای آغاز torrent %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "کارخواه ناشناخته"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "%n جفت"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "پروندۀ %1 را نمی‌توان ایجاد کرد : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "خرابی در نوشتن اولین توده در پروندۀ DND : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "خرابی در نوشتن آخرین توده در پروندۀ DND : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "پرونده را نمی‌توان بسط داد : %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "پروندۀ %1 را نمی‌توان بسط داد"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "پروندۀ %1 را نمی‌توان بسط داد"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "خطا : خواندن بعد از پایان پروندۀ %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "خطای خواندن از %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "خطای نوشتن در %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "خطای نوشتن در %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "فضای دیسک را نمی‌توان از پیش اختصاص داد : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "به درگاه %1 یا ۱۰ درگاه زیر نمی‌توان مقید شد."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "پاسخ نامعتبر"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "نشانی وب ردیاب:"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "پروندۀ %1 را نمی‌توان باز کرد: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "پروندۀ نمایه را نمی‌توان ایجاد کرد: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "پرونده را نمی‌توان باز کرد : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "برای پیش‌سوی خودکار درگاههای ره‌یاب شما، از UPnP استفاده می‌کند"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "درگاهی که خدمت را در توصیف دستگاه پیش‌سو می‌کند را نمی‌توان یافت!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "دستگاههای UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"فهرستهای راهنما را برای پرونده‌های torrent پویش کرده و آنها را بار می‌کند."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "پویش پوشه"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "پویش پوشه"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "گزینه‌های پویش پوشه"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "بارشده"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+#, fuzzy
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"پویش پوشه - پوشۀ %1: نشانی وب یا پوشۀ نامعتبر وجود ندارد. لطفاً، یک فهرست "
+"راهنمای معتبر انتخاب کنید."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "گزینه‌های عمومی"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "فهرست راهنمای %1 موجود نیست"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "گزینه‌های عمومی"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "بارگیری در ابتدا"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "بارگیری عادی"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "بارگیری در نهایت"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "همۀ پرونده‌ها"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "موجود"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "معلق"
+
+#: plugins/infowidget/fileview.cpp:343
+#, fuzzy
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"پرونده‌های موجود زیر را از گزینش خارج کردید. با این کار، کل داده‌های این "
+"پرونده‌ها را از دست می‌دهید، مطمئن هستید که می‌خواهید این کار را انجام دهید ؟"
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "از حد &استفاده شود؟‌"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "عنصر اطلاعات"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"اطلاعات اضافی دربارۀ یک بارگیری را نمایش می‌دهد. نظیر اینکه کدام توده‌ها، چند "
+"بذرافشان و leecher ... بارگیری شده‌اند"
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "یک ردیاب را نمی‌توان به یک torrent خصوصی اضافه کرد."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "ردیاب torrent پیش‌فرض را نمی‌توان حذف کرد."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "نمی‌توانید ردیابها را به یک torrent خصوصی اضافه کنید"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "کشور"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "کارخواه"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "دسترس‌پذیری"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "خط تیره"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "شکاف بارگذاری"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "درخواستها"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+#, fuzzy
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "ممنوع کردن جفت"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\"> - توده‌های موجود"
+"<br><img src=\"unavailable_color\"> - توده‌های غیرموجود"
+"<br><img src=\"excluded_color\"> - توده‌های مستثنی"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "گزینه‌های عنصر اطلاعات"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\"> - توده‌های بارگیری‌شده"
+"<br><img src=\"unavailable_color\"> - توده‌ها برای بارگیری"
+"<br><img src=\"excluded_color\"> - توده‌های مستثنی"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "تبدیل"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "بار کردن پروندۀ txt..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "لطفاً، منتظر بمانید..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "پرونده تبدیل شد."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "پالایه را نتوانست بار کند:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "پروندۀ پالایۀ نادرست. ممکن است خراب باشد یا یک قالب نادرست داشته باشد."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "پالایۀ IP:"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "وضعیت: بارشده و در حال اجرا."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "وضعیت: بارنشده."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"وضعیت: <font color=\"#ff0000\">پروندۀ پالایه یافت نشد.</font> "
+"بارگیری و تبدیل پروندۀ پالایه."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "پروندۀ برگزیده از قبل وجود دارد، می‌خواهید آن را دوباره بارگیری کنید؟"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "پرونده موجود است"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"پروندۀ پالایه )level1.dat( از قبل وجود دارد، می‌خواهید آن را دوباره تبدیل کنید؟"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "پالایۀ IPBlocking"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "گزینه‌های پالایۀ IPBlocking"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "وضعیت"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "اتصالها:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "اتصالها:"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "نمایش شمایل سینی &سیستم‌"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "اتصالهای بیشینه در هر torrent:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "اتصالهای بیشینه در هر torrent:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "هیچ‌کدام"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "ردیابها"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+#, fuzzy
+msgid "Speed statistics"
+msgstr "حد سرعت بر حسب کیلوبایت/ثانیه"
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "اتصالها:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "موتور جستجوی جاری"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "از حد &استفاده شود؟‌"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "سرعت متوسط پایین:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "سرعت متوسط پایین:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "سرعت متوسط پایین:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "بذرافشانها:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "پوشه‌ها"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "پرونده‌های Torrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "همۀ پرونده‌ها"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "داده را نمی‌توان وارسی کرد : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "پروندۀ torrent را نمی‌توان بار کرد : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"torrentهایی که به صورت جزئی یا کامل بارگیری شده‌اند را از کارخواههای دیگر وارد "
+"می‌کند"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "واردات بارگیری موجود"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+#, fuzzy
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"فهرستهای راهنما را برای پرونده‌های torrent پویش کرده و آنها را بار می‌کند."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "توصیف"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "ضریب بیشینه:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "زمان باقی‌مانده"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "زمان‌بند"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "گزینه‌های وصلۀ زمان‌بند"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "دوشنبه"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "سه‌شنبه"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "چهارشنبه"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "پنجشنبه"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "جمعه"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "شنبه"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "یکشنبه"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "زمان‌بندی ذخیره شد."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "پرونده یافت نشد."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "زمان‌بندی بار شد."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "وصلۀ زمان‌بندی پهنای باند"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "باز کردن زمان‌بند پهنای باند"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"زمان‌بند پهنای باند غیرفعال است. برای فعال کردن آن، به تنظیمات->زمان‌بند بروید."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "مشاهده‌گر ثبت"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "مشاهده‌گر ثبت"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"از مرورگر وب خود برای جستجوی رشتۀ %1 )حروف بزرگ( در موتور جستجویی که می‌خواهید "
+"اضافه کنید، استفاده کنید. سپس پس از اتمام جستجو، نشانی وب را در میله نشانی "
+"رونوشت کرده، و آن را در اینجا بچسبانید."
+"<br>نتیجۀ جستجوی %2 مثلاً در گوگل "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8 است. اگر این نشانی وب "
+"را در اینجا اضافه کنید، ktorrent می‌تواند با استفاده از گوگل جستجو کند."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "باید نام و نشانی وب موتور جستجو را وارد کنید"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"یک موتور جستجو با همین نام از قبل وجود دارد. لطفاً، از نام دیگری استفاده کنید."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"نشانی وب نادرست. باید با مرورگر اینترنت خود FOOBAR را جستجو کرده و همان نشانی "
+"وب را در اینجا رونوشت کنید/بچسبانید."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "جستجو"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "گزینه‌های موتور جستجو"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "جستجوی %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "پرونده‌های torrent"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "جستجو تمام شد"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "موتورها"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "جستجوی torrentها در چندین موتور جستجوی رایج torrent"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "می‌خواهید torrent را بارگیری یا ذخیره کنید؟"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Torrent بارگیری"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "بارگیری"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "توده %1 را نمی‌توان بار کرد"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "دگرساز+۱"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "ردیابها"
+
+#, fuzzy
+#~ msgid "Alt+N"
+#~ msgstr "دگرساز+۱"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "دگرساز+۱"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr "محل‌یاب کشور برای وصلۀ عنصر اطلاعات. پرچمها از http://flags.blogpotato.de/ گرفته شده‌اند، پس جا دارد که از آنها هم تشکر کنیم."
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "باید حداقل یک ردیاب اضافه کنید."
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "بارگیری‌شده"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "دگرساز+۱"
+
+#, fuzzy
+#~ msgid "Alt+U"
+#~ msgstr "دگرساز+۱"
+
+#, fuzzy
+#~ msgid "Alt+A"
+#~ msgstr "دگرساز+۱"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "دگرساز+۱"
+
+#~ msgid "Max ratio:"
+#~ msgstr "ضریب بیشینه:"
+
+#~ msgid "Name"
+#~ msgstr "نام"
+
+#~ msgid "Author"
+#~ msgstr "نویسنده"
+
+#~ msgid "IP filter plugin, filters out unwanted peers"
+#~ msgstr "وصلۀ پالایۀ IP، پالایه‌های خارج از جفتهای ناخواسته"
+
+#~ msgid "Shows logging output in a widget"
+#~ msgstr "ثبت خروجی در یک عنصر را نمایش می‌دهد"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "بارگیری کامل شد"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "نشانی وب ردیاب:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "وضعیت ردیاب:"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "درگاه مشخص udp )%1( در دسترس نیست یا به وسیلۀ کاربرد دیگری استفاده می‌شود. KTorrent به درگاه %2 محدود است."
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "برگزیدن پوشه برای ذخیره در"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "بارگیریها %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "بارگذاریها %1/%2"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "موتورهای جستجو"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "پرونده‌های Torrent"
+
+#~ msgid "Tracker"
+#~ msgstr "ردیاب"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "وضعیت"
+
+#~ msgid "You need to have default save directory selected to load torrents silently."
+#~ msgstr "لازم است که فهرست راهنمای ذخیرۀ پیش‌فرض برگزیده برای بار کردن خاموش torrentها را داشته باشید."
+
+#~ msgid "Cannot bind to port %1 or the 10 following ports."
+#~ msgstr "نمی‌توان به درگاه %1 یا ۱۰ درگاه زیر مقید شد."
+
+#~ msgid "finished"
+#~ msgstr "پایان یافت"
+
+#~ msgid "You must fill in the name field."
+#~ msgstr "باید حوزۀ نام را پر کنید."
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr "نمی‌توان بیش از %n بارگیری را آغاز کرد. اگر می‌خواهید حد را تغییر دهید، به تنظیمات ->پیکربندی KTorrent بروید."
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr "نمی‌توان بیش از %n دانه را آغاز کرد. اگر می‌خواهید حد را تغییر دهید، به تنظیمات -> پیکربندی KTorrent بروید."
+
+#~ msgid "Torrent moved to download panel"
+#~ msgstr "Torrent به تابلوی بارگیری حرکت کرد"
+
+#~ msgid "<b>%1</b> torrent has been moved to download panel."
+#~ msgstr "<b>%1</b> torrent به تابلوی بارگیری حرکت کرده است."
+
+#~ msgid "Show \"torrent finished\" popup messages"
+#~ msgstr "نمایش پیامهای بالاپر »torrent تمام شد«"
+
+#~ msgid "Secure connection with other clients. May also help if your ISP is shaping your traffic."
+#~ msgstr "اتصال امن با کارخواههای دیگر. اگر ISP شما شدآمدتان را شکل می‌دهد، ممکن است کمک کند."
+
+#~ msgid "Name:"
+#~ msgstr "نام:"
+
+#~ msgid "Select Filter File with IP Ranges in KTorrent Format"
+#~ msgstr "برگزیدن پروندۀ پالایه با گستره‌های IP در قالب KTorrent"
+
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "از پالایۀ &KTorrent استفاده شود؟‌"
+
+#~ msgid "Select Level1 Filter File (from Bluetack.co.uk or Openmedia.info)"
+#~ msgstr "برگزیدن پروندۀ پالایۀ سطح ۱ )از Bluetack.co.uk یا Openmedia.info("
+
+#~ msgid "Use level&1 filter?"
+#~ msgstr "از پالایۀ سطح &۱ استفاده شود؟"
+
+#~ msgid "Note: ZIP file from bluetack.co.uk is now supported."
+#~ msgstr "نکته: در حال حاضر، از پروندۀ ZIP bluetack.co.uk پشتیبانی می‌شود."
+
+#~ msgid "IP filter file"
+#~ msgstr "پروندۀ پالایۀ IP"
+
+#~ msgid "Unreachable"
+#~ msgstr "غیرقابل دسترس"
+
+#~ msgid "Completed"
+#~ msgstr "کامل"
+
+#~ msgid "Parse error"
+#~ msgstr "خطای تجزیه"
diff --git a/translations/fr/Makefile.am b/translations/fr/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/fr/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/fr/messages/Makefile.am b/translations/fr/messages/Makefile.am
new file mode 100644
index 0000000..1e563b7
--- /dev/null
+++ b/translations/fr/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = fr
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/fr/messages/ktorrent.po b/translations/fr/messages/ktorrent.po
new file mode 100644
index 0000000..0cde854
--- /dev/null
+++ b/translations/fr/messages/ktorrent.po
@@ -0,0 +1,5095 @@
+# translation of ktorrent.po to
+# traduction de ktorrent.po en Français
+# Sylvain Garsault <sylvain.garsault@freesbee.fr>, 2005.
+# Nicolas Ternisien <nicolas.ternisien@gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2005-08-12 11:06+0100\n"
+"Last-Translator: Matthieu Robin <kde@macolu.org>\n"
+"Language-Team: <kde-francophone@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.1\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Info"
+
+#: apps/ktorrent/ktorrent.cpp:185
+#, fuzzy
+msgid "Data transferred during the current session"
+msgstr "Données transférées au cours de la session"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Vitesse cumulée de l'ensemble des torrents"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "Préférences"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+#, fuzzy
+msgid "Set max upload rate"
+msgstr "Vitesse maximale d'envoi :"
+
+#: apps/ktorrent/ktorrent.cpp:574
+#, fuzzy
+msgid "Set max download rate"
+msgstr "Taux de téléchargement maximal :"
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "Torrent Files"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Ouvrir un emplacement"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Vitesse (env. / récept.) : %1 / %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "Transferées (env. / récept.) : %1 / %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "KTorrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "Sélectionnez un fichier où enregistrer le torrent"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Téléchargements"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "Envoyé"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Impossible de créer le torrent : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Recreate"
+msgstr "Cré&er"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "Télécharger"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Cré&er"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "infini"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Un client Bittorrent pour KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Mode de débogage"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Document à ouvrir"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Options du fichier"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+#, fuzzy
+msgid "Application icon and a couple of others"
+msgstr "L'icône de l'application"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "L'icône de téléchargement"
+
+#: apps/ktorrent/main.cpp:134
+#, fuzzy
+msgid "1.0 application icon"
+msgstr "L'icône de l'application"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "Options du fichier"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Options du fichier"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Options du fichier"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Options du fichier"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+#, fuzzy
+msgid "You must select a file or a folder."
+msgstr "Vous devez sélectionner un fichier ou un dossier."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "Vous devez ajouter au moins un pisteur."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+#, fuzzy
+msgid "Choose File to Save Torrent"
+msgstr "Sélectionnez un fichier où enregistrer le torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Création de %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "Nom :"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "Pisteurs"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Envoyé"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "L'icône de téléchargement"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Télécharger"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Envoyé"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Créer un torrent"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "Télécharger"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Envoyé"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "KTorrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "Télécharger"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Enregistrer le torrent ?"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Enregistrer le torrent ?"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Clients connectés"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Annonce manuelle"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "L'icône de téléchargement"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Préférences"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Options de téléchargement"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, fuzzy, no-c-format
+msgid "General Options"
+msgstr "Options du fichier"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Options du fichier"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "État"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Téléchargé"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Taille"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Envoyé"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Vitesse de réception"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Vitesse d'envoi"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Temps restant"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "Clients"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "Clients"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "Complet à %"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Téléchargé"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "Temps restant"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "KTorrent"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"1 client\n"
+"%n clients"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:378
+#, fuzzy
+msgid "Remove Download"
+msgstr "Télécharger"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Voulez-vous télécharger le torrent ?"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "L'icône de téléchargement"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "Créer un torrent"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+#, fuzzy
+msgid "Download completed"
+msgstr "Téléchargement terminé"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Téléchargement terminé"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+#, fuzzy
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "Le pisteur a renvoyé l'erreur suivante : %1"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr ""
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+#, fuzzy
+msgid "Cannot open index file %1 : %2"
+msgstr "Impossible d'ouvrir le fichier en cache"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Nicolas Ternisien,Dimitri Dias"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "nicolas.ternisien@gmail.com,sylvain.garsault@freesbee.fr"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Télécharger"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "Télécharger"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Démarrer le parta&ge du torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Télécharger"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "Télécharger"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Dossier où placer les fichiers temporaires :"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Télécharger"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Enregistrer &automatiquement les téléchargements vers :"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barre d'outils de téléchargement"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Démarrer le parta&ge du torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "Vitesse maximale d'envoi :"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Taux de téléchargement maximal :"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "ko/s (0 pour illimité)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "Client"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port :"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, fuzzy, no-c-format
+msgid "Banned Peers"
+msgstr "Clients connectés"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Nombre maximum de téléchargements :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, fuzzy, no-c-format
+msgid "Maximum seeds:"
+msgstr "Nombre maximum de téléchargements :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "Non démarré"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "Non démarré"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 pour illimité)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Taux de téléchargement maximal :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "Nombre maximum de téléchargements :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, fuzzy, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Nombre maximum de connexions par téléchargements :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "UDP tracker port:"
+msgstr "Requête vers le pisteur en cours"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Vitesse maximale d'envoi :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "ko/s (0 pour illimité)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(0 pour illimité)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Garder en partage une fois le téléchargement terminé"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, fuzzy, no-c-format
+msgid "Status:"
+msgstr "État"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, fuzzy, no-c-format
+msgid "Tracker:"
+msgstr "Pisteurs"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, fuzzy, no-c-format
+msgid "Torrent"
+msgstr "KTorrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "Envoyé"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "Envoyé"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, fuzzy, no-c-format
+msgid "C&ancel"
+msgstr "An&nuler"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Créer un torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, fuzzy, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Le fichier ou le dossier sur lequel créer un torrent :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Vous devez ajouter au moins un pisteur."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Options du fichier"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Taille de chaque morceau :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "ko"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Démarrer le parta&ge du torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Commentaires :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "Cré&er"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "An&nuler"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Pisteurs"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Nom :"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Préférences"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "Moteur de recherche actuel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Préférences"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Nombre maximum de connexions par téléchargement (0 pour illimité)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Requête vers le pisteur en cours"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, fuzzy, no-c-format
+msgid "Number of chunks found :"
+msgstr "Nombre total de morceaux :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Nombre maximum de téléchargements (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, fuzzy, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Nombre maximum de téléchargements (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, fuzzy, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Nombre maximum de connexions par téléchargement (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, fuzzy, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Nombre maximum de connexions par téléchargement (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Vitesse d'envoi maximale en ko/s (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, fuzzy, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Vitesse maximale de téléchargement en ko/s (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Nombre maximum de téléchargements (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Nombre maximum de téléchargements (0 pour illimité)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Afficher dans la boîte à miniatures"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Laisser en partage une fois le téléchargement terminé"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Dossier où placer les fichiers temporaires"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, fuzzy, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Enregistrer &automatiquement les téléchargements vers :"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, fuzzy, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Dossier où placer les fichiers téléchargés"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Enregistrer &automatiquement les téléchargements vers :"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Dossier où placer les fichiers téléchargés"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Enregistrer &automatiquement les téléchargements vers :"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Dossier où placer les fichiers temporaires"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, fuzzy, no-c-format
+msgid "U&nload"
+msgstr "Télécharger"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Télécharger"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, fuzzy, no-c-format
+msgid "Ports Forwarded"
+msgstr "Téléchargé"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Préférences"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, fuzzy, no-c-format
+msgid "Search Preferences"
+msgstr "Préférences"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, fuzzy, no-c-format
+msgid "Chunks"
+msgstr "Morceau&x"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, fuzzy, no-c-format
+msgid "Currently downloading:"
+msgstr "Morceaux en cours de téléchargement :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, fuzzy, no-c-format
+msgid "Downloaded:"
+msgstr "Téléchargé"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, fuzzy, no-c-format
+msgid "Excluded:"
+msgstr "Morceaux téléchargés :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, fuzzy, no-c-format
+msgid "Size:"
+msgstr "Taille"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Morceau"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Progression"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Client"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Clients connectés"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, fuzzy, no-c-format
+msgid "Seeders:"
+msgstr "Clients"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, fuzzy, no-c-format
+msgid "Average Down Speed:"
+msgstr "Vitesse de réception"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, fuzzy, no-c-format
+msgid "Average Up Speed:"
+msgstr "Vitesse d'envoi"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Pisteurs"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Parties du fichier qui ont été téléchargées :"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Parties du fichier qui ont été téléchargées :"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "Pisteurs"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Pisteurs"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Pisteurs"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Pisteurs"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, fuzzy, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Morceaux en cours de téléchargement :"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, fuzzy, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Préférences"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, fuzzy, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Télécharger le torrent"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, fuzzy, no-c-format
+msgid "Converting..."
+msgstr "Création de %1..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Nombre maximum de téléchargements :"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Nombre maximum de téléchargements :"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "Clients"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "Client"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Envoyé"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Clients"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Télécharger le torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "KTorrent"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "Clients"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Préférences"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Progression"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "Télécharger"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, fuzzy, no-c-format
+msgid "upload:"
+msgstr "Envoyé"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, fuzzy, no-c-format
+msgid "* zero means no limit"
+msgstr "(0 pour illimité)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, fuzzy, no-c-format
+msgid "Debug"
+msgstr "Mode de débogage"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "Préférences"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, fuzzy, no-c-format
+msgid "Search:"
+msgstr "Chercher"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, fuzzy, no-c-format
+msgid "Scheduler:"
+msgstr "Clients"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, fuzzy, no-c-format
+msgid "General:"
+msgstr "Options du fichier"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, fuzzy, no-c-format
+msgid "Search Engines"
+msgstr "Moteur de recherche :"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, fuzzy, no-c-format
+msgid "Search engine name:"
+msgstr "Moteur de recherche :"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Chercher"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Moteur de recherche :"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Moteur de recherche actuel"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 Go"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 Mo"
+
+#: libktorrent/interfaces/functions.cpp:39
+#, fuzzy
+msgid "%1 KB"
+msgstr "%1 Go"
+
+#: libktorrent/interfaces/functions.cpp:41
+#, fuzzy
+msgid "%1 B"
+msgstr "%1 Mo"
+
+#: libktorrent/interfaces/functions.cpp:47
+#, fuzzy
+msgid "%1 KB/s"
+msgstr "%1 ko/sec"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+#, fuzzy
+msgid "Cannot open log file %1 : %2"
+msgstr "Impossible d'ouvrir le fichier journal « %1 »"
+
+#: libktorrent/util/file.cpp:87
+#, fuzzy
+msgid "Cannot write to %1 : %2"
+msgstr "Impossible de créer le torrent : %1"
+
+#: libktorrent/util/file.cpp:101
+#, fuzzy, c-format
+msgid "Cannot read from %1"
+msgstr "Impossible de créer le torrent : %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Impossible de créer le dossier « %1 » : %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Impossible de créer un lien symbolique de « %1 » vers « %2 » : %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Impossible de déplacer « %1 » vers « %2 » : %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Impossible de copier « %1 » vers « %2 » : %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Impossible de supprimer « %1 » : %2"
+
+#: libktorrent/util/fileops.cpp:251
+#, fuzzy
+msgid "Cannot create %1: %2"
+msgstr "Impossible de supprimer « %1 » : %2"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+#, fuzzy
+msgid "Cannot open %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Loaded"
+msgstr "Envoyé"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Not loaded"
+msgstr "Téléchargé"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+#, fuzzy
+msgid "Plugin Options"
+msgstr "Options du fichier"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+#, fuzzy
+msgid "Cannot open file %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Résultat illégal : %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Erreur de décodage"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Fin de l'entrée non attendue"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Impossible de convertir « %1 » en entier"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+#, fuzzy
+msgid "Torrent is incomplete!"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrent corrompu !"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+#, fuzzy
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Erreur d'analyse"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Une erreur est apparue lors du chargement du fichier torrent. La cause la plus "
+"probable est que ce fichier est corrompu, ou qu'il n'est pas du tout au format "
+"torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+#, fuzzy
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Une erreur est apparue lors du chargement du fichier torrent. La cause la plus "
+"probable est que ce fichier est corrompu, ou qu'il n'est pas du tout au format "
+"torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Voulez-vous télécharger le torrent ?"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+#, fuzzy
+msgid "Cannot migrate %1 : %2"
+msgstr "Impossible de supprimer « %1 » : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+#, fuzzy
+msgid "Select Folder to Save To"
+msgstr "Sélectionnez un dossier de destination"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Non démarré"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Partage"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Téléchargement"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "En pause"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+#, fuzzy
+msgid "Error stopping torrent %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+#, fuzzy
+msgid "Error starting torrent %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Client inconnu"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 client\n"
+"%n clients"
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "Impossible de supprimer « %1 » : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, fuzzy, c-format
+msgid "Error reading from %1"
+msgstr "Impossible de créer le torrent : %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+#, fuzzy
+msgid "Error writing to %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, fuzzy, c-format
+msgid "Error writing to %1"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "Pisteurs"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Impossible de créer le fichier index : %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+#, fuzzy
+msgid "Cannot open file : %1 : %2"
+msgstr "Impossible d'ouvrir le fichier « %1 » : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Options du fichier"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "Options du fichier"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+#, fuzzy
+msgid "loaded"
+msgstr "Envoyé"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Options du fichier"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Options du fichier"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "Téléchargements"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "Téléchargement terminé"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "Téléchargements"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+#, fuzzy
+msgid "Pending"
+msgstr "Partage"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "(0 pour illimité)"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "Impossible de créer le torrent : %1"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Client"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Étouffé"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Snobé"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "Envoyé"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Préférences"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+#, fuzzy
+msgid "Status: Not loaded."
+msgstr "Téléchargé"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+#, fuzzy
+msgid "File Exists"
+msgstr "Options du fichier"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter"
+msgstr "Préférences"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter Options"
+msgstr "Options du fichier"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "État"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Clients"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Téléchargement terminé"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Afficher dans la &boîte à miniatures"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Nombre maximum de connexions par téléchargements :"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Nombre maximum de connexions par téléchargements :"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Nom :"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Pisteurs"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "KTorrent"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "(0 pour illimité)"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Vitesse de réception"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Vitesse de réception"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Vitesse de réception"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Clients"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Clients"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "Torrent files"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "Impossible de supprimer « %1 » : %2"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, fuzzy, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Impossible de créer le torrent : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr ""
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "Temps restant"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "Options du fichier"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "Moteur de recherche actuel"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "Options du fichier"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+#, fuzzy
+msgid "You must enter the search engine's name and URL"
+msgstr "Vous devez remplir le nom."
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+#, fuzzy
+msgid "Search Engine Options"
+msgstr "Moteur de recherche :"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "Recherche de %1..."
+
+#: plugins/search/searchwidget.cpp:209
+#, fuzzy
+msgid "torrent files"
+msgstr "Fichiers Torrent (« *.torrent »)"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Recherche terminée"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Moteur de recherche :"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+#, fuzzy
+msgid "Do you want to download or save the torrent?"
+msgstr "Voulez-vous télécharger le torrent ?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Télécharger le torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Impossible de créer le torrent : %1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Pisteurs"
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "Vous devez ajouter au moins un pisteur."
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "Téléchargé"
+
+#~ msgid "Form1"
+#~ msgstr "Form1"
+
+#, fuzzy
+#~ msgid "Form2"
+#~ msgstr "Form1"
+
+#, fuzzy
+#~ msgid "Name"
+#~ msgstr "Nom :"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Téléchargement terminé"
+
+#, fuzzy
+#~ msgid "Tracker URL:"
+#~ msgstr "Pisteurs"
+
+#, fuzzy
+#~ msgid "Tracker status:"
+#~ msgstr "Pisteurs"
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Sélectionnez un dossier de destination"
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Téléchargements"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Envoyé"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "KTorrent"
+
+#, fuzzy
+#~ msgid "Tracker"
+#~ msgstr "Pisteurs"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "Ét&at"
+
+#, fuzzy
+#~ msgid "Tracker request timed out"
+#~ msgstr "Pisteurs"
+
+#~ msgid "finished"
+#~ msgstr "terminé"
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "Moteur de recherche :"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "Téléchargement terminé"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "Téléchargement terminé"
+
+#, fuzzy
+#~ msgid "Completed"
+#~ msgstr "Complet à %"
+
+#~ msgid "Parse error"
+#~ msgstr "Erreur d'analyse"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "Chercher"
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Impossible de démarrer plus d'un téléchargement. Allez dans « Configuration » / « Configurer KTorrent » si vous souhaitez modifier cette limite.\n"
+#~ "Impossible de démarrer plus de %n téléchargements. Allez dans « Configuration » / « Configurer KTorrent » si vous souhaitez modifier cette limite."
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Impossible de démarrer plus d'un téléchargement. Allez dans « Configuration » / « Configurer KTorrent » si vous souhaitez modifier cette limite.\n"
+#~ "Impossible de démarrer plus de %n téléchargements. Allez dans « Configuration » / « Configurer KTorrent » si vous souhaitez modifier cette limite."
+
+#, fuzzy
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "Fichiers Torrent (« *.torrent »)"
+
+#~ msgid "You must fill in the name field."
+#~ msgstr "Vous devez remplir le nom."
+
+#, fuzzy
+#~ msgid "Down:"
+#~ msgstr "Téléchargé"
+
+#, fuzzy
+#~ msgid "KTorrent's UPnP plugin"
+#~ msgstr "Moteur de recherche actuel"
+
+#, fuzzy
+#~ msgid "KTorrent's IP filter plugin"
+#~ msgstr "Moteur de recherche actuel"
+
+#, fuzzy
+#~ msgid "KTorrent's log viewer plugin"
+#~ msgstr "Moteur de recherche actuel"
+
+#, fuzzy
+#~ msgid "KTorrent's search plugin"
+#~ msgstr "Moteur de recherche actuel"
+
+#, fuzzy
+#~ msgid "Downlo&ad"
+#~ msgstr "Télécharger"
+
+#, fuzzy
+#~ msgid "&Seed"
+#~ msgstr "Partage"
+
+#~ msgid "yes"
+#~ msgstr "oui"
+
+#~ msgid "no"
+#~ msgstr "non"
+
+#, fuzzy
+#~ msgid "Cannot preallocate diskspace : %s"
+#~ msgstr "Impossible de créer le fichier index : %1"
+
+#, fuzzy
+#~ msgid "&Status"
+#~ msgstr "État"
+
+#, fuzzy
+#~ msgid "Unable to open cache file: %1"
+#~ msgstr "Impossible d'ouvrir le fichier en cache"
+
+#~ msgid "You must add a least one tracker."
+#~ msgstr "Vous devez ajouter au moins un pisteur."
+
+#~ msgid "Can't open index file"
+#~ msgstr "Impossible d'ouvrir le fichier index"
+
+#~ msgid "Can't save chunk_info file : %1"
+#~ msgstr "Impossible d'enregistrer le fichier « chunk_info » : %1"
+
+#~ msgid "The download %1 has finished. Do you want to save it now?"
+#~ msgstr "Le téléchargement %1 est terminé. Voulez-vous l'enregistrer maintenant ?"
+
+#~ msgid "Do Not Save"
+#~ msgstr "Ne pas enregistrer"
+
+#, fuzzy
+#~ msgid "The tracker %1 sent the following error : %2"
+#~ msgstr "Le pisteur a renvoyé l'erreur suivante : %1"
+
+#, fuzzy
+#~ msgid "Tracker error : %1"
+#~ msgstr "Pisteurs"
+
+#, fuzzy
+#~ msgid "The tracker %1 is down."
+#~ msgstr "Le pisteur « %1 » semble être arrêté, interruption du téléchargement."
+
+#, fuzzy
+#~ msgid "The tracker is down."
+#~ msgstr "Le pisteur « %1 » semble être arrêté, interruption du téléchargement."
+
+#, fuzzy
+#~ msgid "The tracker %1 did not send a proper response"
+#~ msgstr "Le pisteur « %1 » n'a pas envoyé de réponse correcte, arrêt du téléchargement"
+
+#~ msgid "Start"
+#~ msgstr "Démarrer"
+
+#~ msgid ""
+#~ "The following error occurred: %1\n"
+#~ "Stopping download ..."
+#~ msgstr ""
+#~ "L'erreur suivante est apparue : %1\n"
+#~ "Arrêt du téléchargement..."
+
+#~ msgid "Chunks downloaded:"
+#~ msgstr "Morceaux téléchargés :"
+
+#, fuzzy
+#~ msgid "Speed (up/down):<br>"
+#~ msgstr "Vitesse (env. / récept.) :<br>"
+
+#, fuzzy
+#~ msgid "<br>Transfered (up/down):<br>"
+#~ msgstr "<br>Transferées (env. / récept.) :<br>"
+
+#~ msgid "Download stopped"
+#~ msgstr "Téléchargement arrêté"
+
+#~ msgid "Seeding + %1"
+#~ msgstr "Partage + %1"
+
+#~ msgid "%1 + %2"
+#~ msgstr "%1 + %2"
diff --git a/translations/gl/Makefile.am b/translations/gl/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/gl/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/gl/messages/Makefile.am b/translations/gl/messages/Makefile.am
new file mode 100644
index 0000000..73c415d
--- /dev/null
+++ b/translations/gl/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = gl
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/gl/messages/ktorrent.po b/translations/gl/messages/ktorrent.po
new file mode 100644
index 0000000..37f784f
--- /dev/null
+++ b/translations/gl/messages/ktorrent.po
@@ -0,0 +1,5156 @@
+# translation of ktorrent.po to Galician
+#
+# mvillarino <mvillarino@users.sourceforge.net>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2006-09-02 12:55+0200\n"
+"Last-Translator: mvillarino <mvillarino@users.sourceforge.net>\n"
+"Language-Team: Galician <trasno@ceu.fi.udc.es>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informazón"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Dados transferidos durante a sesión actual"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Velocidade actual de todos os torrentes"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupos"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Comezar"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Parar"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Comezar todo"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Parar todo"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Apegar o URL do Torrente..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Abrir o xestor da Cola..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Pór/Sacar da Cola"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Filtro de IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Verificar a integridade dos dados"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Definir a taxa máxima de envio"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Definir a taxa máxima de obtenzón"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Ficheiros Torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Todos os Ficheiros"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Abrir a Localizazón"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Velocidade envio: %1 / obtenzón: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "Enviado: %1 / obtido: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 nós, %2 tarefas"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: apagado"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Todos os Torrentes"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "S&ubir"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "S&ubir"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "S&ubir"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Debe indicar unha IP no formato \"XXX.XXX.XXX.XXX\". Tamén pode usar carácteres "
+"de substituizón para rangos, como \"127.0.0.*\"."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Escolla un ficheiro"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Escolla o ficheiro onde guardar"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL Non válido."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Recepzóns"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Envios"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+#, fuzzy
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"O porto indicado (%1) non está disponíbel ou está a ser utilizado por outra "
+"aplicazón. KTorrent está a utilizar o porto %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Non foi posíbel criar o torrente: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+#, fuzzy
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Faltan vários ficheiros de dados do torrente \"%1\"; desexa criá-los de novo ou "
+"prefere non obté-los?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Criar de novo"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Non Obter"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Non foi posíbel criar de novo os ficheiros en falta: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Faltan ficheiros de dados"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Non foi posíbel deseleccionar os ficheiros en falta : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+#, fuzzy
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Falta o ficheiro onde están guardados os dados do torrente \"%1\"; desexa "
+"criá-lo de novo?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Criar de novo"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Non foi posíbel criar de novo os ficheiros de dados : %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Falta o ficheiro de dados"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "A Verificar a Integridade dos Dados"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "infinito"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Erro ao analisar os dados : %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "A analisar á procura de anacos :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Un programa de BitTorrent para KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Modo de depurazón"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "O documento a abrir"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "Extensións"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Opzóns Xerais"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Ícone da aplicazón e alguns máis"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "O ícone de transferéncias"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Ícone da aplicazón 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Axuda da ChunkBar e ordenazón do IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "País"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Prioridade do ficheiro"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+"Miniupnp foi usado como exemplo para a nosa própria implementazón de UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Rota ao cartafol 1"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Rota ao cartafol 1"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Rota ao cartafol 1"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Indica se se debe abrir o torrente de forma silenciosa ou non."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Debe escoller un ficheiro ou un cartafol."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+#, fuzzy
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Se desmarca un ficheiro, perderá todos os dados dese ficheiro. Está seguro de "
+"que quer facer isto?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "Debe engadir polo menos un localizador."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Ficheiros Torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Escolla un Ficheiro para Guardar o Torrente"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "A criar %1 ..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Grupos Personalizados"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Novo Grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Editar o Nome"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Borrar o Grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Introduza o nome do grupo."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+#, fuzzy
+msgid "The group %1 already exists."
+msgstr "O grupo %1 xa existe."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Introduza o novo nome do grupo."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Envios"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+#, fuzzy
+msgid "Queued uploads"
+msgstr "En espera"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "O ícone de transferéncias"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "obtenzón:"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Envios"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Criar Torrente"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "obtenzón:"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Envios"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Todos os Torrentes"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "obtenzón:"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Criar Torrente"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Criar Torrente"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Engadir parceiro:"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Anúncio Manual"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Antevisión"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "O ícone de transferéncias"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Eliminar do Grupo"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+#, fuzzy
+msgid "Add to Group"
+msgstr "Engadir ao Grupo"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, fuzzy, no-c-format
+msgid "Speed Limits"
+msgstr "Limite de velocidade en KB/s"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "Enderezo IP do parceiro"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Preferéncias"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opzóns de Transferéncia"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+#, fuzzy
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "O porto DHT debe ser diferente do porto UDP do localizador!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Xeral"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opzóns Xerais"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Non foi posíbel procurar %1: %2\n"
+"Indique un enderezo IP ou nome de máquina válido."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Opzóns da Pesquisa en Cartafoles"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Estado"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Obtido"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Tamaño"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Enviado"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Veloc. Recepzón"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Veloc. Envio"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tempo Restante"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "Parceiros Completos:"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "Parceiros Incompletos:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Completo"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "Taxa de compartizón:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Obtido"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "Tempo Restante"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Todos os Torrentes"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Non se pode iniciar mais de 1 recepzón, \n"
+"Non se poden iniciar mais de %n recepzóns, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"e 1 fonte. \n"
+"e %n fontes. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Vaia para Configurazón -> Configurar KTorrent, se desexa modificar os límites."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Ainda non se acabou de obter o torrente %1; desexa borrar tamén os dados "
+"incompletos?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Borrar Transferéncia"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+#, fuzzy
+msgid "Delete Data"
+msgstr "Borrar após carre&gar"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+#, fuzzy
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Se desmarca un ficheiro, perderá todos os dados dese ficheiro. Está seguro de "
+"que quer facer isto?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Desexa transferir ou guardar o torrente?"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "O ícone de transferéncias"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Desmarcou os seguintes ficheiros existentes. Perderán-se todos os dados destes "
+"ficheiros; está seguro de que quer facer isto?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Si, borrar os ficheiros"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Non, manter os ficheiros"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Usuário"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Xestor da Cola"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Non (torrente privado)"
+
+#: apps/ktorrent/trayicon.cpp:90
+#, fuzzy
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<center><b>KTorrent</b></center><table cellpadding='2' cellspacing='2' "
+"align='center'> "
+"<tr> "
+"<td><b>Velocidade:</b></td> "
+"<td></td></tr> "
+"<tr>"
+"<td>Recepzón: <font color='#1c9a1c'>%1</font></td> "
+"<td>Envio: <font color='#990000'>%2</font></td></tr> "
+"<tr> "
+"<td><b>Transferéncias:</b></td> "
+"<td></td></tr> "
+"<tr>"
+"<td>Recepzón: <font color='#1c9a1c'>%3</font></td> "
+"<td>Envio: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "Acabou de obter-se <b>%1</b>.<br>Velocidade média: %2 Rec / %3 Env."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Transferéncia completa"
+
+#: apps/ktorrent/trayicon.cpp:165
+#, fuzzy
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> acadou a taxa máxima de compartizón de %2 e foi parado. "
+"<br>Enviaron-se %3 a unha velocidade meia de %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Completou a compartizón"
+
+#: apps/ktorrent/trayicon.cpp:184
+#, fuzzy
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> acadou a taxa máxima de compartizón de %2 e foi parado. "
+"<br>Enviaron-se %3 a unha velocidade meia de %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> foi parado polo seguinte erro: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+#, fuzzy
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> acadou a taxa máxima de compartizón de %2 e foi parado. "
+"<br>Enviaron-se %3 a unha velocidade meia de %4."
+
+#: apps/ktorrent/trayicon.cpp:232
+#, fuzzy
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> acadou a taxa máxima de compartizón de %2 e foi parado. "
+"<br>Enviaron-se %3 a unha velocidade meia de %4."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "A analisar á procura de anacos :"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Non se pode iniciar mais de 1 recepzón, \n"
+"Non se poden iniciar mais de %n recepzóns, "
+
+#: apps/ktorrent/trayicon.cpp:256
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Non se pode iniciar mais de 1 recepzón, \n"
+"Non se poden iniciar mais de %n recepzóns, "
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Limite de velocidade en KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Sen límite"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+#, fuzzy
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Limite de velocidade en KB/s"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Unha Componente KPart de KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Non foi posíbel abrir o ficheiro do índice %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "mvillarino"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "mvillarino@users.sourceforge.net"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Escolla Que Ficheiros Desexa Obter"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Obter"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Group:"
+msgstr "Grupos"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "Controlado polo &Usuário"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Comezar a comparti&r o torrente"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Obter"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Escoll&er todo"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Escoller &Nada"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Inverter a Seleczón"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "obtenzón:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Cifraxe"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Usar a cifraxe do protocolo"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Permitir conexóns non-cifradas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Se a opzón non estivese sinalada, só se poderá conectar a clientes que soporten "
+"a cifraxe."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Protocolo <b>D</b>istributed <b>H</b>ash <b>T</b>able (Táboa de Dispersión "
+"Distribuida). "
+"<br>Os parceiros descentralizados comparten os dados do protocolo. Consulte o "
+"manual para máis informazóns."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Usar DHT para obter mais parceiros"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Porto de UDP para a comunicazón do DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP Personalizado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Enviar ao localizador un IP o&u nome de máquina personalizado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "IP ou nome de máquina personalizado:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Cartafoles"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Cartafol onde guardar os ficheiros temporáis:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Non obté-los"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Guardar &automaticamente os ficheiros obtidos en:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "torrentes"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barra de Transferéncias"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Comezar a comparti&r o torrente"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "Taxa máxima de envio:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Taxa máxima de obtenzón:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 é ilimitado)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "Parceiro"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Porto:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Lista Negra de KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Nota: a lista-negra só se aplica á sesión actual. Use guardar/abrir para "
+"guardar as entradas ou use a extensión de Filtro de IPs (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Parceiros Rexeitados"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Enderezo IP do parceiro"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Engadir parceiro:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Engade un parceiro á lista-negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Borra o parceiro actual da lista-negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Limpar"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Valeira esta lista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Guardar &Como..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Guarda esta lista-negra para ser usada coa extensión de Filtrado de IP de "
+"KTorrent"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Máximo de transferéncias:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Máximo de fontes:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, fuzzy, no-c-format
+msgid "Minimum disk space:"
+msgstr "A reservar o espazo en disco"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "Non iniciado"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "Non iniciado"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 é ilimitado)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Taxa máxima de obtenzón:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Global connection limit:"
+msgstr "Limite global de conexóns"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "Taxa de compartizón:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Máximo de conexóns por torrente:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Número de envios concomitantes:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Porto UDP do localizador:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "Taxa de compartizón:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Taxa máxima de envio:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/s (0 é ilimitado)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(0 é ilimitado)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Continuar a compartir após completar a recepzón"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Aviso"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Os portos acima deben ser re-encamiñados se estivese por trás dun enrotador. A "
+"extensión de UPnP poderá facer iso por si."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Diálogo da Cola de KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Estado:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Localizador:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Taxa de compartizón:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Bytes restantes:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrente"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Controlada por"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Envio&s"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Enviado:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "S&ubir"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "&Baixar"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "S&ubir"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Controlado por &QM"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Controlado polo &Usuário"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Apegar o URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "C&ancelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Criar Torrente"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "O ficheiro ou cartafol do cal desexa criar un torrente:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Debe engadir polo menos un localizador."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opzóns do Ficheiro"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Tamaño de cada anaco:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Comezar a comparti&r o torrente"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Torrente privado (non se permite o DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Comentários:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "Cri&ar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Ca&ncelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Localizadores"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Nada"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "IP ou nome de máquina personalizado:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Porto"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Preferéncias de Procura"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "Motor de procuras actual"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Preferéncias"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Utilizazón da memória:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Baixa"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Média"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Alta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Intervalo de actualizazón da interface:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, fuzzy, no-c-format
+msgid "Data Checking"
+msgstr "A verificar os dados"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Número máximo de conexóns por torrente (0 = sen limite)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Porto UDP do localizador:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "A analisar os dados"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, fuzzy, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "A analisar á procura de anacos :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Número de anacos achados:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Número de anacos fallados / non obtidos :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Verificar"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Número máximo de transferéncias (0 = sen limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Número máximo de fontes (0 = sen limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Número máximo de conexóns por torrente (0 = sen limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Número máximo de conexóns para todos os torrentes (0 = sen limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Velocidade máxima de envio en KB/s (0 = sen limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Velocidade máxima de recepzón en KB/s (0 = sen limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "A taxa máxima de compartizón foi atinxida."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "A taxa máxima de compartizón foi atinxida."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Mostrar un ícone na bandexa do sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Mostra mensaxes ao rematar os torrentes."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Continuar a compartir após completar a obtenzón"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Cartafol onde guardar os ficheiros temporais"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Indica se debe guardar automaticamente os ficheiros obtidos no cartafol de "
+"guardado"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Cartafol onde guardar os ficheiros obtidos"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Indica se debe guardar automaticamente os ficheiros obtidos no cartafol de "
+"guardado"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Cartafol onde guardar os ficheiros obtidos"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Indica se debe guardar automaticamente os ficheiros obtidos no cartafol de "
+"guardado"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Cartafol onde guardar os ficheiros temporais"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Indica se debe usar un IP personalizado a pasar ao localizador"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP a pasar ao localizador"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Utilizazón da memória"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Intervalo de actualizazón da interface"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Soporte para DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Porto do DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Número de envios concomitantes"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Xestor de extensións"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Carregar"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "De&scarregar"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Carregar Todos"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Descarregar Todos"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Dispositivo UPnP a usar por omisión"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Dispositivos detectados:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Dispositivo"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Portos Re-encamiñados"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, fuzzy, no-c-format
+msgid "WAN Connection"
+msgstr "Conexóns:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, fuzzy, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Re-encamiñar os Portos"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Desfacer o re-encamiñamento de Portos"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Pesquisar de Novo"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Activar a pesquisa do cartafol1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Activar a pesquisa do cartafol2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Activar a pesquisa do cartafol3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Rota ao cartafol 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Rota ao cartafol 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Rota ao cartafol 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Indica se se debe abrir o torrente de forma silenciosa ou non."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Foi sinalada a aczón de borrado."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Foi sinalada a aczón de mover."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Preferéncias do Exame de Cartafoles"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Examinar o cartafol &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Examinar o cartafol &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Examinar o cartafol &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Mover para o cartafol \"carregado\" &após carregar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Move o torrente para o cartafol \"carregado\" após te-la carregado"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Abrir silenc&iosamente os torrentes"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Non mostra o diálogo \"Escoller os ficheiros a obter\""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Borrar após carre&gar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Borra o torrente após carregá-la"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Cartafoles a examinar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Cartafol 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Cartafol 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Cartafol 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Preferéncias de Procura"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "Re-encamiñar os Portos"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "Escoller &Nada"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "Usuário"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "Re-encamiñar os Portos"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Opzóns Xerais"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Anacos"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Total:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "A receber:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Obtido:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Excluido:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Tamaño:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Anaco"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Evoluzón"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Parceiro"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Parceiros Asinados"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Parceiros Completos:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Parceiros Incompletos:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Velocidade Media de Recepzón:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Velocidade Media de Envio:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Próxima actualizazón en:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Estado do Localizador:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Partes do torrente que foron obtidas:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Partes do torrente que están disponíbeis:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "A compartir"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"O seu envio será parado cando a proporzon atinxa este valor. Cero significa sen "
+"limites."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, fuzzy, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"O seu envio será parado cando a proporzon atinxa este valor. Cero significa sen "
+"limites."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, fuzzy, no-c-format
+msgid "Ratio limit:"
+msgstr "Limite global de conexóns"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "O limite só funciona no modo de fonte"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "&Usar límite?"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "&Actualizar o localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Intervalo mínimo de actualizazón - 60 segundos"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Engadi&r un localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Borrar o Localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Cam&biar de Localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Repor as predefinizóns"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Mostrar páxina de parceiros na fiestra principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Mostrar páxina de anacos obtidos na fiestra principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Mostrar a páxina de localizadores na fiestra principal"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Mostrar lista de parceiros"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Mostrar a l&ista de anacos a transferir actualmente"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Mostrar lista de localizadores"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Preferéncias do Bloqueo de IPs"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Escoller ficheiro de filtro de PeerGuardian"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Usar filtro PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Ficheiro de filtro de IPs:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Obter/Co&nverter"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Obteña o filtro PeerGuardian de bluetack.co.uk ou blocklist.org.\n"
+"NOTA: Supon-se que se obterá un ficheiro zip de bluetack.co.uk."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL de filtro de Nível 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Usar filtro de nível 1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "A converter..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Prema no botón \"converter\" para comezar a conversión do ficheiro \"antip2p\". "
+"NOTA: Este proceso pode levar tempo, mesmo en máquinas rápidas, durante ese "
+"tempo non poderá usar KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "Intervalo de actualizazón da interface"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Máximo de fontes:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Máximo de fontes:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "Parceiros"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "Parceiro"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "Conexóns:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Envios"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "Conexóns:"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Parceiros"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Transferir Torrente"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, fuzzy, no-c-format
+msgid "Connections mesurments count"
+msgstr "Sinal de mensaxes de conexóns"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importa unha transferéncia existente"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrente:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Dados:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Indique o torrente e os dados xa transferidos para esa torrente."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importar"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "Engadir Prede&finizón"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "Parceiros Completos:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Filtro de IP"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "Todos os Ficheiros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Evoluzón"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "Proporzón máxima:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, fuzzy, no-c-format
+msgid "Te&st"
+msgstr "Verificar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "Rota ao cartafol 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Planificador do ancho de banda"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Categoria do botón esquerdo"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Categor&ia 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Apagar"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Categoria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Categoria &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Categoria do botón direito"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Categoria &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Categoria 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Categorias"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "obtenzón:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "envio:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "*cero significa ilimitado"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Guardar nun ficheiro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Ler dun ficheiro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Reiniciar a planificazón"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Páxina de Preferéncias da Extensión de Planificazón"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Usar o planificador do ancho de &banda?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Planificazón do Ancho de Banda"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Usar cores en ve&z de imaxes?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Recomendado para os sistemas máis lentos)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Editar a &planificazón"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Activar a planificazón do ancho de banda?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Usar cores en vez de imaxes?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Usar texto formatado no rexisto"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Sinal de mensaxes de informazón xeral"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Sinal de mensaxes de conexóns"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Sinal de mensaxes DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Sinal de mensaxes de informazón do localizador"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Sinal de mensaxes de informazón da E/S do disco"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Sinal das mensaxes da extensión de IPFilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Sinal das mensaxes da extensión de pesquisa"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Sinal das mensaxes da extensión PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Sinal das mensaxes da extensión InfoWidget"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Sinal das mensaxes da extensión de UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Sinal das mensaxes da extensión de Pesquisa de Cartafoles"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Sinal das mensaxes da extensión de Planificazón"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Sinal das mensaxes da extensión de pesquisa"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Sinal das mensaxes da extensión de IPFilter"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Opzóns do Visor do Rexisto"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Extensións"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Todo"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Depurazón"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Aviso"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Importante"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Nada"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "Filtro de IPs:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Procurar:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Pesquisa de cartafoles:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Planificador:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Opzóns Xerais"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistema"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Xeral:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Conexóns:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "E/S Disco:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Usar te&xto formatado no rexisto"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, fuzzy, no-c-format
+msgid "Custom browser path:"
+msgstr "Grupos Personalizados"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Infra-estruturas de procura"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Nome do motor de procuras:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Engadir"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Motores"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "B&orrar todo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Engadir Prede&finizón"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "Actualizar de Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Procurar"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Motor de pesquisas:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Motor de procuras actual"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dia \n"
+"%n dias"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Si, Primeiro"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Si, Último"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Non foi posíbel abrir o ficheiro de rexisto %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Non foi posíbel escreber en %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Non foi posíbel ler de %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Non foi posíbel criar o cartafol %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Non foi posíbel criar unha ligazón simbólica de %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Non foi posíbel mover de %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Non foi posíbel copiar de %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Non foi posíbel borrar %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Non foi posíbel criar %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Non foi posíbel calcular o tamaño do ficheiro %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Non foi posíbel calcular o tamaño do ficheiro : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Non foi posíbel aceder a %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Non foi posíbel expandir o ficheiro : %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Non foi posíbel expandir o ficheiro %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Non foi posíbel procurar no ficheiro : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Non foi posíbel escreber para alén do buffer de \"mmap\"!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Carregado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Non carregado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opzóns da Extensión"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Non foi posíbel aceder ao ficheiro %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "O cartafol %1 non existe"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Elemento ilegal: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Erro de descodificazón"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Fin de dados inesperado"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Non foi posíbel converter %1 nun inteiro"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "O torrente está incompleto!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrente corrompido!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "O torrente non ten un campo de anuncio ou de nós"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Non foi posíbel aceder ao ficheiro de torrente %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Erro de Procesamento"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Ocorreu un erro ao carregar o torrente. Poida que estexa corrompida, ou non ser "
+"sequer un torrente."
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Ocorreu un erro ao carregar o torrente. Poida que estexa corrompida, ou non ser "
+"sequer un torrente."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Non foi posíbel aceder ao ficheiro de torrente %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+#, fuzzy
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Xa está a obter este torrente, a lista de localizadores de ambos os torrentes "
+"foi xuntada."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Desexa transferir ou guardar o torrente?"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Non é posíbel migrar %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"O torrente %1 foi iniciado cunha versión anterior de KTorrent. Para garantir "
+"que este torrente funciona con esta versión de KTorrent, será migrada. "
+"Pedirá-se o lugar onde guardar o torrente. Se preme en Cancelar, escollerá-se o "
+"seu cartafol persoal."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Escoller o Cartafol Onde Guardar"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Non iniciado"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "A espallar"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "A obter"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Pasado"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Parado"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Erro: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "A reservar o espazo en disco"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "En espera"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "A verificar os dados"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Se desmarca un ficheiro, perderá todos os dados dese ficheiro. Está seguro de "
+"que quer facer isto?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy, c-format
+msgid "Insufficient disk space for %1"
+msgstr "A reservar o espazo en disco"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"O torrente \"%1\" atinxiu a taxa máxima de compartizón. Desexa ignorar o limite "
+"e comezar a espallar ainda asi?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "A taxa máxima de compartizón foi atinxida."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Erro ao parar o torrente %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Erro ao iniciar o torrente %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Cliente descoñecido"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 parceiro\n"
+"%n parceiros"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Non foi posíbel criar o ficheiro %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Non foi posíbel guardar o primeiro anaco no ficheiro DND : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Non foi posíbel guardar o último anaco no ficheiro DND : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Non foi posíbel expandir o ficheiro : %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Non foi posíbel expandir o ficheiro %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Non foi posíbel expandir o ficheiro %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Erro : A ler após a fin do ficheiro %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Erro ao ler de %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Erro ao escreber en %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Erro ao escreber en %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Non foi posíbel reservar espazo en disco : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+"Non foi posíbel vincular-se ao porto UDP %1 ou aos 10 portos seguintes."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "Resposta non válida"
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr "Resposta non válida"
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "Resposta non válida"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Non foi posíbel criar o ficheiro %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Non foi posíbel criar o ficheiro de índice: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Non foi posíbel aceder ao ficheiro : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Usa UPnP para encamiñar automaticamente os portos no seu enrotador"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Non foi posíbel achar o servizo de encamiñamento na descrizón do dispositivo!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Dispositivos UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Pesquisa en cartafoles automaticamente á procura de torrentes e carrega-os."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Pesquisa en cartafoles"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Pesquisa en cartafoles"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opzóns da Pesquisa en Cartafoles"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "carregado"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+#, fuzzy
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Pesquisa en cartafoles - cartafol %1: URL non válido ou cartafol non existente. "
+"Por favor, escolla un cartafol válido."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Opzóns Xerais"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+#, fuzzy
+msgid "Please enter a new password for the web interface."
+msgstr "Introduza o novo nome do grupo."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "O cartafol %1 non existe"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Opzóns Xerais"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Obter de preferéncia"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Obter normal"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Obter ao último"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "Todos os Ficheiros"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Disponíbel"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Pendente"
+
+#: plugins/infowidget/fileview.cpp:343
+#, fuzzy
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Desmarcou os seguintes ficheiros existentes. Perderán-se todos os dados destes "
+"ficheiros; está seguro de que quer facer isto?"
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "&Usar límite?"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Fiestra de Informazón"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Mostra informazón adicional acerca dunha transferéncia, como os anacos obtidos, "
+"cantos parceiros completos e incompletos hai..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Non pode engadir un localizador a un torrente privado."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Non pode borrar o localizador predefinido do torrente."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Non pode engadir localizadores a un torrente privado"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "País"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Cliente"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Atascado"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Ignorado"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Disponibilidade"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Pontuazón"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Espazo de Envío"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Pedidos"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+#, fuzzy
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Expulsar ao Parceiro"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; -Anacos Disponíbeis "
+"<br><img src=\"unavailable_color\">&nbsp; - Anacos Non Disponíbeis "
+"<br><img src=\"excluded_color\">&nbsp; - Anacos Excluidos"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opzóns da Fiestra de Informazón"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Anacos Obtidos "
+"<br><img src=\"unavailable_color\">&nbsp; - Anacos a Transferir "
+"<br><img src=\"excluded_color\" >&nbsp; - Anacos Excluidos"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Converter"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "A carregar o ficheiro TXT..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Aguarde por favor..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "O ficheiro foi convertido."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Non foi posíbel carregar o filtro:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"O ficheiro de filtro non é válido. Pode estar corrompido ou ter un formato non "
+"válido."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Filtro de IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Estado: Carregado e en execuzón."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Estado: Non carregado."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Estado: <font color=\"#ff0000\">O ficheiro do filtro non foi atopado.</font> "
+"Obteña e converta o ficheiro do filtro."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "O ficheiro escollido xa existe, desexa obté-lo de novo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "O Ficheiro Existe"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"O ficheiro do filtro (level1.dat) xa existe, desexa converté-lo de novo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtro de Bloqueo de IPs"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opzóns do Filtro de Bloqueo de IPs"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Estado"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Conexóns:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Conexóns:"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Mostrar o ícone na bande&xa do sistema"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Máximo de conexóns por torrente:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Máximo de conexóns por torrente:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Nada"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Localizadores"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+#, fuzzy
+msgid "Speed statistics"
+msgstr "Limite de velocidade en KB/s"
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "Conexóns:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Torrente"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "&Usar límite?"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Velocidade Media de Recepzón:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Velocidade Media de Recepzón:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Velocidade Media de Recepzón:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Parceiros Incompletos:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Cartafoles"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Ficheiros de torrente"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Todos os ficheiros"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Non foi posíbel verificar os dados : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Non foi posíbel carregar o torrente: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importa torrentes parciais ou completos de outros clientes"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importar unha transferéncia existente"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+#, fuzzy
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Pesquisa en cartafoles automaticamente á procura de torrentes e carrega-os."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Descrizón"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "Proporzón máxima:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "Tempo Restante"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Planificazón"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opzóns da extensión de planificazón"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "LUN"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "MAR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "MER"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "XOV"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "VEN"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SÁB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "DOM"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "A planificazón foi guardada."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "O ficheiro non foi atopado."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "A planificazón foi lida."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Extensión de planificazón do ancho de banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Abrir a Planificazón do Ancho de Banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"A planificazón do ancho de banda está desactivada. Vaia a Preferéncias->"
+"Planificazón para activá-la."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Visor do Rexisto"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Visor do Rexisto"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Utilice o seu navegador Web para procurar o texto %1 (en maiúsculas) no motor "
+"de procuras que desexe engadir. Cópie entón o URL na barra de enderezos após a "
+"procura terminar, e apégue-a aqui. "
+"<br>Por exemplo se procura %2 en Google resulta en "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. Se engade aqui este "
+"URL ktorrent pode procurar usando Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Debe indicar o nome do motor de procuras e o URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Xa existe un motor de procuras co mesmo nome. Utilice un nome diferente."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"URL non válido. Debe procurar FOOBAR co seu navegador Web e copiar e apegar o "
+"URL exacto aqui."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Procura"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opzóns de Motor de Procuras"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "A procurar %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrentes"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Pesquisa terminada"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Motores"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Procura torrentes en varios motores de procura de torrentes coñecidos"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Desexa transferir ou guardar o torrente?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Transferir Torrente"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Transferir"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Non foi posíbel carregar o anaco %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Localizadores"
+
+#, fuzzy
+#~ msgid "Alt+N"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr "O sistema de localizazón de países da extensión InfoWidget. As bandeiras proveñen de http://flags.blogpotato.de/, grazas."
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "Debe engadir polo menos un localizador."
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "Obtido"
+
+#, fuzzy
+#~ msgid "Alt+K"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+U"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+A"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+1"
+
+#~ msgid "Max ratio:"
+#~ msgstr "Proporzón máxima:"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "Author"
+#~ msgstr "Autor"
+
+#~ msgid "IP filter plugin, filters out unwanted peers"
+#~ msgstr "Un extensión de filtraxe de IP, que filtra os parceiros non desexados"
+
+#~ msgid "Shows logging output in a widget"
+#~ msgstr "Mostra o resultado de rexisto nunha fiestra"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Transferéncia completa"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "URL do Localizador:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "Estado do localizador:"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "O porto UDP indicado (%1) non está disponíbel ou está a ser utilizado por outra aplicazón. KTorrent está a utilizar o porto %2."
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Escoller o Cartafol Onde Guardar"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Recepzóns %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Envios %1/%2"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "Infra-estruturas de procura"
+
+#~ msgid "Torrents"
+#~ msgstr "Torrentes"
+
+#~ msgid "Tracker"
+#~ msgstr "Localizador"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "Estado"
+
+#~ msgid "You need to have default save directory selected to load torrents silently."
+#~ msgstr "Debe escoller o cartafol onde guardar por omisión para carregar os torrentes silenciosamente."
+
+#, fuzzy
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "InfoWidgetBase"
+#~ msgstr "InfoWidget:"
+
+#~ msgid "Show \"torrent finished\" popup messages"
+#~ msgstr "Mostrar mensaxes de \"torrente terminada\""
+
+#~ msgid "Secure connection with other clients. May also help if your ISP is shaping your traffic."
+#~ msgstr "Conexón segura cos outros clientes. Tamén pode axudar se o seu ISP estivese a controlar o seu tráfego."
+
+#, fuzzy
+#~ msgid "Tracker request timed out"
+#~ msgstr "Estado do localizador:"
+
+#, fuzzy
+#~ msgid "Alt+G"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+1"
+
+#~ msgid "finished"
+#~ msgstr "finalizado"
+
+#~ msgid "Cannot bind to port %1 or the 10 following ports."
+#~ msgstr "Non foi posíbel vincular-se co porto %1 ou cos 10 portos seguintes."
+
+#, fuzzy
+#~ msgid "You will lose all data in the deselected file(s), are you sure you want to do this ?"
+#~ msgstr "Se desmarca un ficheiro, perderá todos os dados dese ficheiro. Está seguro de que quer facer isto?"
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "Infra-estruturas de procura"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "Transferéncia completa"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "Completou a compartizón"
+
+#~ msgid "Completed"
+#~ msgstr "Completado"
+
+#~ msgid "If you deselect a directory, you will lose all the data off all files in this directory. Are you sure you want to do this ?"
+#~ msgstr "Se desmarca un cartafol, perderá todos os dados dos ficheiros que conteña. Está seguro de que quer facer isto?"
+
+#~ msgid "Torrent moved to download panel"
+#~ msgstr "O torrente foi movido para para o panel de transferéncias"
+
+#~ msgid "<b>%1</b> torrent has been moved to download panel."
+#~ msgstr "O torrente <b>%1</b> foi movido para o panel de transferéncias."
+
+#, fuzzy
+#~ msgid "Alt+C"
+#~ msgstr "Alt+1"
+
+#~ msgid "Unreachable"
+#~ msgstr "Non alcanzábel"
+
+#~ msgid "Parse error"
+#~ msgstr "Erro de procesamento"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "Procurar"
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Non é posíbel iniciar máis que 1 transferéncia. Vaia a Configurazón -> Configurar KTorrent se quer mudar o limite.\n"
+#~ "Non é posíbel iniciar máis que %n transferéncias. Vaia a Configurazón -> Configurar KTorrent se quer mudar o limite."
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Non é posíbel iniciar máis de 1 fonte. Vaia a Configurazón -> Configurar KTorrent se quer mudar o limite.\n"
+#~ "Non é posíbel iniciar máis de %n fontes. Vaia a Configurazón -> Configurar KTorrent se quer mudar o limite."
+
+#, fuzzy
+#~ msgid "Alt+O"
+#~ msgstr "Alt+1"
+
+#~ msgid "Appl&y"
+#~ msgstr "A&plicar"
diff --git a/translations/hu/Makefile.am b/translations/hu/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/hu/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/hu/messages/Makefile.am b/translations/hu/messages/Makefile.am
new file mode 100644
index 0000000..a60c4c4
--- /dev/null
+++ b/translations/hu/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = hu
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/hu/messages/ktorrent.po b/translations/hu/messages/ktorrent.po
new file mode 100644
index 0000000..1be3476
--- /dev/null
+++ b/translations/hu/messages/ktorrent.po
@@ -0,0 +1,4880 @@
+# Hungarian translation of KTorrent
+#
+# Tamas Szanto <tszanto@interware.hu>, 2005.
+# Kováts Dóra <dorcssa@gmail.com>, 2007.
+# Kéménczy Kálmán <kkemenczy@novell.com>, 2007.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: KTorrent \n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-01-06 17:30+0100\n"
+"Last-Translator: Tamas Szanto <tszanto@interware.hu>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Rosetta-Export-Date: 2007-07-27 22:08:13+0000\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Nincs bejövő kapcsolat (lehet, hogy egy tűzfal miatt)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Információ"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Az aktuális munkafolyamatban átvitt adatmennyiség"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "A torrentek pillanatnyi sebessége összesen"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Csoportok"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Indítás"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Leállítás"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Minden torrent elindítása"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Minden torrent leállítása"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Torrent URL beillesztése..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Sorkezelő..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Sorkezelővel/egyedi vezérléssel"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-szűrő"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Az adatintegritás ellenőrzése"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Max. feltöltési sebesség"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Max. letöltési sebesség"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrentfájlok"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Minden fájl"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "A könyvtár megnyitása"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Sebesség le: %1 / fel: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Letöltve: %1 / feltöltve: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 csomópont, %2 feladat"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: ki"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Minden torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Keresés:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Nagybetűérzékeny"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Áthelyezés a bal dokkolóra"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Áthelyezés a jobb dokkolóra"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Áthelyezés az alsó dokkolóra"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Gyorsbillentyű hozzárendelése..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Gyorsbillentyű törlése"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "A gombszám módosítása"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Új gyorsbillentyűszám:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Az IP-címet 'XXX.XXX.XXX.XXX' formátumban kell megadni, valamint a "
+"címtartományok megadásához helyettesítő karakterek is használhatók (pl. "
+"127.0.0.*)."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Fájlválasztó"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Válassza ki a mentendő fájlt nevét"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Hibás formátumú URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Letöltések"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Feltöltések"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"A megadott port (%1) nem érhető el vagy egy másik alkalmazás használja. A "
+"KTorrent most a(z) %2 portot használja."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"A KTorrent nem tudja felépíteni a kapcsolatot, mert a(z) %1-%2 porttartományt "
+"egy másik program már használja."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Nem sikerült létrehozni ezt a torrentet: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"A(z) \"%1\" torrent néhány fájlja hiányzik. Le szeretné tölteni ezeket a "
+"fájlokat vagy inkább kihagyja?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Letöltés"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Nem kell letölteni"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Nem sikerült létrehozni a hiányzó fájlokat: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Hiányzó fájlok"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Nem lehet megszüntetni a hiányzó fájlok kijelöltségét: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Hiányzik egy fájl a(z) \"%1\" torrent mentési könyvtárából. Létre szeretné "
+"hozni?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Nem kell létrehozni"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Nem sikerült létrehozni ezt a fájlt: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Hiányzó fájl"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Az adatintegritás ellenőrzése"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "végtelen"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Hiba történt az adatok vizsgálatakor: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Ellenőrzés: <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "KDE-alapú BitTorrent-kliens"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Nyomkövetési mód"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Megnyitandó dokumentum"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS bővítmény"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Webes felület bővítmény"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statisztika bővítmény"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Alkalmazásikon és más ikonok"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Letöltési ikon"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 alkalmazásikon"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "A ChunkBar tippjei és az IWFileTreeItem rendezése"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Országkereső az InfoWidget bővítményhez (Ez a termék a MaxMind által készített "
+"GeoLiteadatokat tartalmazza, amely a http://www.maxmind.com/ oldalon "
+"található). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Országzászlók"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Fájlprioritás"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "A Miniupnp program mintájára készült a saját UPnP-megvalósításunk"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Globális max. megosztási arány (folt)"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconf-kiegészítések"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk webes felület"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl-kód a KDevelopból"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "A konvertálási sebesség javítása az IP-szűrő modulban"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "2 biztonsági hiba felfedezése (mindkettő javítva)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Folt a rákérdezés nélküli betöltéshez"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Javítások a webes felület PHP-kódjában"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS-specifikus lemezfoglalás"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "A nagyon alacsony sebességek elrejtése (folt)"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Folt az esetleges tűzfalazás kijelzéséhez"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Javítások"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Folt a menüsor elrejtéséhez"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Folt a fájlprioritás módosításához a webes felületen"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Foltok a webes felülethez"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Folt a szűrő eszköztárhoz"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Folt: szálak nélküli fájlnézetfrissítés"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Optimalizálás az SHA1 hash készítéséhez"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Folt a szabad lemezterület kiszámításához FreeBSD redszerekben"
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Folt a rákérdezés nélküli betöltéshez"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Ki kell választani egy fájlt vagy könyvtárat."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Egy követőt sem vett fel, biztosan így szeretné létrehozni a torrentet?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Legalább egy csomópontot fel kell venni."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrentfájlok (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Válassza ki a mentendő fájl nevét"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "%1 létrehozása..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Egyedi csoportok"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Új csoport"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Név szerkesztése"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Csoport eltávolítása"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Lap megnyitása"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Adja meg a csoport nevét."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "A(z) %1 nevű csoport már létezik."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Adjon meg új csoportnevet."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktív feltöltések"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Sorkezelős feltöltések"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Sorkezelős letöltések"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Egyedi vezérlésű letöltések"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Egyedi vezérlésű feltöltések"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Inaktív torrentek"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Inaktív letöltések"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Inaktív letöltések"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktív torrentek"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktív letöltések"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Eltávolítás"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Eltávolítás (adatokkal együtt)"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Partner hozzáadása"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "További partnerforrások"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Torrent partnerforrások:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "PEX"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Kézi bejelentés"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Előnézet"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Könyvtár megnyitása"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Letöltési könyvtár"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Ideiglenes könyvtár"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "A letöltési könyvtár beállítása"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Eltávolítás a csoportból"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Hozzáadás a csoporthoz"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Sebességkorlátok"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "A torrent nem létezik. Jelentse ezt a hibát a KTorrent fejlesztőknek."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Lehetséges partner hozzáadása."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Hibásan megadott IP-cím."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Beállítások"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Letöltési beállítások"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "A DHT portnak különböznie kell az UDP tracker portjától."
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Általános"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Általános beállítások"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"%1 lekérdezése nem sikerült: %2\n"
+"Érvényes gépnevet vagy IP-címet kell megadni."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Speciális"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Speciális beállítások"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Látható oszlopok"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Állapot"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Letöltve"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Méret"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Feltöltve"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Sebesség le"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Sebesség fel"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Hátralevő idő"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Feltöltők"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Letöltők"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "Kész %"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Arány"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Letöltési idő"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Feltöltési idő"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Minden torrent %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr "Legfeljebb %n letöltés, illetve "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "%n feltöltés folyhat egyszerre. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Ha meg szeretné változtatni az értékeket: Beállítások -> "
+"A KTorrent beállításai."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"A(z) %1 torrent letöltése még tart. Biztosan törölni szeretné az eddig "
+"letöltött adatokat is?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "A letöltés eltávolítása"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Az adatok törlése"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Az adatok megtartása"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Az összes letöltött adat elvész. Biztosan ezt szeretné?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "A(z) %1 torrent ellenőrzése már folyamatban van!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Adja meg a letöltési könyvtárat (%1)"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Megszüntette az alábbi, már létező fájlok kijelöltségét. Ezek a fájlok "
+"véglegesen elvesznek, biztosan ezt szeretné?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Igen, törlés"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nem, maradjanak meg"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " hiányzik!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Egyedi"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Sorkezelő"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nem (privát torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Sebesség:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Letöltés: <font color='#1c9a1c'>%1</font></td>"
+"<td>Feltöltés: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Adatmennyiség:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Letöltés: <font color='#1c9a1c'>%3</font></td>"
+"<td>Feltöltés: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> letöltése befejeződött."
+"<br>Az átlagos sebesség: %2 le / %3 fel"
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "A letöltés befejeződött"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> elérte a maximális %2 megosztási arányt, és megállt. "
+"<br> %3 feltöltve, %4 átlagos sebességgel."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "A feltöltés befejeződött"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> elérte maximális feltöltési időt (%2 óra), ezért le lett állítva."
+"<br>Feltöltve %3, az átlagos sebesség %4 volt."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> le lett állítva a következő hiba miatt: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Hibás adatok vannak a(z) <b>%1</b> torrentben."
+"<br>Érdemes lefuttatni egy adatintegritás-ellenőrzést a torrentre."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> elérte maximális megosztási arányát (%2) és nem állítható sorba. Ha "
+"folytatni kívánja a megosztást, távolítsa el a korlátozást."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> elérte a maximális megosztási időt (%2 óra) és nem állítható sorba. A "
+"megosztás folytatásához saját kezűleg kell eltávolítania a korlátozást."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "A torrent nem helyezhető be a sorba."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Nem sikerült elindítani a(z) <b>%1</b> torrentet: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr "Legfeljebb %n torrent osztható meg.<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr "Legfeljebb %n torrent letöltése folyhat egyszerre. <br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "A torrent nem indítható el"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Nem áll rendelkezésre elegendő lemezterület."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"A lemezen el fog fogyni a szabad terület. <br /><b>%1</b> "
+"a következőre lesz letöltve: \"%2\"."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "A torrent leállítva.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Az eszközön el fog fogyni a szabad terület"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Sebességkorlát (KB/mp)"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Korlátlan"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "<b>%1</b> sebességkorlátozásai:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Moduláris KDE-alkalmazás"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Nem sikerült megnyitni a(z) %1 indexfájlt: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Szántó Tamás, Kováts Dóra, Kelemen Gábor, Kéménczy Kálmán"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"tszanto@interware.hu, dorcssa@gmail.com, kelemeng@gnome.hu, "
+"kkemenczy@novell.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Válassza ki a letöltendő fájlokat"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Letöltés ide:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Csoport:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "&Egyedi vezérlés"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Indítás"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Letöltés"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "M&inden kijelölése"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "A &kijelölés megszüntetése"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "A kijelölés invertálása"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Lemezterület"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Szükséges lemezterület:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Szabad lemezterület:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Letöltés után:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Titkosítás"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Titkosítás engedélyezése"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"A protokoll titkosításával megelőzhető, hogy az internetszolgáltató lelassítsa "
+"a bittorrent kapcsolatokat."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Nem titkosított kapcsolatok engedélyezése"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Ha nincs bejelölve, akkor csak titkosítást támogató partnerekhez lehet "
+"kapcsolódni."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able (elosztott hash tábla) protokoll."
+"<br>A követő nélküli üzemmód protokollja. További információ a kézikönyvben "
+"található."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "Partnerkeresés &DHT-vel is"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "A DHT-kommunikáció UDP-portja:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Egyéni IP-cím"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "A követőnek egyéni IP-cím vagy gépnév kül&dése"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Egyéni IP-cím vagy gépnév:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Rendszertálca-ikon"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Ikon megjelenítése a paneltál&cán"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Sebesség &megjelenítése a tálcán"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Felbukkanó üzenetek megjelenítése a rendszertálcán"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Feltöltési sebesség (KB/mp):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Letöltési sebesség (KB/mp):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Könyvtárak"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Az ideiglenes fájlok könyvtára:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "A befejezett letöltések átmozgatása ide:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "A letöltések &automatikus mentése ide:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "A torrentfájlok másolása ide:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Letöltési eszköztár"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "A torrent sebességkorlátozásainak beállítása"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maximális feltöltési sebesség:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maximális letöltési sebesség:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/mp (0 esetén nincs korlát)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Lehetséges partner hozzáadása"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Partner IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Adja meg a partner IP-címét és portszámát."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent feketelista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Megjegyzés: A feketelista csak az aktuális munkamenetre vonatkozik. A "
+"mentés/megnyitás használatával mentheti a bejegyzéseket, vagy használja az IP "
+"szűrő bővítményt (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Tiltott partnerek"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Tiltott partnerek IP-címei"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Cím hozzáadása:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Partner hozzáadása a feketelistához"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Eltávolítja a kijelölt partnert a feketelistáról"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Tö&rlés"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Lista törlése"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Mentés má&sként..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Ezen feketelista mentése a KTorrent IP szűrő bővítménye számára"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "A letöltések max. száma:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "A feltöltések max. száma:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Ha letöltés indításakor kevés a hely:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimális lemezterület:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Ne induljon el"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Kérjen megerősítést"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Induljon el"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 esetén nincs korlát)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maximális letöltési sebesség:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Engedélyezett kapcsolatok összesen:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Maximális megosztási idő:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "A kapcsolatok max. száma egy torrentnél:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Feltöltő pontok száma:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "A követő UDP-portja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maximális megosztási arány:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maximális feltöltési sebesség:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/mp (0 esetén nincs korlát)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Óra (0 esetén nincs korlát)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "A megosztás &folytatása a letöltés befejeződése után"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Figyelem"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"A fenti portokat át kell irányítani, ha útválasztót használ. Például az UPnP "
+"bővítmény segítségével ez elvégezhető."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Sorkezelő párbeszédablak"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Állapot:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Követő:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Arány:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Hátravan (bájt):"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Vezérlő"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Feltöltések"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Feltöltve:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "&Mozgatás felfelé"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "M&ozgatás lefelé"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Mozgatás legfelülre"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Mozgatás leg&alulra"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&Sorkezelővel vezérelt"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "&Egyedi vezérlésű"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "URL beillesztése"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Mégsem"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Torrent létrehozása"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Torrent létrehozása fájlból vagy könyvtárból:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Legalább egy követőt vagy csomópontot meg kell adnia."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Fájlbeállítások"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Darabméret:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Me&gosztás"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "El&osztott torrent (csak DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privát torrent (DHT letiltva)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Megjegyzés:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Létrehozás"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Mégsem"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Követők"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT csomópontok"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Csomópont:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP-cím vagy gépnév"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Megjegyzés: néhány megbízható GHT csomópont hozzá lett adva a listához. "
+"Valószínűleg a saját IP-címét és portszámát is meg kell adnia, ha engedélyezni "
+"szeretné mások számára a torrent elérését."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Speciális beállítások"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent algoritmus:</b> Az alapértelmezett algoritmus, a további "
+"algoritmusok kombinációjának használatával a tesztjeink alapján."
+"<br>\n"
+"<b>Aktuális sebesség algoritmus:</b> A legegyszerűbb algoritmus - Hátralévő "
+"bájtok/aktuális sebesség"
+"<br>\n"
+"<b>Globális átlagsebesség algoritmus:</b> Hátralévő bájtok/átlagos sebesség"
+"<br>\n"
+"<b>X ablak algoritmus:</b> A befejezési idő becslése X sebességminta alapján"
+"<br>\n"
+"<b>Mozgó átlag algoritmus:</b> X minta alapján számított mozgó átlagsebesség"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Aktuális sebesség"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Globális átlagsebesség"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "X ablak"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Mozgó átlag"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(újraindítás után lép életbe)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "&Lemezterület előzetes lefoglalásának letiltása"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Lemezterület teljes &előzetes lefoglalása (a töredezés elkerüléséhez)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Egyszerű (lassú)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "A fájlrendszer típusától függően"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Teljesítmény"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Memóriahasználat:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "kicsi"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "közepes"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "nagy"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "A felület frissítési időköze:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Gyors CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Lassú CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Adatellenőrzés"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Feltöltéskor &ne ellenőrizze az ennél nagyobb fájldarabokat"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Adat&integritási ellenőrzés"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "sérült fájldarab után"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Hálózatkezelés"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "A kapcsolatbeállítások max. száma:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP az IP-csomagokhoz:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Ne használja a KDE pro&xybeállításait HTTP követők eléréséhez"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP követő proxy:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Adatellenőrzés"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "A torrentadatok ellenőrzése:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "A megtalált fájldarabok száma:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Hibás vagy nem letöltött fájldarabok:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Próba"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "A letöltések max. száma (0 esetén nincs korlát)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "A feltöltések max. száma (0 esetén nincs korlát)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Letöltések elkezdése, ha kevés a hely?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "A kapcsolatok max. száma egy torrentnél (0 esetén nincs korlát)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "A kapcsolatok max. száma összesen (0 esetén nincs korlát) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maximális feltöltési sebesség, KB/mp (0 esetén nincs korlát)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maximális letöltési sebesség KB/mp-ben (0 = nincs korlát)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maximális megosztási arány (0 esetén nincs korlát)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "A megosztás maximális ideje órában (0 esetén nincs korlát)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Ikon megjelenítése a paneltálcán"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Sebesség megjelenítése a tálcaikonban"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Letöltési sebesség (kb/mp):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Felöltési sebesség (kb/mp):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Értesítő üzenet megjelenítése torrent befejeződésekor."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "A megosztás folytatása a letöltés befejeződése után"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Az ideiglenes fájlok könyvtára"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "A letöltések automatikus mentése ide"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "A letöltött fájlok könyvtára"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "A befejezett letöltések áthelyezendők-e a completedDir könyvtárba"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "A letöltött fájlok áthelyezése ebbe a mappába"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "A torrentfájlok automatikusan másolandók-e a torrentCopyDir mappába"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "A torrentfájlok másolása ebbe a mappába"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Egyéni IP-cím küldése a követőnek"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Az utolsó mentési könyvtár"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "A követőnek jelzett IP-cím"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Memóriahasználat"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "felületfrissítési ciklus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "DHT-támogatás"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT-port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Feltöltési helyek száma"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Oszlopok megjelenítése KTorrentView-ban"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Időbecslési algoritmus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Ha nincs elég lemezterület a letöltés befejezéséhez és a szabad lemezterület "
+"kisebb, mint a minDiskSpace, akkor a torrent leállításra kerül."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Bővítménykezelő"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Elindítás"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Leállítás"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Mindegyik &elindítása"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Mindegyik &leállítása"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Használni kívánt alapértelmezett UPnP eszköz"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Felismert eszközök:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Eszköz"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Átirányított portok"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN-kapcsolat"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "&Port átirányítása"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Portátirányítás visszavonása"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Újrakeresés"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Az 1. könyvtár ellenőrzése"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "A 2. könyvtár ellenőrzése"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "A 3. könyvtár ellenőrzése"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "1. könyvtár"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "2. könyvtár"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "3. könyvtár"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "A torrent megnyitása néma módban történjen-e."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Törlési művelet bejelölve."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Mozgatási művelet bejelölve."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "A bővítmény beállítása"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "&1. könyvtár"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "&2. könyvtár"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "&3. könyvtár"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Áthelyezés a \"betöltve\" könyv&tárba betöltés után"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "A torrent áthelyezése a \"betöltve\" könyvtárba betöltés után"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "A torrentek megnyitása néma mó&dban történjen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Ne jelenjen meg 'A letöltendő fájlok kiválasztása' ablak"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Törlés betöltés &után"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "A torrentek törlése betöltés után"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Átnézendő könyvtárak"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "1. könyvtár:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "2. könyvtár:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "3. könyvtár:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Keresési beállítások"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Webkiszolgáló"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Port átirányítása"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Munkamenet TTL (mp):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Felületstílus:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Felhasználónév:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Jelszó megváltoztatása..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "PHP programfájl útvonala:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Portszám"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Port átirányítása"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Munkamenet élettartama"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "felület"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "PHP végrehajtható fájl útvonala"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "felhasználónév"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "jelszó"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Fájldarabok"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Összesen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Jelenlegi letöltés:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Letöltve:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Kizárva:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Hátravan:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Méret:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Darab"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Előrehaladás"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Partner"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Hozzárendelt partnerek"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Feltöltők:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Letöltők:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Átlagos letöltési sebesség:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Átlagos feltöltési sebesség:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Következő frissítés:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "A követő állapota:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Letöltött fájldarabok:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Elérhető fájldarabok:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Megosztva"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"A feltöltés megáll, ha a megosztási arány eléri ezt az értéket. Nulla esetén "
+"nincs korlátozás."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "A feltöltés leáll ennyi órán át történő feltöltés után."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "óra"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Aránykorlát:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "A korlátozás csak feltöltő módban működik"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "I&dőkorlát:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Követő frissítése"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minimális frissítési időköz - 60 másodperc"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "&Követő hozzáadása"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Követő eltávolítása"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Követő &módosítása"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Alapértelmezések visszaállítása"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Partnerek lap létrehozása a főablakban"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Darabok lap létrehozása a főablakban"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Követők lap létrehozása a főablakban"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Partnerlista megjelenítése"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "A letöltés alatt álló fájl&darabok megjelenítése"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Követőlista megjelenítése"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP-szűrési beállítások"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Válasszon PeerGuardian szűrőfájlt "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "PeerGuardian szűrőt használata"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Szűrőfájl:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Letöltés/Ko&nvertálás"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"PeerGuardian szűrő letöltése a bluetack.co.uk vagy blocklist.org helyekről.\n"
+"MEGJEGYZÉS: A bluetack.co.uk helyről származó ZIP fájl támogatott."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Level1 szűrő URL"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Level1 szűrő használata?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Konvertálás..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Kattintson a 'Konvertálás' gombra az antip2p fájl átalakításához. Megjegyzés: "
+"ez a folyamat még gyors gépen is sokáig eltarthat. Ez idő alatt a KTorrent nem "
+"használható."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Frissítés"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Grafikonok frissítése minden"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "GUI frissítés"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Adatok gyűjtése minden"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "ezredmásodpercben"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maximum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Méretezési mód a maximális sebességnél:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Pontos"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Segítségért használja a \"Mi ez?\" menüpontot"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Az OY skála maximális értékének beállítása:\n"
+"- Legnagyobb: Globálisan elért legnagyobb sebesség\n"
+"- Pontos: A grafikonon látható legnagyobb elért sebesség"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Partnerek sebessége"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Partnerek sebessége:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "frissítés minden"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "grafikonadat-frissítés"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "Sok partner adatainak összegyűjtése processzorigényes lehet."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Partnerek kapcsolatai"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+"A nagy értékek olvashatatlanná tehetik a csatlakozott partnerek grafikonjait"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Források megjelenítése a rajokban"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Letöltők megjelenítése a rajokban"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Skálázási egység"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Feltöltés"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Kapcsolatok"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Partnerek"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Partnerek sebességgrafikonjának átváltása"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "A partnerek sebességéről történő adatkérések közti idő"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "A letöltők a rajokban történő rajzolásának átváltása"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "A források a rajokban történő rajzolásának átváltása"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "A letöltés mérőszámai"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Partnerek sebességének mérőszámai"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Feltöltés mérőszámai"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Kapcsolatok mérőszámai"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "DHT mérőszámai"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "OY tengely maximális mód"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Korábbi letöltés importálása"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrentfájl:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Adatok (fájl vagy könyvtár):"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Válasszon ki egy torrentfájlt és a torrentből letöltött fájlt (vagy a fájlokat "
+"tartalmazó könyvtárt)."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importálás"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "alapértelmezés"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS hírcsatornák"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Csatornák"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Törlés"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "Ú&j"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Hírek"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Automatikus &frissítés"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "Frissítés a&dott időközönként"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Frissítés"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Cím"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Hírek megtartási ideje (nap)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktív"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Szűrők"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Elfogadási szűrők"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Kihagyási szűrők"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Reguláris kifejezések"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Kezelés &sorozatként"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Feldolgozás"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Sorozatfeltétel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Egyezés epizód nélkül"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Max. epizód"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Max. évad"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Min. évad"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Min. epizód"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "&Tesztszöveg"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Próba"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "A szűrő illeszkedik"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Sávszélesség-ütemező"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Bal kattintás a kategóriára"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "&1. kategória"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "K&ikapcsolás"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "N&ormál"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "&3. kategória"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "&2. kategória"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Jobb kattintás a kategóriára"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "&1. kategória"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&3. kategória"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategóriák"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. kategória</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. kategória</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "letöltés:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "feltöltés:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/mp *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. kategória</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 esetén nincs korlát"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Mentés fájlba"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "Be&töltés fájlból"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Az ütemezés alapállapotba"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Beállítóoldal - Sávszélesség-ütemező"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Sá&vszélesség-ütemezés használata"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Sávszélesség-ütemező"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Színek használata ké&pek helyett"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Lassú gépeknél ajánlott)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Az ütemezés b&eállítása"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Bekapcsolja a sávszélesség-ütemezőt?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Színek használata képek helyett"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Formázott naplóüzenetek"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Általános üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Kapcsolódási üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "DHT üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Követőinformáció üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Lemezinformáció üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "IP-szűrő üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Keresőmodul üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Részleges fájlimportáló üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "InfoWidget üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "UPnP üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Helyi torrentkereső üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Ütemező üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "RSS bővítmény üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Webes felület bővítmény üzenetjelző"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Beállítások - Naplónézegető"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Bővítmények"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Mind"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Nyomkövetés"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Tájékoztató üzenetek"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Fontos üzenetek"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Nincs"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-szűrő:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Keresés:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Helyi torrentkereső:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Ütemező:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Fájlimportáló:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Információs ablak:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-kezelő:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Webes felület:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Rendszer"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Általános:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Kapcsolatok:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Lemezműveletek:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "&Formázott naplóüzenetek"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Külső böngésző"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Külső böngészőben történjen a keresés"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Alapértelmezett böngésző"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Más böngésző:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Keresők"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Név:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Hozzáadás"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Név"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Az összes &eltávolítása"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Ala&plista hozzáadása"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Frissítés az internetről"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Keresés"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Kereső:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "A jelenlegi kereső"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Egyéni böngésző használata"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Egyéni böngésző elérési útja"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/mp"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "%n nap "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Igen, az első"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Igen, az utolsó"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Nem sikerült megnyitni ezt a naplófájlt: %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Nem sikerült írni ezt a torrentet: %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Nem sikerült olvasni innen: %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Nem sikerült létrehozni a(z) %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Nem tudom szimbolikus linkelni: %1 ide: %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Nem sikerült átmozgatni: %1 -> %2, %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Nem sikerült átmásolni: %1 -> %2, %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Nem sikerült törölni: %1, %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Nem sikerült létrehozni: %1, %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Nem sikerült kiszámítani a(z) %1 fájl méretét: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Nem sikerült kiszámítani a fájlméretet: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Nem sikerült megnyitni a(z) %1 fájlt: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Nem sikerült kibontani ezt a fájlt: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Nem sikerült kiterjeszteni a fájlt"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Nem sikerült pozicionálni egy fájlban: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Nem lehet írni az mmap puffer végén túl."
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Állapot: <b>%2</b><br>Szerző: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Betöltve"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Leállítva"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "A bővítmények beállításai"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Nem sikerült megnyitni a(z) %1 fájlt: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "A(z) %1 könyvtár nem létezik"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Nem érvényes jel: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Dekódolási hiba"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Váratlan vége a bemenetnek"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Nem tudom a()z %1-t int-re"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "A torrent nincs kész."
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Hibás torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "A torrentnek nincs bejelentője vagy csomópontmezője"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Nem sikerült megnyitni a(z) %1 torrentfájlt: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Feldolgozási hiba"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Hiba történt a torrent betöltése közben. Valószínűleg hibás a torrentfájl vagy "
+"nem is torrentfájl.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Hiba történt a torrentfájl betöltése közben. Valószínűleg hibás a torrentfájl, "
+"sőt az is előfordulhat, hogy a fájl nem torrentfájl."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Nem sikerült létrehozni a(z) %1 torrentfájlt: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"A(z) %1 torrent letöltése már folyamatban van, a torrentekben lévő követők "
+"listái össze lettek vonva."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "A(z) %1 torrent letöltése már folyamatban van."
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Nem sikerült átállítani: %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"A(z) %1 torrent letöltése a KTorrent előző verziójában lett elkezdve. A "
+"torrentet át kell állítani a működésének biztosítása érdekében ezen KTorrent "
+"verzióval. A program bekéri a torrent mentési helyét. Ha a mégse lehetőséget "
+"választja, akkor a saját könyvtára lesz kiválasztva."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Válassza ki a mentési könyvtárat"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Nincs elindítva"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Megosztás"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Letöltés"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Megállt"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Leállítva"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Hiba: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Lemezterület foglalása"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Várakozósorban"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Adatellenőrzés"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Leállítva. nincs több hely az eszközön."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Nincs elegendő lemezterület a torrent letöltéséhez. Biztosan folytatni akarja?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "a lemezterület kevés a következőhöz: %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"A(z) \"%1\" torrent elérte a megengedett maximális megosztási arányt. Ennek "
+"ellenére el szeretné kezdeni a feltöltést?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Elérte a maximális megosztási arányt."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Nem sikerült leállítani a(z) %1 torrentfájlt: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Nem sikerült elindítani a(z) %1 torrentfájlt: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Közzététel"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Ismeretlen kliens"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "%n partner"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Nem sikerült létrehozni a(z) %1 fájlt: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Nem sikerült kiírni az első fájldarabot a DND fájlba: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Nem sikerült kiírni az utolsó fájldarabot a DND fájlba: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "%1 nem írható: a fájlrendszer írásvédett"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Nem sikerült kibontani a(z) %1 fájlt: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Nem sikerült kibontani a(z) %1 fájlt: írási hiba"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Nem sikerült kibővíteni a fájlt: %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Hiba: A(z) %1 fájl vége elérve olvasáskor"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Nem sikerült olvasni innen: %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Nem sikerült írni: %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Nem sikerült írni: %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Nem sikerült előre lefoglalni lemezterületet: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Nem lehet a(z) %1 udp portra vagy a 10 következő portra csatlakozni."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Hibás válasz a trackertől"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Hibás adat a trackertől"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Hibás tracker URL"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Nem sikerült megnyitni a(z) %1 fájlt: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Nem sikerült létrehozni egy indexfájlt: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Nem sikerült megnyitni a(z) %1 fájlt: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Portok átirányítása az útválasztón UPnP segítségével"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Nem található portátirányító szolgáltatás az eszköz leírásában."
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP eszközök"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Torrentek automatikus keresése és betöltése adott könyvtárakból."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Helyi torrentkereső"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Helyi torrentkereső"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Beállítások - Helyi torrentkereső"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "betöltve"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Helyi torrentkereső - %1 könyvtár: érvénytelen URL vagy a könyvtár nem létezik. "
+"Válasszon egy érvényes könyvtárat."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Webes felület"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Webes felület beállításai"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"A PHP programfájl nincs benne az alapértelmezett elérési útvonalban, ezért "
+"kérjük adja meg az útvonalat."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Adjon meg új jelszót a webes felülethez."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "a(z) %1 létezik és futtatható"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "a(z) %1 nem létezik"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "a(z) %1 nem futtatható"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "a(z) %1 egy könyvtár"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "a(z) %1 nem a PHP programfájl útvonala"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Webes felület"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "A program kezelése böngészőn keresztül"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Letöltés először"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Normál letöltés"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Letöltés utoljára"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Fájlok törlése"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Elérhető"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Folyamatban"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr "A kijelölt fájlok tartalma el fog veszni, biztosan ezt szeretné?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Nincs korlát"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Információs ablak"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"További adatokat mutat meg a letöltésről, például mely darabok vannak már "
+"letöltve, hány letöltő és feltöltő partner van stb."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Nem lehet követőt rendelni privát torrenthez."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Nem lehet eltávolítani a torrent alapértelmezett követőjét."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Nem lehet követőt rendelni privát torrenthez"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP-cím"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Ország"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Kliens"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Akadozik"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Lefulladt"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Elérhető darabok"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Pontszám"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Feltöltő pont"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Kérések"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Partner kirúgása"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Partner letiltása"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; -Elérhető darabok:"
+"<br><img src=\"unavailable_color\">&nbsp; - Nem elérhető darabok:"
+"<br><img src=\"excluded_color\">&nbsp; - Kizárt darabok:"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Az információs ablak beállításai"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Letöltött darabok:"
+"<br><img src=\"unavailable_color\">&nbsp; - Letöltendő darabok:"
+"<br><img src=\"excluded_color\">&nbsp; - Kizárt darabok:"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Konvertálás"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Szöveges fájl betöltése..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Egy kis türelmet..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "A fájl átkonvertálása megtörtént."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Nem tudom a szűrőt betölteni:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Hibás szűrőfájl. Lehet, hogy a fájl megsérült vagy nem megfelelő a formátuma."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "A nemkívánatos partnerek kiszűrése IP-cím alapján"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP-szűrő"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Állapot: elindult."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Állapot: nincs elindítva."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Állapot: <font color=\"#ff0000\">A szűrőfájl nem található.</font> "
+"Szűrőfájl letöltése és konvertálása."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "A kiválasztott fájl már létezik, le szeretné tölteni újra?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "A fájl létezik"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "A szűrőfájl (level1.dat) már létezik, szeretné konvertálni ismét?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-szűrő"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IP-szűrési beállítások"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statisztika"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Statisztika beállításai"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Kapcsolódott letöltők"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Letöltők (rajban)"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Kapcsolódott feltöltők"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Feltöltők (rajban)"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Kapcsolódott letöltők (átlagosan, torrentenként)"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Kapcsolódott feltöltők (átlagosan, torrentenként)"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Kapcsolódott letöltők (átlagosan, futó torrentenként)"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Kapcsolódott feltöltők (átlagosan, futó torrentenként)"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Csomópontok"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Feladatok"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Statisztikát jelenít meg a le- és feltöltésekről"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Sebességstatisztika"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Kapcsolatstatisztika"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Pillanatnyi"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Átlagos"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Korlát"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Átlagos letöltő (letöltésnél)"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Átlagos letöltő (feltöltésnél)"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Átlagos feltöltő"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Letöltő"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Feltöltő"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Leírás"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrentfájlok"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Minden fájl"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Nem sikerült ellenőrizni az adatokat: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Nem sikerült betölteni ezt a torrentet: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Részben vagy teljesen letöltött torrentek importálása más kliensektől"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Torrent importálása"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "Csatorna URL címe"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Automatikusan torrenteket keres és letölt RSS hírcsatornákból, reguláris "
+"kifejezések segítségével."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS hírcsatornák"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Nem sikerült megtalálni és letölteni egy torrentet: %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Cím"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Leírás"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Hivatkozás"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Évad"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Epizód"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Idő"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Ütemező"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Az ütemező beállításai"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "H"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "K"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "Sze"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "Cs"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "P"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "Szo"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "V"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Az ütemezési beállítások elmentése megtörtént."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "A fájl nem található."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Az ütemezési beállítások betöltése megtörtént."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Sávszélesség-ütemező"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Sávszélesség-ütemező"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"A sávszélesség-ütemező ki van kapcsolva, bekapcsolás a Beállítások->"
+"Ütemező menüpontban."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Naplónézegető"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Napló"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Megjeleníti a KTorrent naplóüzeneteit"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"A webböngésző segítségével keressen rá a(z) %1 karakterláncra (csupa "
+"nagybetűvel) a felvenni kívánt keresővel. "
+"<br> A keresés befejeződése után másolja ide a címsorban található URL címet."
+"<br>"
+"<br>A(z) %1 keresése a Google-ön például a "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8 címet adja. "
+"<br> Ha ezt az URL címet itt megadja, a KTorrent képes lesz a Google "
+"segítségével keresni."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"A webböngésző segítségével keressen rá a %1 karakterláncra (csupa nagybetűvel) "
+"a felvenni kívánt keresővel, majd másolja be ide a kapott címet."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Meg kell adni a kereső nevét és címét"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Már létezik ilyen nevű kereső, adjon meg más nevet."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Rossz URL. Önnek a VALAMI kifejezést kellene keresnie az internetböngészőjében, "
+"és a teljes URL-t be kellene másolnia/illesztenie ide."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Keresés"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Keresési beállítások"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "%1 keresése..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrentfájlok"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "A keresés befejeződött"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Kereső: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Torrentkeresés webes keresőkkel"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Elkezdi a letöltést, vagy csak a torrentfájlt szeretné menteni?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Torrent letöltése"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Letöltés"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr "KTorrentet futtató gépeket keres a helyi hálózaton"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "A hátralevő idő becslési módja:"
diff --git a/translations/it/Makefile.am b/translations/it/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/it/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/it/messages/Makefile.am b/translations/it/messages/Makefile.am
new file mode 100644
index 0000000..0d5c097
--- /dev/null
+++ b/translations/it/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = it
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/it/messages/ktorrent.po b/translations/it/messages/ktorrent.po
new file mode 100644
index 0000000..fda5204
--- /dev/null
+++ b/translations/it/messages/ktorrent.po
@@ -0,0 +1,4956 @@
+# translation of ktorrent.po to Italian
+#
+# Nicola Ruggero <nixprog.adsl@tiscali.it>, 2005, 2006.
+# Nicola Ruggero <nicola@nxnt.org>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-07-09 15:09+0200\n"
+"Last-Translator: Nicola Ruggero <nicola@nxnt.org>\n"
+"Language-Team: Italian <kde-i18n-it@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Nessuna connessione in ingresso (probabilmente sei dietro un firewall)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informazioni"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Dati trasferiti durante la sessione corrente"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Velocità di tutti i torrent combinati"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Gruppi"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Avvia"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Ferma"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Avvia tutto"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Ferma tutto"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Incolla URL del torrent..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Apri gestione coda..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Accoda/Non accodare"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Filtro IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Controlla integrità dati"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Imposta livello massimo di invio"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Imposta livello massimo di scaricamento"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "File torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Tutti i file"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Apri indirizzo"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Velocità scaricamento: %1 / invio: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Dati scaricati: %1 / inviati: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 nodi, %2 processi"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: non attivo"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Tutti i torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Sposta all'aggancio sinistro"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Sposta all'aggancio destro"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Sposta all'aggancio inferiore"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Assegna acceleratore..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Pulisci acceleratore"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Cambia numero pulsante"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nuovo numero acceleratore:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Devi inserire l'indirizzo IP nel formato \"XXX.XXX.XXX.XXX\". Puoi usare i "
+"caratteri jolly per indicare intervalli come \"127.0.0.*\"."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Scegli un file"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Scegli un nome per salvare il file"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL non corretto."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Scaricamenti"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Invii"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"La porta specificata (%1) non è disponibile oppure è in uso da un'altra "
+"applicazione. KTorrent sta usando la porta %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent non riesce ad accettare le connessioni perché le porte %1 e %2 sono "
+"già in uso da un altro programma."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Impossibile creare il torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Parecchi file di dati del torrent \"%1\" sono mancanti, vuoi crearli nuovamente "
+"oppure non scaricarli affatto?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Ricrea"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Non scaricare"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Impossibile ricreare i file mancanti: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "File di dati mancanti"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Impossibile deselezionare i file mancanti: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Il file nel quale sono salvati i dati del torrent \"%1\" è mancante, vuoi "
+"ricrearlo?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Ricrea"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Impossibile ricreare il file di dati: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "File di dati mancante"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Controllo integrità dati"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "infinito"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Errore nell'analisi dei dati: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Analisi dei dati di <b>%1</b>:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Un programma BitTorrent per KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Modalità debug"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Documento da aprire"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Plugin RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Plugin Interfaccia web"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Plugin statistiche"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Icona applicazione ed altre icone"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "L'icona degli scaricamenti"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Icona applicazione 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Suggerimento della barra delle parti ed ordinamento IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "Paese"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Sistema di priorità file"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+"Miniupnp è stato preso come esempio per la nostra implementazione di UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Patch per il livello globale massimo di condivisione"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Miglioramenti Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Interfaccia web Coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Codice IDEAI da KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Miglioramento conversione velocità nel plugin filtro ip"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Scoperta di 2 vulnerabilità di sicurezza (entrambe risolte)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+"Patch per caricare senza avvisi un torrent specificando la posizione in cui è "
+"salvato"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Correzioni nel codice PHP dell'interfaccia web"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Preallocazione disco specifica XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Patch per non mostrare velocità molto basse"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Patch per mostrare se sei potenzialmente dietro ad un firewall"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Parecchie patch"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Parecchie patch"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Corrispondenze filtro"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr ""
+"Patch per caricare senza avvisi un torrent specificando la posizione in cui è "
+"salvato"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Devi selezionare un file o una cartella."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Non hai aggiunto un server traccia, sei sicuro di voler creare questo torrent?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Devi aggiungere almeno un nodo."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "File torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Scegli il file per salvare il torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Creazione di %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Gruppi personalizzati"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nuovo gruppo"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Modifica nome"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Rimuovi gruppo"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Apri scheda"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Per favore inserisci il nome del gruppo."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Il gruppo %1 esiste già."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Per favore inserisci il nuovo nome del gruppo."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Invii attivi"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Invii in coda"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Scaricamenti in coda"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Scaricamenti utente"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Invii utente"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Torrent inattivi"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Scaricamenti inattivi"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Invii inattivi"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Torrent attivi"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Scaricamenti attivi"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Rimuovi torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Rimuovi torrent e dati"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Aggiungi nodi..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Fonti nodi addizionali"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+#, fuzzy
+msgid "Torrent Peer Sources:"
+msgstr "Fonti nodi torrent:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Scambio nodo"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Annuncio manuale"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Anteprima"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "Apri cartella..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Cartella dati"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Cartella temporanea"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Imposta posizione scaricamento..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Rimuovi dal gruppo"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Aggiungi al gruppo"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Limiti velocità"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Torrent non esiste. Segnala questo bug agli sviluppatori di KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Nodo potenziale aggiunto."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Indirizzo IP non corretto."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Preferenze"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opzioni scaricamento"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "La porta di DHT dev'essere diversa dalla porta UDP del server traccia!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Generale"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opzioni generali"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Impossibile trovare %1: %2\n"
+"Per favore inserisci un indirizzo IP o nome host valido."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avanzate"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Opzioni avanzate"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Colonne visibili"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Stato"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Scaricati"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Dimensione"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Inviati"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Velocità scaricamento"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Velocità invio"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tempo rimanente"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Distributori"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Ricettori"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Completato"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Livello condivisione"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Tempo scaricamento"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Tempo distribuzione"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Tutti i torrent %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Impossibile avviare più di 1 scaricamento, \n"
+"Impossibile avviare più di %n scaricamenti, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+" e 1 nodo. \n"
+" e %n nodi. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "Vai su Impostazioni -> Configura KTorrent, se vuoi cambiare i limiti."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Il torrent %1 non è stato scaricato completamente, vuoi eliminare anche i dati "
+"incompleti?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Rimuovi scaricamento"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Elimina i dati"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Mantieni i dati"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Perderai tutti i dati scaricati. Sei sicuro di volerlo fare?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Sta già controllando i dati del torrent %1!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Scegli dove scaricare %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Hai deselezionato i seguenti file esistenti. Perderai tutti i dati in questi "
+"file, sei sicuro di volerlo fare?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Sì, cancella i file"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "No, mantieni i file"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " breve!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Utente"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Gestione coda"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "No (torrent privato)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Velocità:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Scaricamento: <font color='#1c9a1c'>%1</font></td>"
+"<td>Invio: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Trasferimenti:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Scaricati: <font color='#1c9a1c'>%3</font></td>"
+"<td>Inviati: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"Lo scaricamento di <b>%1</b> è completato."
+"<br>Velocità media: scaricamento %2 / invio %3."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Scaricamento completato"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> ha raggiunto il suo livello massimo di condivisione (%2) ed è stato "
+"fermato. "
+"<br>Inviati %3 con una velocità media di %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Distribuzione seme completata"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> ha raggiunto il suo tempo massimo di distribuzione di %2 ore ed è "
+"stato fermato. "
+"<br>Inviati %3 con una velocità media di %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> è stato interrotto con il seguente errore: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Sono stati trovati dati danneggiati nel torrent <b>%1</b>"
+"<br>È una buona idea eseguire un controllo di integrità dei dati del torrent."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> ha raggiunto il suo livello massimo di condivisione (%2) e non può "
+"essere messo in coda. Rimuovi il limite manualmente se vuoi continuare la "
+"distribuzione seme."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> ha raggiunto il suo tempo massimo di distribuzione di %2 ore e non "
+"può essere messo in coda. Rimuovi il limite manualmente se vuoi continuare la "
+"distribuzione seme."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Il torrent non può essere messo in coda."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Impossibile avviare <b>%1</b>: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Impossibile distribuire più di 1 torrent. "
+"<br>\n"
+"Impossibile distribuire più di %n torrent. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Impossibile scaricare più di 1 torrent. "
+"<br>\n"
+"Impossibile scaricare più di %n torrent. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Il torrent non può essere avviato"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Non c'è abbastanza spazio disponibile sul disco."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Il disco sta esaurendo lo spazio. <br /><b>%1</b> sta venendo scaricato in "
+"\"%2\"."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Il torrent è stato fermato.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Il dispositivo sta esaurendo lo spazio"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Limite velocità in KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Senza limite"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Limiti velocità per <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Un'applicazione KDE KPart"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Impossibile aprire il file indice %1: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Nicola Ruggero"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "nicola@nxnt.org"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Seleziona i file che vuoi scaricare"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Scarica in:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Gruppo:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Controllato dall'&utente"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Avvia il torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Scaricamento"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Seleziona t&utto"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&Nessuna selezione"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Inverti selezione"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Spazio su disco"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Spazio su disco richiesto:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Spazio su disco libero:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Dopo lo scaricamento:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Cifratura"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Usa la cifratura del protocollo"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"La cifratura del protocollo è usata per impedire che gli ISP rallentino le "
+"connessioni BitTorrent."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Permetti comunicazioni non cifrate"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Se non marcato, sarai in grado di connetterti solo a client che supportino la "
+"crittografia."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Protocollo di scambio tra nodi decentralizzati. Per ulteriori informazioni "
+"consulta il manuale."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Usa DHT per avere nodi aggiuntivi"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Porta UDP per le comunicazioni DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP personalizzato"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "I&nvia al server traccia un indirizzo IP o nome host personalizzato"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Indirizzo IP o nome host personalizzato:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Icona nel vassoio di sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Mostra icona nel vassoio di s&istema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Mostra &barra velocità nel vassoio di sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Mostra messaggi a comparsa nel vassoio di sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Larghezza di banda in invio (in KB/sec):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Larghezza di banda in scaricamento (in KB/sec):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Cartelle"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Cartella per i file temporanei:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Sposta scaricamenti completati in:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Salva &automaticamente gli scaricamenti in:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Copia file .torrent in:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barra degli strumenti degli scaricamenti"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Imposta limiti di velocità per il torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Livello massimo di invio:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Livello massimo di scaricamento:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 è illimitato)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Aggiungi nodo potenziale"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP nodo:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Porta:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Inserisci IP nodo e porta."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Lista nera KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Nota: La lista nera si applica solo alla sessione corrente. Usa salva/apri per "
+"salvare le voci oppure usa il plugin Filtro IP (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Nodi al bando"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Indirizzo IP nodo"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Aggiungi nodo:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Aggiungi un nodo alla lista nera"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Rimuove i nodi selezionati dalla lista nera"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Pu&lisci"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Pulisce questa lista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Salva &come..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Salva questa lista nera per essere usato con il plugin Filtro IP per KTorrent"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Scaricamenti massimi:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Semi massimi:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Avvio scaricamento con poco spazio su disco:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Spazio su disco minimo:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Non avviare"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Chiedi sempre"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Forza avvio"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 è illimitato)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Livello massimo di scaricamento:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Limite globale connessioni:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Tempo massimo distribuzione:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Connessioni massime per torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Numero slot di invio:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Porta UDP del server traccia:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Livello massimo condivisione:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Livello massimo di invio:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/sec (0 è illimitato)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Ore (0 è illimitato)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Mantieni il seme dopo il termine dello scaricamento"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Attenzione"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Le porte qui sopra devono essere mappate se sei dietro un router. Il plugin "
+"UPnP può farlo al posto tuo."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Gestione coda - KTorrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Stato:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Server traccia:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Livello condivisione:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Byte rimanenti:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Controllato da"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Invi&i"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Byte inviati:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Sposta &su"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Sposta &giù"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Sposta all'inizio"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Sposta alla &fine"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Controllato da G&C"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Controllato dall'&utente"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Incolla URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Annulla"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Crea torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Il file o la cartella della quale vuoi creare un torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Devi aggiungere almeno un server traccia o un nodo."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opzioni file"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Dimensione di ogni parte:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Avvia la distribuzione s&eme del torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Decentrali&zzato (solo DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Torrent privato (DHT non permesso)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Commenti:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Crea"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "An&nulla"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Server traccia"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Nodi DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Nodo:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "Indirizzo IP o nome host"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Porta"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Nota: Alcuni nodi buoni DHT conosciuti sono già inseriti. Probabilmente "
+"dovresti inserire anche il tuo indirizzo IP e porta se hai intenzione di "
+"distribuire il seme di questo torrent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Preferenze avanzate"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Algoritmo di KTorrent:</b> Algoritmo predefinito che usa una combinazione "
+"degli altri algoritmi sulla base di alcune nostre prove."
+"<br>\n"
+"<b>Algoritmo velocità attuale:</b> Algoritmo più semplice - Byte rimanenti / "
+"Velocità attuale"
+"<br>\n"
+"<b>Algoritmo velocità media globale:</b> Byte rimanenti / Velocità media"
+"<br>\n"
+"<b>Algoritmo finestra di X:</b> Tempo trascorso calcolato da X campioni di "
+"velocità"
+"<br>\n"
+"<b>Algoritmo media commovente:</b> Media commovente velocità calcolata da X "
+"campioni"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Velocità attuale"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Velocità media globale"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Finestra di X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Media commovente"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(ha effetto dopo il riavvio)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Disa&bilita preallocazione spazio su disco"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Preall&oca interamente lo spazio su disco (evita la frammentazione)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Base (lento)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Specifico per il filesysten"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Prestazioni"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Uso memoria:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Basso"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Medio"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Alto"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Intervallo aggiornamento interfaccia:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "CPU veloce"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "CPU lenta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Controllo dati"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Durante l'invio &non ricontrollare le parti più grandi di"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Fai un controllo &integrità dei dati dopo"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "parti danneggiate"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Rete"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Numero massimo di connessioni per torrent (0 = illimitate)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+"Non usare le impostazioni pro&xy di KDE per le connessioni HTTP al server "
+"traccia"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Proxy HTTP del server traccia:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Analisi dei dati"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Analisi dei dati del torrent:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Numero di parti trovate:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Numero di parti danneggiate / non scaricate:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Prova"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Numero massimo di scaricamenti (0 = illimitati)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Numero massimo di semi (0 = illimitati)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Avvio gli scaricamenti anche con poco spazio libero?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Numero massimo di connessioni per torrent (0 = illimitate)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Numero massimo di connessioni per tutti i torrent (0 = illimitate)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Velocità massima di invio in KB/sec (0 = illimitata)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Velocità massima di scaricamento in KB/sec (0 = illimitata)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Livello massimo di condivisione (0=illimitato)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Durata massima distribuzione seme in ore (0=illimitata)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Mostra l'icona nel vassoio di sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Mostra barra velocità nel vassoio di sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Larghezza di banda in scaricamento (in kb/sec):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Larghezza di banda in invio (in kb/sec):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Mostra messaggi a comparsa quando un torrent è completato."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Mantieni il seme dopo il termine dello scaricamento"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Cartella per salvare i file temporanei"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Se salvare automaticamente gli scaricamenti nella cartella impostata"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Cartella nella quale salvare i file scaricati"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Se spostare automaticamente gli scaricamenti completi nella cartella impostata"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Cartella nella quale spostare i file scaricati"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Se copiare automaticamente i file .torrent nella cartella impostata"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Cartella per copiare i file .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Se usare un indirizzo IP personalizzato da passare al server traccia"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Cartella usata come ultima cartella di salvataggio"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP da passare al server traccia"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Uso memoria"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Intervallo aggiornamento interfaccia"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Supporto per DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Porta DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Numero slot di invio"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Colonne mostrate nella vista KTorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algoritmo ET"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Quando non c'è spazio disponibile per completare lo scaricamento e lo spazio "
+"libero è meno del valore impostato, il torrent verrà fermato."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Gestore plugin"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Attiva"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Disa&ttiva"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "&Attiva tutti"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Disattiva tutti"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Dispositivo UPnP predefinito da usare"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Dispositivi rilevati:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Dispositivo"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Porte mappate"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Connessione WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "M&appa porte"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Annulla mappatura porte"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Rileva nuovamente"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Abilitare la scansione della cartella 1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Abilitare la scansione della cartella 2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Abilitare la scansione della cartella 3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Percorso cartella 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Percorso cartella 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Percorso cartella 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Se aprire un file torrent senza avvisi oppure no."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Azione elimina marcata."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Azione sposta marcata."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Preferenze scansione cartella"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Scansione cartella &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Scansione cartella &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Scansione cartella &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Sposta nella cartella \"caricati\" &dopo il caricamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Sposta il torrent nella cartella \"caricati\" dopo il caricamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Apri i torrent senza avvis&i"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Non mostra la finestra \"Seleziona i file da scaricare\""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Cancella dopo il caricame&nto"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Cancella i torrent dopo il caricamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Cartelle nelle quali effettuare la scansione"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Cartella 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Cartella 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Cartella 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Preferenze di ricerca"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Server web"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Mappa porta"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Sessione TTL (in sec):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Seleziona interfaccia:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Nome utente:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Cambia password..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Percorso eseguibile PHP:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Numero porta"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "mappa porta"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Durata sessione"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "skin interfaccia"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "percorso eseguibile PHP"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "nome utente"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "password"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Parti"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Totale:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Attualmente in scaricamento:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Scaricate:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Escluse:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Rimaste:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Dimensione:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Parte"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Avanzamento"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Nodo"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Nodi assegnati"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Distributori:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Ricettori:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Velocità media scaricamento:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Velocità media invio:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Prossimo aggiornamento in:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Stato server traccia:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Parti del torrent che sono state scaricate:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Parti del torrent che sono disponibili:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Condivisione"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"L'invio si fermerà quando il livello di condivisione raggiungerà questo valore. "
+"Zero significa senza limite."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"L'invio si fermerà quando avrai inviato questo torrent per diverse ore."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Ore"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Limite livello:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Il limite funziona solo in modalità distribuzione seme"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Limite di tempo:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Aggiorna server traccia"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Intervallo minimo aggiornamento - 60 secondi"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Aggiungi server t&raccia"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Rimuovi server traccia"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "C&ambia server traccia"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Ripristina valori predefiniti"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Mostra la linguetta della vista nodi nella finestra principale"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+"Mostra la linguetta della vista scaricamento parti nella finestra principale"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+"Mostra la linguetta della vista server traccia nella finestra principale"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Mostra lista dei nodi"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Mostra lista delle parti attualment&e in scaricamento"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Mostra lista dei server traccia"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Preferenze Blocco IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Seleziona file filtro PeerGuardian "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Uso il filtro PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "File filtro IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Sca&rica/Converti"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Scarica il filtro PeerGuardian da bluetack.co.uk o blocklist.org.\n"
+"Nota: Il file zip di bluetack.co.uk è supportato."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL filtro livello 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Uso filtro di livello 1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Conversione..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Fai clic sul pulsante converti per avviare la conversione del file antip2p. "
+"NOTA: Questo processo può impiegare del tempo anche in macchine veloci e in "
+"questo periodo non è possibile usare KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Aggiorna"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Aggiorna grafici ogni"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "aggiornamenti dell'interfaccia"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Raccogli dati ogni"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "millisecondi"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Massimo"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Modalità scala velocità massima:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Esatto"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Vedi \"Che cos'è?\" per maggiori informazioni"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Imposta il valore massimo nella scala dell'asse Y come:\n"
+"- Massimo: Velocità massima raggiunta globalmente\n"
+"- Esatto: Velocità massima raggiunta visibile nel grafico"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Velocità nodi"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Velocità nodi:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "aggiorna ogni"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "aggiornamenti dati grafico"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"La raccolta di dati provenienti da molti nodi connessi utilizza molta CPU."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Connessioni nodi"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Valori grandi possono oscurare i grafici dei nodi connessi"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Mostra distributori in sciami"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Mostra ricettori in sciami"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Conteggi"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Invio"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Connessioni"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Nodi"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Mostra/Nascondi grafici velocità nodi"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Intervallo raccolta dati sulla velocità dei nodi"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Mostra/Nascondi ricettori in sciami"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Mostra/Nascondi distributori in sciami"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Conteggio scaricamenti"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Conteggio velocità nodi"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Conteggio invii"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Conteggio connessioni"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Conteggio DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Modalità massimo dell'asse Y"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importa uno scaricamento esistente"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Dati:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Per favore specifica il torrent e i dati già scaricati di quel torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importa"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "predefinito"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Fonti RSS"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Fonti"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "E&limina"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nuovo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Articoli"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Aggio&rnamento automatico"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnora TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Aggiorna"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Titolo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Mantieni articoli (giorni)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Attiva"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtri"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Filtri di accettazione"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Filtri di rifiuto"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Espressioni regolari"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Tratta come &serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Elabora"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Criteri serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Corrispondenza senza episodio"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Episodio massimo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Stagione massima"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Stagione minima"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Episodio minimo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Prova te&sto"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Prova"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Corrispondenze filtro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Pianificatore banda"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Categoria impostata con il pulsante sinistro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Categor&ia 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "Spent&o"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normale"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Categoria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Categoria &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Categoria impostata con il pulsante destro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Categoria &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Categoria 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Categorie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "scarica:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "invia:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* zero è illimitato"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Salva su file"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Carica da file"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Azzera pianificazione"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&k"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Preferenze plugin pianificatore"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Uso il pianificatore &banda?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Pianificatore banda"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Uso i colori al posto delle immagini (pi&xmap)?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Raccomandato per sistemi lenti)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Modifica pianifi&cazione"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Abilito pianificatore banda?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Uso i colori al posto delle pixmap?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Usa rich text nel registro"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Messaggi info generali"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Messaggi connessioni"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Messaggi DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Messaggi info server traccia"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Messaggi info I/O disco"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Messaggi plugin Filtro IP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Messaggi plugin Ricerca"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Messaggi plugin Importazione file parziali"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Messaggi plugin Pannello informazioni"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Messaggi plugin UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Messaggi plugin Scansione cartella"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Messaggi Pianificatore banda"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Flag messaggi plugin RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Flag messaggi plugin Interfaccia web"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Opzioni visore registro"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Plugin"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Tutto"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Debug"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Avviso"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Importante"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Nessuno"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "Filtro IP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Ricerca:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Scansione cartella:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Pianificatore:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Importazione file parziali:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Pannello informazioni:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Plugin RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Plugin Interfaccia web:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistema"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Generale:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Connessioni:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "I/O disco:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Usa rich te&xt per il registro"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Browser esterno"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Apri le ricerche in un browser esterno"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Usa browser predefinito"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Percorso browser personalizzato:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Motori di ricerca"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Nome motore di ricerca:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Aggiungi"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Motori"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Rimu&ovi tutto"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Aggiungi predefi&nito"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Aggiorna da internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Cerca"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Motore di ricerca:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Motore di ricerca corrente"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Usa browser personalizzato"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Percorso eseguibile browser personalizzato"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 giorno \n"
+"%n giorni "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Sì, per primo"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Sì, per ultimo"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Impossibile aprire il file registro %1: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Impossibile scrivere su %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Impossibile leggere da %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Impossibile creare la cartella %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Impossibile creare il link simbolico %1 a %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Impossibile spostare %1 in %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Impossibile copiare %1 in %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Impossibile cancellare %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Impossibile creare %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Impossibile calcolare la dimensione del file di %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Impossibile calcolare la dimensione del file: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Impossibile aprire %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Impossibile espandere il file: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Impossibile espandere il file"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Impossibile cercare nel file: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Impossibile scrivere oltre la fine del buffer mmap!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Attivo"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Non attivo"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opzioni plugin"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Impossibile aprire il file %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "La cartella %1 non esiste"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Token non valido: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Errore di decodifica"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Fine dell'input non atteso"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Impossibile convertire %1 in un intero"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Il torrent è incompleto!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrent danneggiato!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Il torrent non ha il campo annuncio o il campo nodi"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Impossibile aprire il file torrent %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Errore di analisi"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Errore durante il caricamento del torrent. Molto probabilmente il torrent è "
+"danneggiato oppure non è affatto un file torrent.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Errore durante il caricamento del torrent. Molto probabilmente il torrent è "
+"danneggiato oppure non è affatto un file torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Impossibile creare %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Stai già scaricando questo torrent %1, la lista dei server traccia di entrambi "
+"i torrent è stata unificata."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Stai già scaricando il torrent %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Impossibile effettuare la migrazione %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Il torrent %1 è stato avviato con una versione precedente di KTorrent. Per fare "
+"in modo che questo torrent funzioni con questa versione di KTorrent verrà "
+"effettuata la migrazione del file. Ti verrà richiesta la posizione nel quale "
+"salvare il torrent. Se premi annulla verrà selezionata la tua cartella home."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Seleziona la cartella nella quale salvare"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Non avviato"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Distribuzione seme"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Scaricamento"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "In stallo"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Fermato"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Errore: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Allocazione spazio su disco"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "In coda"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Controllo dati"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Fermato. Non c'è spazio rimanente sul dispositivo"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Non hai sufficiente spazio sul disco per poter scaricare questo torrent. Sei "
+"sicuro di voler continuare?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Spazio su disco insufficiente per %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Il torrent \"%1\" ha raggiunto il livello massimo di condivisione. Ignoro il "
+"limite e inizio ugualmente la distribuzione seme?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Livello massimo di condivisione raggiunto."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Errore nell'arresto del torrent %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Errore nell'avvio del torrent %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Annuncio"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Client sconosciuto"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 nodo\n"
+"%n nodi"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Impossibile creare il file %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Impossibile scrivere la prima parte al file DND: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Impossibile scrivere l'ultima parte al file DND: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Impossibile aprire %1 in scrittura: filesystem in sola lettura"
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Impossibile espandere il file: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Impossibile espandere il file %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Impossibile espandere il file %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Errore: lettura oltre la fine del file %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Errore durante la lettura di %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Errore durante la scrittura di %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Errore durante la scrittura di %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Impossibile pre-allocare lo spazio su disco: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Impossibile collegarsi alla porta UDP %1 o alle 10 porte successive."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Risposta non valida dal server traccia"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Dati non validi dal server traccia"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "URL del server traccia non valido"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Impossibile aprire il file %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Impossibile creare il file indice: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Impossibile aprire il file: %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Usa UPnP per mappare automaticamente le porte sul router"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Impossibile trovare il servizio di mappatura porte nella descrizione del "
+"dispositivo!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Dispositivi UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Effettua automaticamente la scansione delle cartelle per trovare e caricare i "
+"file torrent."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Scansione cartella"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Scansione cartella"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opzioni scansione cartella"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "caricato"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Scansione cartella - Cartella %1: URL non valido o cartella inesistente. Per "
+"favore scegli una cartella valida."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Interfaccia web"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Opzioni Interfaccia web"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+#, fuzzy
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"L'eseguibile PHP non è nel percorso predefinito, per favore inserisci il "
+"percorso manualmente"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Per favore inserisci una nuova password per l'interfaccia web."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 esiste ed è eseguibile"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "%1 non esiste"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+#, fuzzy
+msgid "%1 is not executable"
+msgstr "%1 non è eseguibile"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 è una cartella"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+#, fuzzy
+msgid "%1 is not php executable path"
+msgstr "%1 non è il percorso dell'eseguibile PHP"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Interfaccia web"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Permette il controllo di KTorrent attraverso il browser"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Scarica per primo"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Scarica normalmente"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Scarica per ultimo"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Elimina file"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Disponibile"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "In attesa"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Perderai tutti i dati in questo file, sei sicuro di volerlo fare?\n"
+"Perderai tutti i dati in questi file, sei sicuro di volerlo fare?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Nessun limite"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Pannello informazioni"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Mostra informazioni aggiuntive sullo scaricamento. Ad esempio quali parti sono "
+"state scaricate, quanti distributori e ricettori sono presenti..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Impossibile aggiungere server traccia ad un torrent privato."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Impossibile rimuovere il server traccia predefinito del torrent."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Non puoi aggiungere server traccia ad un torrent privato"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Paese"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Client"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Congestionato"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Non invia dati"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Disponibilità"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Punteggio"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Slot invio"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Richieste"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Caccia via il nodo"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Metti al bando il nodo"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Parti disponibili"
+"<br><img src=\"unavailable_color\">&nbsp; - Parti non disponibili"
+"<br><img src=\"excluded_color\">&nbsp; - Parti escluse"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opzioni pannello informazioni"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Parti scaricate"
+"<br><img src=\"unavailable_color\">&nbsp; - Parti non scaricate"
+"<br><img src=\"excluded_color\">&nbsp; - Parti escluse"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Converti"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Caricamento file txt..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Attendere per favore..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "File convertito."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Impossibile caricare il filtro:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"File filtro non valido. Può essere danneggiato o in un formato non valido."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtra i nodi indesiderati basandosi sul loro indirizzo IP"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Filtro IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Stato: caricato e in esecuzione."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Stato: non caricato."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Stato: <font color=\"#ff0000\">File filtro non trovato.</font> "
+"Scarica e converti il file filtro."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Il file selezionato esiste già, vuoi scaricarlo di nuovo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Il file esiste già"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "Il file filtro (level1.dat) esiste già, vuoi convertirlo di nuovo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtro blocco IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opzioni filtro blocco IP"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistiche"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Opzioni statistiche"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Ricettori connessi"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Ricettori in sciami"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Distributori connessi"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Distributori in sciami"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Media ricettori connessi per torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Media distributori connessi per torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Media ricettori connessi per torrent avviato"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Media distributori connessi per torrent avviato"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Nodi"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Processi"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Mostra statistiche trasferimenti"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Statistiche velocità"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Statistiche connessione"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Attuale"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Media"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Limite"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Media dai ricettori"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Media verso i ricettori"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Media dai distributori"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Dai ricettori"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Dai distributori"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "File torrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Tutti i file"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Impossibile controllare i dati: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Impossibile caricare il file torrent: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importa torrent scaricati completamente o parzialmente da altri client"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importa scaricamento esistente"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL della fonte"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Effettua automaticamente la scansione delle fonti RSS per torrent che "
+"corrispondono alle espressioni regolari e li carica."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Fonti RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Titolo"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Descrizione"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Collegamento"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Stagione"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episodio"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Durata"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Pianificatore"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opzioni pianificatore"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "LUN"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "MAR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "MER"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "GIO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "VEN"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SAB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "DOM"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Pianificazione salvata."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "File non trovato."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Pianificazione caricata."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Plugin pianificatore banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Apri pianificatore banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Il pianificatore banda è disabilitato. Vai in preferenze -> "
+"pianificatore per abilitarlo."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Visore registro"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Visore registro"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Visualizza informazioni di registro di Ktorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Usa il tuo browser per cercare la stringa %1 (lettere maiuscole) nel motore di "
+"ricerca che vuoi aggiungere. "
+"<br> Poi, una volta che la ricerca è terminata, copia e incolla qui l'URL che "
+"si trova nella barra degli indirizzi. "
+"<br>"
+"<br>Cercando %2 in Google per esempio, risulterà "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> Se aggiungi questo URL qui, KTorrent sarà in grado di cercare con Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Usa il tuo browser per cercare la stringa %1 (lettere maiuscole) nel motore di "
+"ricerca che vuoi aggiungere. Usa l'URL risultante qui sotto."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Devi inserire il nome del motore di ricerca e l'URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Un motore di ricerca con lo stesso nome esiste già. Per favore usa un nome "
+"diverso."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"URL non valido. Devi effettuare una ricerca del termine FOOBAR con il tuo "
+"browser internet e poi copiare/incollare l'URL esatto qui."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Ricerca"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opzioni motore di ricerca"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Ricerca di %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "file torrent"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Ricerca terminata"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Motore: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Cerca i torrent in diversi motori di ricerca per torrent famosi"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Vuoi scaricare o salvare il torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Scarica torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Scarica"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Trova i nodi che eseguono KTorrent nella rete locate con cui poter condividere "
+"i torrent"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algoritmo ETA:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Impossibile caricare la parte %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Server traccia"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "Campo \"tipo di sevizio\" nei pacchetti IP"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+N"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr ""
+#~ "Localizzatore paesi per plugin pannello informazioni.\n"
+#~ "Le bandiere sono prese da http://flags.blogpotato.de/ quindi un grazie anche a loro."
diff --git a/translations/ja/Makefile.am b/translations/ja/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/ja/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/ja/messages/Makefile.am b/translations/ja/messages/Makefile.am
new file mode 100644
index 0000000..f18f0ca
--- /dev/null
+++ b/translations/ja/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = ja
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/ja/messages/ktorrent.po b/translations/ja/messages/ktorrent.po
new file mode 100644
index 0000000..cb5dd93
--- /dev/null
+++ b/translations/ja/messages/ktorrent.po
@@ -0,0 +1,4800 @@
+# translation of ktorrent.pot to Japanese
+# Yukiko Bando <ybando@k6.dion.ne.jp>, 2005, 2006, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-11-25 22:00+0900\n"
+"Last-Translator: Yukiko Bando <ybando@k6.dion.ne.jp>\n"
+"Language-Team: Japanese <Kdeveloper@kde.gr.jp>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "着信接続がありません (ファイアウォールで遮断されている可能性があります)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "情報"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "現在のセッションで転送したデータ"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "すべての torrent を合わせた現在の速度"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "グループ"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "開始"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "停止"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "すべて開始"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "すべて停止"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "torrent の URL を貼り付け..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "キューマネージャを開く..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "キューに追加 / 解除"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IPFilter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "データの整合性をチェック"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "最大アップロード速度を設定"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "最大ダウンロード速度を設定"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "torrent ファイル"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "すべてのファイル"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "場所を開く"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "速度 下り: %1 / 上り: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "転送済み 下り: %1 / 上り: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 ノード、%2 タスク"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: オフ"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "すべての torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "検索:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "大文字小文字を区別する"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "左のドックに移動"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "右のドックに移動"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "下のドックに移動"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "アクセラレータを割り当て..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "アクセラレータをクリア"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "ボタン番号を変更"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "新しいアクセラレータ番号:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"IP は 'XXX.XXX.XXX.XXX' という書式で入力してください。範囲には '127.0.0.*' のようにワイルドカードが使えます。"
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "ファイルを選択"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "保存するファイル名を選択"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL の形式が不正です。"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "ダウンロード"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "アップロード"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr "指定されたポート (%1) は利用できないか、他のアプリケーションが使用しています。KTorrent はポート %2 を使用します。"
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr "%1 から %2 のポートが既に他のプログラムによって使用されているため、KTorrent は接続を受け入れられません。"
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "torrent を作成できません: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr "torrent \"%1\" のいくつかのデータファイルが欠けています。それらを作成し直しますか?それとも、それらはダウンロードしませんか?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "作成し直す"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "ダウンロードしない"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "欠落したファイルを作成し直せません: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "データファイルがありません"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "欠落したファイルを選択解除できません: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr "torrent \"%1\" のデータが保存されているファイルがありません。作成し直しますか?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "作成し直さない"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "データファイルを作成し直せません: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "データファイルがありません"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "データの整合性をチェック"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "無限"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "データのスキャン中にエラー: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "<b>%1</b> のデータをスキャン :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "KDE のための BitTorrent プログラム"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "デバッグモード"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "開くドキュメント"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS プラグイン"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "WebInterface プラグイン"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "統計プラグイン"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "アプリケーションアイコンその他"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "ダウンロードアイコン"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 アプリケーションアイコン"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "ピースバーのツールチップと情報ウィジェットのファイルのツリー表示"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"情報ウィジェットプラグインの国探知機能 (これには MaxMind によって作成された GeoLite データが含まれています。入手先: "
+"http://www.maxmind.com/)。"
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "国旗"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "ファイルの優先順位"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "KTorrent の UPnP 実装は Miniupnp を手本にしました"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "全体の最大共有比率のパッチ"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconf の強化"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk ウェブ GUI"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "KDevelop の IDEAl コード"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "IPFilter プラグインの変換速度を改善"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "セキュリティ上の弱点を二つ発見 (両方とも修正済み)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "保存場所を尋ねずにロードするためのパッチ"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "WebInterface の PHP コードを修正"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS 専用のディスクの事前割り当て"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "極度に遅い速度を表示しないようにするためのパッチ"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "ファイアウォールで遮断されている可能性のある状態を表示するためのパッチ"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "いくつかのパッチ"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "メニューバーを非表示にするためのパッチ"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "ウェブ GUI でファイルの優先順位を変更するためのパッチ"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "ウェブ GUI のいくつかのパッチ"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "フィルタバーのパッチ"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "SHA1 ハッシュ生成の最適化"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "FreeBSD でのディスクの空き容量計算の不具合を修正するパッチ"
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr "コマンドラインから保存場所を尋ねずに torrent をロードするためのパッチ"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "ファイルまたはフォルダを選んでください。"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "トラッカーを追加していません。本当にこの torrent を作成しますか?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "ノードを最低一つ追加してください。"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "torrent ファイル (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "torrent を保存するファイルを選択"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "%1 を作成中..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "カスタムグループ"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "新規グループ"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "名前を編集"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "グループを削除"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "タブを開く"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "グループの名前を入力してください。"
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "グループ %1 は既に存在します。"
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "新しいグループ名を入力してください。"
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "アクティブなアップロード"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "キューのアップロード"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "キューのダウンロード"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "ユーザのダウンロード"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "ユーザのアップロード"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "非アクティブな torrent"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "非アクティブなダウンロード"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "非アクティブなアップロード"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "アクティブな torrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "アクティブなダウンロード"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "torrent を削除"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "torrent とデータを削除"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "ピアを追加"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "追加のピア取得先"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "torrent のピア取得先:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "ピア交換"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "手動アナウンス"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "プレビュー"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "ディレクトリを開く"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "データディレクトリ"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "一時ディレクトリ"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "ダウンロード先を設定"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "グループから削除"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "グループに追加"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "速度制限"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "torrent が存在しません。このバグを KTorrent の開発者に報告してください。"
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "見込みピアを追加しました。"
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "IP アドレスの形式が不正です。"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "設定"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "ダウンロードのオプション"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT ポートは UDP トラッカーポートと異なっていなければなりません。"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "全般"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "全般オプション"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"%1 を検索できません: %2\n"
+"有効な IP アドレスまたはホスト名を入れてください。"
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "詳細"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "詳細オプション"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "表示するカラム"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "ステータス"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "ダウンロード済み"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "サイズ"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "アップロード済み"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "下り速度"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "上り速度"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "残り時間"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "シーダー"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "リーチャー"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% 完了"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "共有比率"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "ダウンロード時間"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "シード時間"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "すべての torrent %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr "%n 件までのダウンロードと、"
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "%n 件までのシードしか開始できません。"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "この制限を変更するには「設定」->「KTorrent を設定」を開いてください。"
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr "torrent %1 のダウンロードはまだ完了していません。不完全なデータも削除しますか?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "ダウンロードを削除"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "データを削除"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "データを保持"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "ダウンロード済みのすべてのデータが失われます。本当によろしいですか?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "torrent %1 のデータは既にチェック中です。"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "%1 のダウンロード先を選択"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr "以下の既存のファイルの選択が解除されました。これらのファイルのすべてのデータを失うことになります。本当によろしいですか?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "はい、ファイルを削除します"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "いいえ、ファイルを保持します"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " 不足!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "ユーザ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "QM (キューマネージャ)"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "いいえ (非公開 torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>速度:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>ダウンロード: <font color='#1c9a1c'>%1</font></td>"
+"<td>アップロード: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>転送:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>ダウンロード: <font color='#1c9a1c'>%3</font></td>"
+"<td>アップロード: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> のダウンロード完了<br>平均速度: 下り %2 / 上り %3"
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "ダウンロード完了"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr "<b>%1</b> は指定された最大共有比率 %2 に達したため、停止しました。<br>平均速度 %4 で %3 アップロードしました。"
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "シード完了"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr "<b>%1</b> は最大シード時間 (%2 時間) に達したため、停止しました。<br>平均速度 %4 で %3 アップロードしました。"
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> は次のエラーで停止しました: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr "torrent <b>%1</b> に壊れたデータを検出しました。<br>この torrent のデータの整合性をチェックしてください。"
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr "<b>%1</b> は指定された最大共有比率 %2 に達したため、キューに追加できません。シードを続けるには、手動で制限を解除してください。"
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> は最大シード時間 (%2 時間) に達したため、キューに追加できません。シードを続けるには、手動で制限を解除してください。"
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "torrent をキューに追加できません。"
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "<b>%1</b> を開始できません: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr "torrent のシードは %n 件までしかできません。"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr "torrent のダウンロードは %n 件までしかできません。"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "torrent を開始できません"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "十分なディスク容量がありません。"
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "ディスクの容量が足りません。<br /><b>%1</b> を '%2' にダウンロードしています。"
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "torrent を停止しました。<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "デバイスの容量が足りません"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "速度制限 (KB/秒)"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "無制限"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "<b>%1</b> の速度制限:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE KPart アプリケーション"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "インデックスファイル %1 を開けません: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Yukiko Bando"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "ybando@k6.dion.ne.jp"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "ダウンロードするファイルを選んでください。"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "ダウンロード先:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "グループ:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "ユーザがコントロール(&U)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "torrent を開始"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "ダウンロード"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "すべて選択(&A)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "すべて選択解除(&N)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "選択反転"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "ディスク容量"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "必要なディスク容量:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "ディスクの空き容量:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "ダウンロード後:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "暗号化"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "プロトコル暗号化を使う"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr "プロトコル暗号化は ISP に bittorrent 接続の速度を制限されないようにするために使用します。"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "暗号化されていない接続を許可する"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr "このチェックを外すと、暗号化をサポートしていないクライアントには接続できなくなります。"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able プロトコル。"
+"<br>分散型ピア交換プロトコル。詳しくはマニュアルをご覧ください。"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "ピアを追加するために DHT を使う(&U)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "DHT コミュニケーションのための UDP ポート:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "カスタム IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "トラッカーにカスタム IP アドレス/ホスト名を送る(&N)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "カスタム IP アドレスまたはホスト名:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "システムトレイアイコン"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "システムトレイアイコンを表示する(&Y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "トレイアイコンに速度バーを表示する(&B)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "システムトレイのポップアップメッセージを表示する"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "アップロード帯域幅 (KB/秒):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "ダウンロード帯域幅 (KB/秒):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "フォルダ"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "一時ファイルを保存するフォルダ:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "完了したダウンロードの移動先:"
+
+# ACCELERATOR changed by translator
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "ダウンロードを自動的に次に保存する(&S):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr ".torrent ファイルのコピー先:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "ダウンロードツールバー"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "torrent の速度制限を設定"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "最大アップロード速度:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "最大ダウンロード速度:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/秒 (0 は無制限)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "見込みピアを追加"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "ピア IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "ポート:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "ピアの IP とポートを入力してください。"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent ブラックリスト"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"注意: ブラックリストは現在のセッションのみに適用されます。「保存/開く」でエントリを保存するか、IPFilter プラグイン (PeerGuardian) "
+"を使ってください。"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "禁止したピア"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "ピアの IP アドレス"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "ピアを追加:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "ブラックリストにピアを追加"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "選択したピアをブラックリストから削除"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "クリア(&L)"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "このリストをクリア"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "名前を付けて保存(&A)..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "このブラックリストを KTorrent IPFilter プラグインで使用するために保存"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "最大ダウンロード数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "最大シード数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "ディスク容量が少ない場合のダウンロードの開始:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "最小ディスク容量:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "開始しない"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "常に尋ねる"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "強制的に開始"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 は無制限)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "最大ダウンロード速度:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "全体の接続制限:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "最大シード時間:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "torrent あたりの最大接続数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "アップロードスロットの数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP トラッカーポート:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "最大共有比率:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "最大アップロード速度:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/秒 (0 は無制限)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "時間 (0 は無制限)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "ダウンロード完了後シードを続ける(&K)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "注意"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr "ルータの背後にいる場合は、上のポートもフォワードする必要があります。UPnP プラグインはこれを自動的に行います。"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT キューダイアログ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "ステータス:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "トラッカー:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "共有比率:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "残りバイト:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "コントロール"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "アップロード(&S)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "アップロード済み:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "上に移動(&O)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "下に移動(&N)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "一番上に移動"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "一番下に移動(&B)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "QM がコントロール(&Q)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "ユーザがコントロール(&U)"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "URL を貼り付け"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "キャンセル(&A)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "torrent を作成"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "torrent を作成するファイルまたはフォルダ:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "トラッカーまたはノードを最低一つ追加してください。"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "ファイルのオプション"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "各ピースのサイズ:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "torrent のシードを開始する(&G)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "分散型(&Z) (DHT のみ)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "非公開 torrent (DHT は使えません)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "コメント:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "作成(&C)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "キャンセル(&N)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "トラッカー"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT ノード"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "ノード:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP またはホスト名"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "ポート"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"注: 既知の優良な DHT ノードが既にいくつか挿入されています。この torrent をシードする予定であれば、おそらくあなた自身の IP "
+"アドレスとポートも挿入した方がいいでしょう。"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "詳細設定"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr "残り時間を計算するアルゴリズム:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<qt>KTorrent アルゴリズム: KTorrent 開発者のテストに基づいて他のアルゴリズムを組み合わせたデフォルトのアルゴリズム"
+"<br>\n"
+"現在の速度アルゴリズム: 最も単純なアルゴリズム - 残りバイト/現在の速度"
+"<br>\n"
+"全体の平均速度アルゴリズム: 残りバイト/平均速度"
+"<br>\n"
+"X のウィンドウアルゴリズム: X 速度サンプルから推定時間を計算"
+"<br>\n"
+"移動平均アルゴリズム: X サンプルから速度の移動平均を計算"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "現在の速度"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "全体の平均速度"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "X のウィンドウ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "移動平均"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(再起動後に適用)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "ディスク領域の事前割り当てを無効にする(&B)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "事前にディスク領域を完全に割り当てる(&U) (断片化を防ぐ)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "基本的 (遅い)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "ファイルシステム専用"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "パフォーマンス"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "メモリの使用:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "低"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "中"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "高"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "GUI の更新間隔:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ミリ秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "高速 CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "低速 CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "データチェック"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "アップロード中に次より大きいピースは再チェックしない(&N)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "壊れたピースが次の数あればデータの整合性をチェックする(&Y)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "ピース"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "ネットワーキング"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "最大接続数の設定:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "IP パケットの DSCP:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "HTTP トラッカー接続に KDE のプロキシ設定を使わない(&X)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP トラッカープロキシ:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "データをスキャン"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "torrent のデータをスキャン :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "見つかったピースの数 :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "失敗した/未ダウンロードのピースの数 :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "テスト"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "最大ダウンロード数 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "最大シード数 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "ディスク容量が不足していてもダウンロードを開始しますか?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "torrent あたりの最大接続数 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "すべての torrent の最大接続数 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "最大アップロード速度 KB/秒 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "最大ダウンロード速度 KB/秒 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "最大共有比率 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "最大シード時間 (0 = 無制限)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "システムトレイアイコンを表示"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "トレイアイコンに速度バーを表示"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "ダウンロード帯域幅 (kb/秒):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "アップロード帯域幅 (kb/秒):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "torrent が完了したときにポップアップメッセージを表示します。"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "ダウンロード完了後シードを続ける"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "一時ファイルを保存するフォルダ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "ダウンロードを自動的に saveDir に保存するかどうか"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "ダウンロードしたファイルを保存するフォルダ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "完了したダウンロードを自動的に completedDir に移動するかどうか"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "ダウンロードが完了したファイルを移動するフォルダ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ".torrent ファイルを自動的に torrentCopyDir にコピーするかどうか"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr ".torrent ファイルをコピーするフォルダ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "トラッカーにカスタム IP を送るかどうか"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "最後に保存先として使用されたディレクトリ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "トラッカーに送る IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "メモリの使用"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "GUI の更新間隔"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "DHT サポート"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT ポート"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "アップロードスロットの数"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "KTorrentView に表示するカラム"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "ET アルゴリズム"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr "ダウンロードを完了するために必要な容量がなく、ディスクの空き容量が minDiskSpace より少ない場合、torrent を停止します。"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "プラグインマネージャ"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "ロード"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "アンロード(&N)"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "すべてロード(&A)"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "すべてアンロード(&U)"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "デフォルトで使用する UPnP デバイス"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "検出したデバイス:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "デバイス"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "フォワードされたポート"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN 接続"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "ポートをフォワード(&A)"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "ポートフォワーディングを元に戻す"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "再スキャン"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "フォルダ 1 のスキャンを有効にしますか?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "フォルダ 2 のスキャンを有効にしますか?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "フォルダ 3 のスキャンを有効にしますか?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "フォルダ 1 のパス"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "フォルダ 2 のパス"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "フォルダ 3 のパス"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "質問せずに torrent を開くかどうか。"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "削除アクションがチェックされています。"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "移動アクションがチェックされています。"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "ScanFolder の設定"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "フォルダ &1 をスキャン"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "フォルダ &2 をスキャン"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "フォルダ &3 をスキャン"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+# ACCELERATOR changed by translator
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "ロード後に「ロード済み」ディレクトリに移動する(&M)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "ロード後に torrent を「ロード済み」ディレクトリに移動します"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "質問せずに torrent を開く(&Y)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "ダウンロードするファイルを選択するダイアログを表示しません"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "ロード後に削除する(&G)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "ロード後に torrent を削除します"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "スキャンするフォルダ"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "フォルダ 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "フォルダ 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "フォルダ 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "検索オプション"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "ウェブサーバ"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "ポートをフォワード"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "セッション TTL (秒):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "インターフェースを選択:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "ユーザ名:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "パスワードを変更..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "PHP 実行ファイルへのパス:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "ポート番号"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "ポートをフォワード"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "セッションを有効と見なす時間"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "インターフェースのスキン"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "PHP 実行ファイルへのパス"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "ユーザ名"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "パスワード"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "ピース"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "合計:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "ダウンロード中:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "ダウンロード済み:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "対象外:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "残り:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "サイズ:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "ピース"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "進捗"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "ピア"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "割り当てられたピア"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "シーダー:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "リーチャー:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "下り平均速度:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "上り平均速度:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "次の更新までの時間:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "トラッカーの状態:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "ダウンロード済みの torrent のピース:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "ダウンロード可能な torrent のピース:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "共有"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr "共有比率がこの値に達するとアップロードを中止します。0 にすると無制限に続けます。"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "この時間だけアップロードするとアップロードを中止します。"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "時間"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "共有比率制限:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "シードモードでのみ制限する"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "時間制限(&L):"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "トラッカーを更新(&U)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "最小更新間隔 - 60 秒"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "トラッカーを追加(&K)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "トラッカーを削除"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "トラッカーを変更(&A)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "標準に戻す"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "ピアビュータブをメインウィンドウに表示"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "ピースビュータブをメインウィンドウに表示"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "トラッカービュータブをメインウィンドウに表示"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "ピアの一覧を表示する"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "ダウンロード中のピースの一覧を表示する(&Y)"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "トラッカーの一覧を表示する"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IPBlocking の設定"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "PeerGuardian フィルタファイルを選択 "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "PeerGuardian フィルタを使う"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP フィルタファイル:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "ダウンロード/変換(&N)"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"PeerGuardian フィルタを bluetack.co.uk または blocklist.org からダウンロード。\n"
+"注意: bluetack.co.uk の ZIP ファイルはサポートしていません。"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Level1 フィルタの URL"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Level1 フィルタを使う"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "変換..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"「変換」ボタンをクリックすると antip2p ファイルの変換を開始します。注意: このプロセスは速いマシンでもしばらく時間がかかります。また、変換中は "
+"KTorrent を使用できません。"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "更新"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "チャートの更新間隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "GUI の更新ごと"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "データの収集間隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "ミリ秒"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "最大"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "速度スケールの最大モード:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "正確"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "詳しくは「これは何?」を参照"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"OY 軸の最大値の取り方を選択します:\n"
+"- Top: 全体の最大速度\n"
+"- 正確: チャートに表示される最大速度"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "ピアの速度"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "ピアの速度:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "更新間隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "チャートデータの更新ごと"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "たくさんのピアのデータを収集すると、CPU を多く消費することがあります。"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "ピアの接続数"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "値が大きくなると接続中のピアのチャートが分かりにくくなることがあります"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "スウォームのシーダーを表示する"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "スウォームのリーチャーを表示する"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "測定数"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "アップロード"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "接続"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "ピア"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "ピアの速度チャートを切り替え"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "ピアの速度データを収集する間隔"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "スウォームのリーチャーを表示するかどうか"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "スウォームのシーダーを表示するかどうか"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "ダウンロードの測定数"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "ピアの速度の測定数"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "アップロードの測定数"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "接続の測定数"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "DHT の測定数"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "OY 軸の最大モード"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "既存のダウンロードをインポート"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "データ:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "torrent とその torrent のダウンロード済みのデータを指定してください。"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "インポート(&I)"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "デフォルト"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS フィード"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "フィード"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "削除(&L)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "新規(&N)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "記事"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "自動更新(&R)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "TTL を無視する(&G)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "更新"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "タイトル(&T)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "記事を保持する日数"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "有効(&A)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "フィルタ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "許可フィルタ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "拒否フィルタ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "正規表現"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "シリーズとして扱う(&S)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "プロセス"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "シリーズの基準"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "最大エピソード"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "最大シーズン"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "最小シーズン"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "最小エピソード"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "テストテキスト(&X)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "テスト(&S)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "フィルタ結果"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "帯域幅スケジューラ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "左クリックカテゴリ"
+
+# ACCELERATOR changed by translator
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "カテゴリ &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "オフにする(&U)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "標準(&N)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "カテゴリ &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "カテゴリ &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "右クリックカテゴリ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "カテゴリ &1"
+
+# ACCELERATOR changed by translator
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "カテゴリ &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "カテゴリ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. カテゴリ</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. カテゴリ</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "ダウンロード:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "アップロード:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/秒 *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. カテゴリ</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 は無制限"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "ファイルに保存"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "ファイルからロード(&L)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "スケジュールをリセット"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "スケジューラプラグイン設定ページ"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "帯域幅スケジューラを使う(&B)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "帯域幅スケジューラ"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "ピックスマップの代わりに色を使う(&X)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(遅いシステムに推奨)"
+
+# ACCELERATOR changed by translator
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "スケジュールを編集(&S)"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "帯域幅スケジューラを有効にする"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "ピックスマップの代わりに色を使う"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "リッチログテキストを使う"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "一般情報メッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "接続メッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "DHT メッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "トラッカー情報メッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "ディスク IO 情報メッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "IPFilter プラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "検索プラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "PartFileImport プラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "情報ウィジェットプラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "UPnP プラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "ScanFolder プラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "スケジューラプラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "RSS プラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "WebInterface プラグインメッセージフラグ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "ログビューアのオプション"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "プラグイン"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "すべて"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "デバッグ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "通知"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "重要"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "なし"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IPFilter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "検索:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "ScanFolder:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "スケジューラ:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "情報ウィジェット:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS プラグイン:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "WebInterface プラグイン:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "システム"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "一般:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "接続:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "ディスク I/O:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "ログにリッチテキストを使う(&X)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "外部ブラウザ"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "検索結果を外部ブラウザで開く"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "標準のブラウザを使う"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "次のブラウザを使う (パスを指定):"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "検索エンジン"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "検索エンジン名:"
+
+# ACCELERATOR changed by translator
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "追加(&D)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "エンジン"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "すべて削除(&E)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "標準エンジンを追加(&L)"
+
+# ACCELERATOR added by translator
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "インターネットから更新(&U)"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "検索"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "検索エンジン:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "現在の検索エンジン"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "使用するブラウザを指定する"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "使用するブラウザの実行ファイルへのパス"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/秒"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "%n 日"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "はい、最初に"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "はい、最後に"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "ログファイル %1 を開けません: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "%1 に書き込めません: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "%1 から読み取れません"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "ディレクトリ %1 を作成できません: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "%1 のシンボリックリンク %2 を作成できません: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "%1 を %2 に移動できません: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "%1 を %2 にコピーできません: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "%1 を削除できません: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "%1 を作成できません: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "%1 のファイルサイズを計算できません: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "ファイルサイズを計算できません: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "%1 を開けません: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "ファイルを展開できません: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "ファイルを展開できません"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "ファイルをシークできません: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "mmap バッファの終端を越えて書き込むことはできません。"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>状態: %2<br>作者: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "ロード済み"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "未ロード"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "プラグインのオプション"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "ファイル %1 を開けません: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "ディレクトリ %1 は存在しません"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "不正なトークン: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "デコードエラー"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "予期しない入力の終端"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "%1 をintに変換できません"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "torrent が不完全です!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "torrent が壊れています!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "torrent にアナウンスまたはノードフィールドがありません"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "torrent ファイル %1 を開けません: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "パースエラー"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"torrent ファイルのロード中にエラーが発生しました。おそらく torrent ファイルが壊れているか、元々 torrent ファイルではありません。\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"torrent ファイルのロード中にエラーが発生しました。torrent ファイルが壊れているか、元々 torrent ファイルではないようです。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "%1 を作成できません: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr "torrent %1 は既にダウンロード中です。両方の torrent のトラッカーリストをマージしました。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "torrent %1 は既にダウンロード中です"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "%1 を移行できません: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"torrent %1 は前のバージョンの KTorrent で開始されています。このバージョンの KTorrent で間違いなく動くように、この "
+"torrent を移行します。その際に torrent を保存する場所を確認します。キャンセルを押すとホームディレクトリになります。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "保存先フォルダを選択"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "開始していません"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "シード中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "ダウンロード中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "ストールしました"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "停止中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "エラー: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "ディスク容量の割り当て"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "待機中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "データをチェック"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "停止しました。デバイスに容量が残っていません。"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr "この torrent をダウンロードするために必要なディスク容量がありません。本当に続けますか?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "%1 に必要なディスク容量がありません"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr "torrent \"%1\" は最大共有比率に達しました。制限を無視してシードを開始しますか?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "最大共有比率に達しました。"
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "torrent %1 の停止エラー: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "torrent %1 の開始エラー: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "アナウンス"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "未知のクライアント"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "%n ピア"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "ファイル %1 を作成できません : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "最初のピースを DND ファイルに書き込めません : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "最後のピースを DND ファイルに書き込めません : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "%1 を書き込みのために開けません : 読み取り専用のファイルシステム"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "ファイル %1 を展開できません: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "ファイル %1 を展開できません: 書き込みが不完全です"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "ファイル %1 を展開できません"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "エラー: ファイル %1 の終端を越えて読むことはできません"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "%1 からの読み取りエラー"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "%1 への書き込みエラー: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "%1 への書き込みエラー"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "ディスク領域の事前割り当てができません: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "UDP ポート %1 またはそれに続く 10 個のポートにバインドできません。"
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "トラッカーから無効な応答"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "トラッカーから無効なデータ"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "無効なトラッカー URL"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "ファイル %1 を開けません: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "インデックスファイルを作成できません: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "ファイルを開けません: %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "UPnP を使って自動的にルータのポートをフォワードします"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "デバイスの説明にポートフォワーディングサービスが見つかりません。"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP デバイス"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "自動的にディレクトリをスキャンして torrent ファイルをロードします。"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "スキャンフォルダ"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "ScanFolder"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "スキャンフォルダのオプション"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "ロード済み"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr "ScanFolder - フォルダ %1: URL が無効かフォルダが存在しません。有効なディレクトリを選んでください。"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "WebInterface"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "WebInterface (ウェブインターフェース) のオプション"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "PHP 実行ファイルがデフォルトのパスにありません。手動でパスを入力してください。"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "ウェブインターフェースのための新しいパスワードを入力してください。"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 は存在し、実行可能です"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 は存在しません"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 は実行ファイルではありません"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 はディレクトリです"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 はPHP 実行ファイルへのパスではありません"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "ウェブインターフェース"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "KTorrent をブラウザから操作できるようにします"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "最初にダウンロード"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "普通にダウンロード"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "最後にダウンロード"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "ファイルを削除"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "利用可能"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "保留"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr "これらのファイルのすべてのデータを失うことになります。本当によろしいですか?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "制限なし"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "情報ウィジェット"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr "ダウンロードに関する追加情報を表示します。ダウンロード済みのピース数、シーダーやリーチャーの数など。"
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "非公開 torrent にトラッカーを追加することはできません。"
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "torrent のデフォルトのトラッカーは削除できません。"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "非公開 torrent にトラッカーを追加することはできません"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "国"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "クライアント"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Choked"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Snubbed"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "利用可能"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "スコア"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "アップロードスロット"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "要求"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "ピアを追放"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "ピアを禁止"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - ダウンロード可能"
+"<br><img src=\"unavailable_color\">&nbsp; - ダウンロード不可"
+"<br><img src=\"excluded_color\">&nbsp; - 対象外"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "情報ウィジェットのオプション"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - ダウンロード済み"
+"<br><img src=\"unavailable_color\">&nbsp; - 未ダウンロード"
+"<br><img src=\"excluded_color\">&nbsp; - 対象外"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "変換"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "txt ファイルを読み込み..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "お待ちください..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "ファイルを変換しました。"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "フィルタをロードできません:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "不正なフィルタファイル。ファイルが壊れているか形式が不正です。"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "ピアの IP アドレスに基づいて不要なピアを除去します"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP フィルタ"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "状態: ロードして実行中"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "状態: 未ロード"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"状態: <font color=\"#ff0000\">フィルタファイルが見つかりません。</font>フィルタファイルをダウンロードして変換。"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "選択されたファイルは既にあります。もう一度ダウンロードしますか?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "ファイルは存在します"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "フィルタファイル (level1.dat) は既にあります。もう一度変換しますか?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IPBlocking"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IPBlocking (IP ブロッキング) フィルタのオプション"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "統計"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "統計のオプション"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "接続中のリーチャー"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "スウォームのリーチャー"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "接続中のシーダー"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "スウォームのシーダー"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "torrent あたりのリーチャーの平均接続数"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "torrent あたりのシーダーの平均接続数"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "実行中の torrent あたりのリーチャーの平均接続数"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "実行中の torrent あたりのシーダーの平均接続数"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "ノード"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "タスク"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "転送の統計を表示します"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "速度の総計"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "接続の統計"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "現在"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "平均"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "制限"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "リーチャーからの平均速度"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "リーチャーへの平均速度"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "シーダーからの平均速度"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "リーチャーから"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "シーダーから"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "凡例"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "torrent ファイル"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "すべてのファイル"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "データを検証できません: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "torrent ファイルをロードできません: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "一部または完全にダウンロードされた torrent を他のクライアントからインポートします。"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "既存のダウンロードをインポート"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "フィードの URL"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr "自動的に RSS フィードをスキャンして正規表現にマッチする torrent を ロードします。"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS フィード"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "%1 の有効な torrent を見つけてダウンロードできませんでした"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "タイトル"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "説明"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "リンク"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "シーズン"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "エピソード"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "時間"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "スケジューラ"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "スケジューラプラグインのオプション"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "月"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "火"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "水"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "木"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "金"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "土"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "日"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "スケジュールを保存しました。"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "ファイルが見つかりません。"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "スケジュールをロードしました。"
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "帯域幅スケジューラプラグイン"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "帯域幅スケジューラを開く"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr "帯域幅スケジューラを無効にしました。「設定」->「スケジューラ」で有効にできます。"
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "ログビューア"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "ログビューア"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "KTorrent のログ出力を表示します"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"ウェブブラウザを開いて、追加する検索エンジンを使って文字列 %1 (大文字) を検索してください。"
+"<br>検索結果が表示されたら、アドレスバーの URL をコピーしてここに貼り付けてください。"
+"<br>"
+"<br>例えば Google で %1 を検索すると次のようになります。"
+"<br>http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8"
+"<br>この URL をここに追加すると KTorrent で Google を使って検索できるようになります。"
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr "ウェブブラウザを開いて、追加する検索エンジンを使って文字列 %1 (大文字) を検索してください。検索結果の URL を下で使用します。"
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "検索エンジンの名前と URL を入力してください。"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "同じ名前の検索エンジンが既にあります。他の名前を使ってください。"
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr "URL が不正です。ウェブブラウザで FOOBAR を検索して、正確な URL をここに貼り付けてください。"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "検索"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "検索エンジンのオプション"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "%1 を検索中..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent ファイル"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "検索完了"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " エンジン: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "人気のある torrent 検索エンジンで torrent を検索"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "torrent をダウンロードしますか?それとも保存しますか?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "torrent をダウンロード"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "ダウンロード"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr "torrent を共有するためにローカルネットワークで KTorrent を実行しているピアを見つけます"
diff --git a/translations/ka/Makefile.am b/translations/ka/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/ka/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/ka/messages/Makefile.am b/translations/ka/messages/Makefile.am
new file mode 100644
index 0000000..8d1a798
--- /dev/null
+++ b/translations/ka/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = ka
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/ka/messages/ktorrent.po b/translations/ka/messages/ktorrent.po
new file mode 100644
index 0000000..41edb5a
--- /dev/null
+++ b/translations/ka/messages/ktorrent.po
@@ -0,0 +1,5112 @@
+# translation of ktorrent.po to Georgian
+#
+# Rusudan Tsiskreli <tsiskreli@gmail.com>, 2006.
+# რუსუდან ცისკრელი <tsiskreli@gmail.com>, 2006.
+# Rusudan Tsiskreli <r_tsiskreli@caucasus.net>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2006-03-28 01:25+0400\n"
+"Last-Translator: Giasher <giasher@telenet.ge>\n"
+"Language-Team: <www.gia.ge>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "ინფორმაცია"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "მიმდინარე სესიისას გადაცემული მონაცემები"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "ყველა ტორენტების მიმდინარე სიჩქარე"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "გაშვება"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "შეჩერება"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "ყველას გაშვება"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "ყველას შეჩერება"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Torrent URL-ს ჩასმა..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+#, fuzzy
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "QueueManager-ის გახსნა..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "IP ფილტრის ფაილი:"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+#, fuzzy
+msgid "Set max upload rate"
+msgstr "მაქსიმალური აქაჩვის დონე:"
+
+#: apps/ktorrent/ktorrent.cpp:574
+#, fuzzy
+msgid "Set max download rate"
+msgstr "მაქსიმალური ჩამოქაჩვის დონე:"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent ფაილები"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "ყველა ფაილი"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "ადგილმდებარეობის გახსნა"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "სიჩქარე ზემოთ: %1 / ქვემოთ: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "გადაცემული ზემოთ: %1 / ქვემოთ: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "&ზემოთ აწევა"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "&ზემოთ აწევა"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "&ზემოთ აწევა"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "აირჩიეთ Torrent-ის შესანახი ფაილი"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "უვარგისი URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "ჩამოქაჩვები"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "ატვირთული"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+#, fuzzy
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"მითითებული პორტი (%1) მიუწვდომელია ან მას სხვა პროგრამა იყენებს. KTorrent "
+"მიმაგრებულია %2 პორტზე."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "torrent შექმნა შეუძლებელია: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Recreate"
+msgstr "შე&ქმნა"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "ჩამოტვირთვა"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "შე&ქმნა"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "უსასრულობა"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "%1-ში ჩაწერის შეცდომა"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "%1-ში ჩაწერის შეცდომა"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "BitTorrent პროგრამა KDEსთვის"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "განბზიკვის რეჟიმი"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "გასახსნელი დოკუმენტი"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "მოდულები"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "საერთო პარამეტრები"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+#, fuzzy
+msgid "Application icon and a couple of others"
+msgstr "1.1 პროგრამის ხატულა და სხვები"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "ჩამოქაჩვათა ხატულა"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 პროგრამის ხატულა"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "ChunkBar's კარნახი და IWFileTreeItem დახარისხება"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "კონტროლირებადია"
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "ფაილის პარამეტრები"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "ფა&ილები"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "ფა&ილები"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "ფა&ილები"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "%1 ტორენტ ფაილის გახსნა ვერ განხორციელდა: %2"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "თქვენ უნდა აირჩიოთ ფაილი ან საქაღალდე."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "თქვენ ერთი ძაფი მაინც უნდა დაამატოთ."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent ფაილები (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "აირჩიეთ Torrent-ის შესანახი ფაილი"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "იქმნება %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "სხვა IP"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "სახელი"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "IP -სკენ -სკენ"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "ატვირთული"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "ჩამოქაჩვათა ხატულა"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "ჩამოტვირთვა"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "ატვირთული"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Torrent შექმნა"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "ჩამოტვირთვა"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "ატვირთული"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "ჩამოტვირთვა"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Torrent შექმნა"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Torrent შექმნა"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "ძიების პარამეტრები"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "ხელით განცხადება"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "წინასწარ ნახვა"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "დირექტორიები"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+#, fuzzy
+msgid "Data Directory"
+msgstr "დირექტორიები"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+#, fuzzy
+msgid "Temporary Directory"
+msgstr "დირექტორიები"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "ჩამოქაჩვათა ხატულა"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+#, fuzzy
+msgid "Add to Group"
+msgstr "სხვა IP"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "უვარგისი URL."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "პარამეტრები"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "ჩამოტვირთვის პარამეტრები"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "საერთო"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "საერთო პარამეტრები"
+
+#: apps/ktorrent/pref.cpp:283
+#, fuzzy
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"ვერ მოიძებნა %1 : %2\n"
+"გთხოვთ მოგვაწოდოთ მართებული IP მისამართი ან ჰოსტის სახელი."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "ფაილის პარამეტრები"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "სტატუსი"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "ჩამოქაჩული"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "ზომა"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "ატვირთული"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "ქვემოთ სიჩქარე"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "ზემოთ სიჩქარე"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "დარჩენილი დრო"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "მარცვლები:"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "წურბელები:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% დასრულდა"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "საზიარო სკალა:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "ჩამოქაჩული"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "დარჩენილი დრო"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Torrent"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "%n "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+#, fuzzy
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"%1 ტორენტის ჩამოტვირთვა არ დასრულებულა, გსურთ დაუსრულებელი მონაცემის წაშლაც?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "ჩამოტვირთვის წაშლა"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "თქვენ უკვე ქაჩავთ ამ ტორენტს."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "ჩამოქაჩვათა ხატულა"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "მომხმარებელი"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "როგის მმართველი"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "Torrent შექმნა"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> ჩამოქაჩვა დასრულდა.<br>საშუალო სიჩქარე: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "ჩამოტვირთვა დასრულდა"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "ჩამოტვირთვა დასრულდა"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> შეჩერდა შემდეგი შეცდომით: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "%1-ში ჩაწერის შეცდომა"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr ""
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "%1 ინდექსის ფაილის გახსნა ვერ განხორციელდა: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "რუსუდან ცისკრელი"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "tsiskreli@gmail.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "აირჩიეთ რომელ ფაილთა ჩამოტვირთვა გსურთ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "ჩამოტვირთვა"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "&მომხმარებელი კონტროლირებადია"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "ტორენტის &დამარცვლის დაწყება"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "ჩამოტვირთვა"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "&ყველას ამორჩევა"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&არაფრის ამორჩევა"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "არჩეულის შებრუნება"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "ჩამოტვირთვა"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, fuzzy, no-c-format
+msgid "Encryption"
+msgstr "აღწერა"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "სხვა IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "გაგზავნა IP ან"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "სხვა IP ან ჰოსტის სახელი:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Folders"
+msgstr "ფა&ილები"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "საქაღალდე დროებითი ფაილებისთვის:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "ჩამოტვირთვა"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "ჩამოქაჩვების &ავრომატურად აქ შენახვა:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "torrent ფაილები"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "ჩამოტვირთვის ხელსაწყოთა პანელი"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "ტორენტის &დამარცვლის დაწყება"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "მაქსიმალური აქაჩვის დონე:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "მაქსიმალური ჩამოქაჩვის დონე:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "კბ/წმ (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "პორტი:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Torrent ფაილები"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "მაქსიმალური ჩამოქაჩვები:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "მაქსიმალური მარცვლები:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "არაა დაწყებული"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "არაა დაწყებული"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "მაქსიმალური ჩამოქაჩვის დონე:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "საზიარო სკალა:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, fuzzy, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "მაქსიმალური კავშირები ჩამოქაჩვისას:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP პორტი:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "საზიარო სკალა:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "მაქსიმალური აქაჩვის დონე:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "კბ/წმ (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&ჩამოქაჩვის დასრულების შემდეგ მარცვლების დატოვება"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "ყურადღება"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"თუ როუტერის უკან ხართ, მაaშინ შემდეგი პორტების გადამისამართებაა საჭირო. UPnP "
+"მოდილს შეუძლია ამის გაკეთება."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT რიგის დიალოგი"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "მდგომარეობა:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "საზიარო სკალა:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "კონტროლირებადია"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "ატვირთული"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "ატვირთული"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, fuzzy, no-c-format
+msgid "M&ove up"
+msgstr "&ზემოთ აწევა"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "&ქვემოთ ჩაწევა"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "&ზემოთ აწევა"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, fuzzy, no-c-format
+msgid "&QM Controlled"
+msgstr "&QM კონტროლირებადია"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, fuzzy, no-c-format
+msgid "&User Controlled"
+msgstr "&მომხმარებელი კონტროლირებადია"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "URL-ს ჩასმა"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "გა&უქმება"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Torrent შექმნა"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "საქაღალდე ან ფაილი, რომლისგანაც გსურთ ტორენტის შექმნა:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "თქვენ ერთი ძაფი მაინც უნდა დაამატოთ."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "ფაილის პარამეტრები"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "ჯაჭვის ყოველი ნაკვეთის ზომა:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "კბ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "ტორენტის &დამარცვლის დაწყება"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "კომენტარები:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "შე&ქმნა"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "გა&უქმება"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "სახელი:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "სხვა IP ან ჰოსტის სახელი:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "პორტი"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "ძიების პარამეტრები"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "მიმდინარე საძიებო სისტემა"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "პარამეტრები"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "მეხსიერების გამოყენება:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "დაბალი"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "საშუალო"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "მაღალი"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "GUI განახლების ინტერვალი:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500მწ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1წ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2წ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5წ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "ჩამოქაჩვისას კავშირთა მაქსიმალური რაოდენობა (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "UDP პორტი:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "ჩამოქაჩვათა მაქსიმალური რაოდენობა (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "მარცვლების მაქსიმალური რაოდენობა (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, fuzzy, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "ჩამოქაჩვისას კავშირთა მაქსიმალური რაოდენობა (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, fuzzy, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "ჩამოქაჩვისას კავშირთა მაქსიმალური რაოდენობა (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "აქაჩვის მაქსიმალური სიჩქარე ბბ/წმ-ში (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "ჩამოაქაჩვის მაქსიმალური სიჩქარე ბბ/წმ-ში (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "მარცვლების მაქსიმალური რაოდენობა (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "მარცვლების მაქსიმალური რაოდენობა (0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "სისტემური პანელის ხატულის ჩვენება"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "ჩამოქაჩვის დასრულების შემდეგ მარცვლების დატოვება"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "დროებითი ფაილების შესანახი საქაღალდე"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, fuzzy, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "ჩამოქაჩვების &ავრომატურად აქ შენახვა:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "ჩამოქაჩული ფაილების შესანახი საქაღალდე"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "ჩამოქაჩვების &ავრომატურად აქ შენახვა:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "ჩამოქაჩული ფაილების შესანახი საქაღალდე"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "ჩამოქაჩვების &ავრომატურად აქ შენახვა:"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "დროებითი ფაილების შესანახი საქაღალდე"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, fuzzy, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "IP -სკენ -სკენ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP -სკენ -სკენ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "მეხსიერების გამოყენება"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "GUI-ს განახლების ინტერვალი"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "მოდულთა მმართველი"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "ჩატვირთვა"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "ა&მოტვირთვა"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "ყველას ჩატვირთვა"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "ყველას ამოტვირთვა"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "გამოსაყენებელი ნაგულისხმები UPnP მოწყობილობა"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "მოწყობილობების ამოცნობა:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "მოწყობილობა"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "გადამისამართებული პორტები"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, fuzzy, no-c-format
+msgid "Forw&ard Ports"
+msgstr "პორტების გადამისამართება"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "პორტების გადამისამართების გაუქმება"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "თავიდან სკანირება"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, fuzzy, no-c-format
+msgid "Folder1 path"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, fuzzy, no-c-format
+msgid "Folder2 path"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, fuzzy, no-c-format
+msgid "Folder3 path"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "%1 ტორენტ ფაილის გახსნა ვერ განხორციელდა: %2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "ძიების პარამეტრები"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, fuzzy, no-c-format
+msgid "Alt+2"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, fuzzy, no-c-format
+msgid "Alt+3"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "torrent ფაილები"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, fuzzy, no-c-format
+msgid "Folders to scan"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, fuzzy, no-c-format
+msgid "Folder 1:"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, fuzzy, no-c-format
+msgid "Folder 2:"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, fuzzy, no-c-format
+msgid "Folder 3:"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "ძიების პარამეტრები"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "პორტების გადამისამართება"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "&არაფრის ამორჩევა"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "მომხმარებელი"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "პორტების გადამისამართება"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "საერთო პარამეტრები"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "ჯაჭვის ნაწილები"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "სულ:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "მიმდინარე ჩამოქაჩვა:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "იქაჩება:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "გამორიცხულია:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, fuzzy, no-c-format
+msgid "Size:"
+msgstr "ზომა"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "ჯაჭვის ნაწილი"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "პროგრესი"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "მარცვლები:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "წურბელები:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, fuzzy, no-c-format
+msgid "Average Down Speed:"
+msgstr "საშუალო სიჩქარე"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, fuzzy, no-c-format
+msgid "Average Up Speed:"
+msgstr "საშუალო სიჩქარე"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "შემდეგი განახლება:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "მდგომარეობა:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "ფაილის ნაწილები, რომლებიც ჩამოიქაჩა:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "ფაილის ხელმისაწვდომი ნაწილები:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "გაზიარება"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "IP -სკენ -სკენ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "IP -სკენ -სკენ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "IP -სკენ -სკენ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "IP -სკენ -სკენ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, fuzzy, no-c-format
+msgid "Restore Defaults"
+msgstr "ნაგულისხმევის &დამატება"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "ჩვენება"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "ნაწილების ჩამოქაჩვის ხედის მთავარ ფანჯარაში ჩვენება"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, fuzzy, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "ჩვენება"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "ჩვენება სია"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "მიმდინარე ჩამოქაჩვის ჯაჭვების სიის ჩვენება"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, fuzzy, no-c-format
+msgid "Show list of trackers"
+msgstr "ჩვენება სია"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IPBlocking პარამეტრები"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "გსურთ KTorrent ფილტრის გამოყენება?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "გსურთ KTorrent ფილტრის გამოყენება?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP ფილტრის ფაილი:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "ჩამო&ტვირთვა/კონვერტირება"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "დონე1 url-ს ფილტრი"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "გსურთ 1 დონის ფილტრის გამოყენება?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "კონვერტაცია..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "GUI-ს განახლების ინტერვალი"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "მაქსიმალური მარცვლები:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "მაქსიმალური მარცვლები:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "ატვირთული"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "ჩამოტვირთვა Torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "არსებული ჩამოქაჩვის იმპორტირება"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "Torrent"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, fuzzy, no-c-format
+msgid "Data:"
+msgstr "მონაცემები"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"გთხოვთ განსაზღვროთ ტორენტი და ამ ტორენტისთვის უკვე ჩამოქაჩული მონაცემები."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, fuzzy, no-c-format
+msgid "&Import"
+msgstr "იმპო&რტი"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "ნაგულისხმევის &დამატება"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "მარცვლები:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "IP ფილტრის ფაილი:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "ყველა ფაილი"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "პროგრესი"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "საზიარო სკალა:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "ჩამოტვირთვა"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, fuzzy, no-c-format
+msgid "upload:"
+msgstr "ატვირთული"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, fuzzy, no-c-format
+msgid "* zero means no limit"
+msgstr "(0 = შეზღუდვის გარეშე)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, fuzzy, no-c-format
+msgid "O&k"
+msgstr "&ოკ"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "მოდულის პარამეტრები"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "ფაილის პარამეტრები"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "მოდულის პარამეტრები"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "მოდულის პარამეტრები"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "მოდულის პარამეტრები"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "ფაილის პარამეტრები"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "მოდულები"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, fuzzy, no-c-format
+msgid "Debug"
+msgstr "განბზიკვის რეჟიმი"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, fuzzy, no-c-format
+msgid "Important"
+msgstr "იმპო&რტი"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "IP ფილტრის ფაილი:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, fuzzy, no-c-format
+msgid "Search:"
+msgstr "ძიება"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, fuzzy, no-c-format
+msgid "UPnP:"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "ფა&ილები"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, fuzzy, no-c-format
+msgid "Scheduler:"
+msgstr "მარცვლები:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, fuzzy, no-c-format
+msgid "InfoWidget:"
+msgstr "ინფორმაციის ელემენტი"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "საერთო პარამეტრები"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, fuzzy, no-c-format
+msgid "General:"
+msgstr "საერთო"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, fuzzy, no-c-format
+msgid "Custom browser path:"
+msgstr "სხვა IP"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "საძიებო სისტემები"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "საძიებო სისტემის სახელი:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&დამატება"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "სისტემები"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "ყველას &წაშლა"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "ნაგულისხმევის &დამატება"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "GUI-ს განახლების ინტერვალი"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "ძიება"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "საძიებო სისტემა:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "მიმდინარე საძიებო სისტემა"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 გბ"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 მბ"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 კბ"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 ბ"
+
+#: libktorrent/interfaces/functions.cpp:47
+#, fuzzy
+msgid "%1 KB/s"
+msgstr "%1 კბ/წმ"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, fuzzy, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"_n: 1 day \n"
+"%n დღე"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "%1 ჟურნალის ფაილის გახსნა ვერ ხორციელდება: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "%1-ში ჩაწერა ვერ ხორციელდება: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "%1-დან წაკითხვა ვერ ხორციელდება"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "%1 დირექტორიის შექმნა ვერ განხორციელდა: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "სიმბმული ვერ კეთდება %1 %2-სკენ: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "%1 -ს %2-სკენ გადატანა ვერ განხორციელდა: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "%1 -ს %2-სკენ ასლი ვერ განხორციელდა: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "%1-ს წაშლა ვერ განხორციელდა: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "%1-ს შექმნა ვერ განხორციელდა: %2"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "ფაილის გახსნა ვერ განხორციელდა : %1 : %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "torrent ფაილის ჩატვირთვა ვერ განხორციელდა : %1"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "%1-ს გახსნა ვერ ხორციელდება: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+#, fuzzy
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "mmap ბუფერის დასრულების შემდეგ ჩაწერა შეუძლებელია!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "ჩატვირთულია"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "არაა ჩატვირთული"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "მოდულის პარამეტრები"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "%1 ფაილის გახსნა ვერ განხორციელდა: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "%1 დირექტორია არ არსებობს"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "ილეგალური მოხდა: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "დეკოდირების შეცდომა"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "შეტანის მოულოდნელი დასასრული"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "%1-ს int-ად კონვერტირება ვერ განხორციელდა"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent არ არის სრული!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "დაზიანებული ტორენტი!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "%1 ტორენტ ფაილის გახსნა ვერ განხორციელდა: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "ანალიზის შეცდომა"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"ტორენტის ჩატვირთვისას შეცდომა მოხდა. ტორენტი ან დაზიანებულია, ან ეს არაა ტორენტ "
+"ფაილი."
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"ტორენტის ჩატვირთვისას შეცდომა მოხდა. ტორენტი ან დაზიანებულია, ან ეს არაა ტორენტ "
+"ფაილი."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "%1 ტორენტ ფაილის გახსნა ვერ განხორციელდა: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "თქვენ უკვე ქაჩავთ ამ ტორენტს."
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "%1-ს მიგრაცია შეუძლებელია: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"%1 ტორენტი დაწყებულ იყო KTorrent-ის წინა ვერსიით. რათა დარწმუნებული ვიყოთ, რომ "
+"ეს ტორენტი KTorrent-ის მიმდინარე ვერსიაში იმუშავებს, ჩვენ გადმოიტანთ მას. თქვენ "
+"გკითხავთ თუ სად უნდა სეინახოთ ტორენტი. თუ დააწკაპუნებთ გაუქმებას, მაშინ თქვენი "
+"საშინაო საქაღალდფე იქნება არჩეული."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "ამოირჩიეთ შესანახი საქაღალდე"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "არაა დაწყებული"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "დამარცვლა"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "მიმდინარეობს ჩამოქაჩვა"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "გაყინულია"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "გაჩერებულია"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "შეცდომა:"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "%1 ტორენტის შეჩერების შეცდომა : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "%1 ტორენტის გაშვების შეცდომა: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "უცნობი კლიენტი"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "%n "
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "%1-ს შექმნა ვერ განხორციელდა: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "შეცდომა: წაკითხვა გადაცდა %1 ფაილის ბოლოს"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "%1-ს წაკითხვის შეცდომა"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "%1-ში ჩაწერის შეცდომა: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "%1-ში ჩაწერის შეცდომა"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "ვერ ხერხდება %1 udp პორტის ან შემდგომი 10 პორტის მიბმა."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "არასწორი პასუხი"
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr "არასწორი პასუხი"
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "არასწორი პასუხი"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "%1 ფაილის გახსნა ვერ განხორციელდა: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "ინდეხ ფაილის შექმნა ვერ განხორციელდა: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "ფაილის გახსნა ვერ განხორციელდა : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+#, fuzzy
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "მოწყობილობათა აღწერაში, პორტთა გადამისამართების სერვისი ვერ მოიძებნა!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP მოწყობილობები"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "ფა&ილები"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder"
+msgstr "ფა&ილები"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "ფაილის პარამეტრები"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+#, fuzzy
+msgid "loaded"
+msgstr "ატვირთული"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "საერთო პარამეტრები"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "%1 დირექტორია არ არსებობს"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+#, fuzzy
+msgid "%1 is a directory"
+msgstr "დირექტორიები"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "საერთო პარამეტრები"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "ჩამოქაჩვები"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "ჩამოტვირთვა დასრულდა"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "ჩამოქაჩვები"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "ყველა ფაილი"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "ხელმისაწვდომი"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "მოლოდინი"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "(0 = შეზღუდვის გარეშე)"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "ინფორმაციის ელემენტი"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "torrent შექმნა შეუძლებელია: %1"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+#, fuzzy
+msgid "Country"
+msgstr "კონტროლირებადია"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "კლიენტი"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "დახჩობა"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "მისაწვდომობა"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "ყველას ამოტვირთვა"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; ხელმისაწვდომი ჯაჭვის ნაწილები"
+"<br><img src=\"unavailable_color\">&nbsp; ხელმიუწვდომელი ჯაჭვის ნაწილები"
+"<br><img src=\"excluded_color\">&nbsp; გამორიცხული ჯაჭვის ნაწილები"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "ინფორმაციის ელემენტის პარამეტრები"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - ჩამოქაჩული ჯაჭვის ნაწილები"
+"<br><img src=\"unavailable_color\">&nbsp; - ჩამოსაქაჩი ჯაჭვის ნაწილები"
+"<br><img src=\"excluded_color\">&nbsp; - გამორიცხული ჯაჭვის ნაწილები"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "კონვერტაცია"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "txt ფაილის ჩატვირთვა..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "ფაილი კონვერტირებულია."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "ფილტრის ჩატვირთვა ვერ განხორციელდა:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "ფილტრის ცუდი ფაილი. იგი ან დაზიანებულია, ან ცუდი ფორმატი აქვს."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IP ფილტრის ფაილი:"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "სტატუსი: ჩატვირთულია და გაშვებული."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "სტატუსი: არაა ჩატვირთული"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"სტატუსი: <font color=\"#ff0000\">ფილტრის ფაილი ვერ მოიძებნა.</font> "
+"ჩამოტვირთეთ და დააკონვერტეთ ფილტრის ფაილი."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "არჩეული ფაილი უკვე არსებობს, გსურთ მისი თავიდან ჩამოტვირთვა?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "ფაილი არსებობს"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"ფილტრის ფაილი (level1.dat) უკვე არსებობს, გსურთ მისი თავიდან კონვერტაცია?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IPBlocking ფილტრი"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IPBlocking ფილტრის პარამეტრები"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "სტატუსი"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "წურბელები:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "ჩამოტვირთვა დასრულდა"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "სისტემური &პანელის ხატულის ჩვენება"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "მაქსიმალური კავშირები ჩამოქაჩვისას:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "მაქსიმალური კავშირები ჩამოქაჩვისას:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "სახელი:"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Torrent"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "(0 = შეზღუდვის გარეშე)"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "საშუალო სიჩქარე"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "საშუალო სიჩქარე"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "საშუალო სიჩქარე"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "წურბელები:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "ფა&ილები"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent ფაილები"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "ყველა ფაილი"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "მონაცემთა შემოწმება შეუძლებელია : %s"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "torrent ფაილის ჩატვირთვა ვერ განხორციელდა : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+#, fuzzy
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"KTorrent-ის ფაილთა ნაწილის იმპორტირების მოდული, საშუალებას გაძლევთ ნაწილობრივ "
+"ან სრულად ჩამოქაჩული ტორენტების სხვა კლიენტებიდან იმპორტირებას"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "არსებული ჩამოტვირთვის იმპორტირება"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "აღწერა"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "საზიარო სკალა:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "დარჩენილი დრო"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "მოდულის პარამეტრები"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+#, fuzzy
+msgid "File not found."
+msgstr "ფაილი კონვერტირებულია."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "KTorrent ძიების მოდული"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "ფაილის პარამეტრები"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"გამოიყენეთ ბრაუზერი %1 სტრიქონის საძიებოთ (მთავრული ასოებით) იმ საძიებო "
+"სისტემით, რომლის დამატებაც გსურთ. ძიების დასრულების შემდეგ გადმოიტანეთ URL აქ."
+"<br>მაგალითად Google-ზე %2-ს ძიება მოგცემთ "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. თუ აქ დაამატებთ ამ "
+"მისამართს, მაშინ ktorrent შეძლებს Google-ის გამოყენებით ძიებას."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "თქვენ უნდა შეიყვანოთ საძიებო სისტემის სახელი და URL."
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"საძიებო სისტემა ამ სახელით უკვე არსებობს. გთხოვთ სხვა სახელი გამოიყენოთ."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"ცუდი URL. თქვენ უნდა მოძებნოთ FOOBAR თქვენი ინტერნეტ ბრაუზერით და ჩასვათ აქ "
+"URL."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "ძიება"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "ძიების პარამეტრები"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "იძებნება %1 ..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent ფაილები"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "ძიება დასრულდა"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "სისტემები"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "გსურთ ჩამოქჩვა თუ torrent შენახვა?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "ჩამოტვირთვა Torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "ჩამოქაჩვა"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "ჯაჭვის ჩატვირთვა ვერ მოხერხდა %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "მდგომარეობა:"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "თქვენ ერთი ძაფი მაინც უნდა დაამატოთ."
+
+#~ msgid "DownloadPref"
+#~ msgstr "DownloadPref"
+
+#~ msgid "Alt+K"
+#~ msgstr "Alt+K"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#~ msgid "Alt+U"
+#~ msgstr "Alt+U"
+
+#~ msgid "Alt+A"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+U"
+
+#, fuzzy
+#~ msgid "Max ratio:"
+#~ msgstr "საზიარო სკალა:"
+
+#~ msgid "Name"
+#~ msgstr "სახელი"
+
+#~ msgid "Author"
+#~ msgstr "ავტორი"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "ჩამოტვირთვა დასრულდა"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "მითითებული udp პორტი (%1) ხელმიუწვდომელია ან სხვა პროგრამის მიერ გამოიყენება. KTorrent მიმაგრებულია %2 პორტზე."
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "ამოირჩიეთ შესანახი საქაღალდე"
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "ჩამოქაჩვები"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "ატვირთული"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "საძიებო სისტემები"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "Torrent"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "სტ&ატუსი"
+
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+Y"
+
+#~ msgid "InfoWidgetBase"
+#~ msgstr "InfoWidgetBase"
+
+#, fuzzy
+#~ msgid "Alt+G"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+1"
+
+#~ msgid "finished"
+#~ msgstr "დასრულდა"
+
+#~ msgid "Cannot bind to port %1 or the 10 following ports."
+#~ msgstr "ვერ ხერხდება %1 პორტის ან შემდგომი 10 პორტის მიბმა."
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "საძიებო სისტემები"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "ჩამოტვირთვა დასრულდა"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "ჩამოტვირთვა დასრულდა"
+
+#~ msgid "Completed"
+#~ msgstr "დასრულებულია"
+
+#~ msgid "Alt+C"
+#~ msgstr "Alt+C"
+
+#~ msgid "Unreachable"
+#~ msgstr "მიუწვდომელი"
+
+#~ msgid "Parse error"
+#~ msgstr "ანალიზის შეცდომა"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "ძიება"
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr "%n-ზე მეტი ჩამოქაჩვის დაწყება ვერ განხორციელდა. მიდით პარამეტრებში -> KTorrent-ის კონფიგურაციაში, თუ გსურთ შეზღუდვის შეცვლა."
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr "%n-ზე მეტი მარცვლის დაწყება შეუძლებელია. მიდით პარამეტრებში -> KTorrent-ის კონფიგურაციაში, თუ გსურთ შეზღუდვის შეცვლა."
+
+#~ msgid "Alt+O"
+#~ msgstr "Alt+O"
+
+#~ msgid "Select Filter File with IP Ranges in KTorrent Format"
+#~ msgstr "ამოირჩიეთ ფილტრის ფაილი IP შუალედებით KTorrent-ის ფორმატში"
+
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "გსურთ &KTorren ფილტრის გამოყენება t?"
+
+#~ msgid "Select Level1 Filter File (from Bluetack.co.uk or Openmedia.info)"
+#~ msgstr "ამოირჩიეთ 1 დონის ფილტრის ფაილი (Bluetack.co.uk ან Openmedia.info -დან)"
+
+#~ msgid "Use level&1 filter?"
+#~ msgstr "გსურთ 1 &დონის ფილტრის გამოყენება?"
+
+#~ msgid "IP filter file"
+#~ msgstr "IP ფილტრის ფაილი"
+
+#~ msgid "You must fill in the name field."
+#~ msgstr "თქვენ უნდა შეავსოთ სახელის ველი."
+
+#, fuzzy
+#~ msgid "Alt+R"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Available trackers:"
+#~ msgstr "ხელმისაწვდომი"
+
+#~ msgid "Down:"
+#~ msgstr "ქვემოთ:"
+
+#~ msgid "Up:"
+#~ msgstr "ზემოთ:"
+
+#, fuzzy
+#~ msgid "Fi&les"
+#~ msgstr "ფა&ილები"
+
+#~ msgid "KTorrent's UPnP plugin"
+#~ msgstr "KTorrent UPnP მოდული"
+
+#~ msgid "KTorrent's information widget plugin, it shows additional information about a download."
+#~ msgstr "KTorrent ინფორმაციის ელემენტის მოდული, იგი აჩვენებს ჩამოქაჩვათა შესახებ დამატებით ინფორმაციას."
+
+#~ msgid "KTorrent's IP filter plugin"
+#~ msgstr "KTorrent IP ფილტრის მოდული"
+
+#~ msgid "KTorrent's log viewer plugin"
+#~ msgstr "KTorrent ჟურნალის ხილვის მოდული"
+
+#~ msgid "KTorrent's search plugin"
+#~ msgstr "KTorrent ძიების მოდული"
+
+#, fuzzy
+#~ msgid "Re&store default."
+#~ msgstr "ნაგულისხმევის &დამატება"
+
+#~ msgid "Alt+Q"
+#~ msgstr "Alt+Q"
+
+#, fuzzy
+#~ msgid "Downlo&ad"
+#~ msgstr "ჩამოტვირთვა"
+
+#, fuzzy
+#~ msgid "&Seed"
+#~ msgstr "დამარცვლა"
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+1"
+
+#~ msgid "yes"
+#~ msgstr "დიახ"
+
+#~ msgid "no"
+#~ msgstr "არა"
+
+#~ msgid "This could take a couple of minutes. Please wait..."
+#~ msgstr "ამან შეიძლებას რამდენიმე წუთი დაიკავოს. გთხოვთ მოითმინოთ..."
+
+#~ msgid "Miscelanious"
+#~ msgstr "სხვადასხვა"
diff --git a/translations/lt/Makefile.am b/translations/lt/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/lt/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/lt/messages/Makefile.am b/translations/lt/messages/Makefile.am
new file mode 100644
index 0000000..833d56d
--- /dev/null
+++ b/translations/lt/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = lt
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/lt/messages/ktorrent.po b/translations/lt/messages/ktorrent.po
new file mode 100644
index 0000000..fa52745
--- /dev/null
+++ b/translations/lt/messages/ktorrent.po
@@ -0,0 +1,4944 @@
+# translation of ktorrent.po to Lithuanian
+#
+# Donatas Glodenis <dgvirtual@akl.lt>, 2005, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-09-03 13:21+0300\n"
+"Last-Translator: Donatas Glodenis <dgvirtual@akl.lt>\n"
+"Language-Team: Lithuanian <kde-i18n-lt@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Nėra įeinančių prisijungimų (greičiausiai dėl ugniasienės)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informacija"
+
+#: apps/ktorrent/ktorrent.cpp:185
+#, fuzzy
+msgid "Data transferred during the current session"
+msgstr "Duomenys persiųsti per esamą sesiją"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Esamas greitis sudėjus visus torentus"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupės"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Pradėti"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Į Eilę/Iš Eilės"
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "IP filtras:"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:574
+#, fuzzy
+msgid "Set max download rate"
+msgstr "Maksimalus bitų kiekis per sekundę:"
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "Torrent Files"
+msgstr "Torent bylos"
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "All Files"
+msgstr "Visos bylos"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Atverti adresą"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr " Siuntimų: %1 "
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Visi torentai"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Pasirinkite bylą"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr ""
+"#-#-#-#-# ktexteditor_insertfile.po (ktexteditor_insertfile) #-#-#-#-#\n"
+"Pasirinkite bylą įterpimui\n"
+"#-#-#-#-# katepart.po (katepart) #-#-#-#-#\n"
+"Pasirinkite įterpiamą bylą"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+#, fuzzy
+msgid "Malformed URL."
+msgstr "Blogas URL"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Atsiuntimai"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "Parsisiųsti"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, fuzzy, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Recreate"
+msgstr "Atkurti"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "Neatsisiųsti"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Trūksta duomenų bylų"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Atkurti"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Tikrinamas duomenų vientisumas"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "neribota"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Atidaryti dokumentą"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Bendros parinktys"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+#, fuzzy
+msgid "Application icon and a couple of others"
+msgstr "Programos ženkliukas"
+
+#: apps/ktorrent/main.cpp:131
+#, fuzzy
+msgid "The downloads icon"
+msgstr "Tik atsiųsti"
+
+#: apps/ktorrent/main.cpp:134
+#, fuzzy
+msgid "1.0 application icon"
+msgstr "Programos ženkliukas"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Dalių juostos pamokėlės ir IWFileTreeItem rūšiavimas"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "Bylos parinktys"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Visos bylos"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Visos bylos"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Visos bylos"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+#, fuzzy
+msgid "You must select a file or a folder."
+msgstr "Turite nurodyti namų aplanką."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "Turite nurodyti bent vieną spausdintuvą."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+#, fuzzy
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent bylos (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+#, fuzzy
+msgid "Choose File to Save Torrent"
+msgstr "Pasirinkite bylą, kurioje išsaugoti torentą"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+#, fuzzy
+msgid "Creating %1..."
+msgstr "Valoma %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Visos grupės"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nauja grupė"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "Redaguoti pavadinimą"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "Pašalinti grupę"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Parsisiųsti"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "Tik atsiųsti"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Parsisiųsti"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Parsisiųsti"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Sukurtas:"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "Parsisiųsti"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Parsisiųsti"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Esama byla"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "Parsisiųsti"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Sukurtas:"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Sukurtas:"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Sinchronizavimo pasirinkimai"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+#, fuzzy
+msgid "Manual Announce"
+msgstr "Rankraštinis vokas"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Peržiūra"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Atverti aplanką"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Laikinas aplankas"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Tik atsiųsti"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Torento nėra. Pranešti apie šią spragą KTorrent kūrėjams. "
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "Blogas URL"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Pasirinkimai"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Atsisiuntimų pasirinktys"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+#, fuzzy
+msgid "General"
+msgstr "Bendra"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Bendros parinktys"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Sudėtingesnės"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Sudėtingesnės parinktys"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Būsena"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Dydis"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "Siuntėjas:"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "SSL šifras:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "Dydžių santykis:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Atsiuntimai"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Esama byla"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"%n savaitė\n"
+"%n savaitės\n"
+"%n savaičių"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+#, fuzzy
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Sužymėjimas ištrins visus duomenis diskelyje.\n"
+"Ar Jūs tikri, kad norite tęsti?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+#, fuzzy
+msgid "Remove Download"
+msgstr "Atsiuntimai"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Ar Jūs norite priimti ar atmesti?"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "Tik atsiųsti"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Naudotojas"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "Sukurtas:"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+#, fuzzy
+msgid "Download completed"
+msgstr "Žymės savybės:"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Žymės savybės:"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+#, fuzzy
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "LDAP serveris grąžino šią klaidą: %1"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Neribota"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE KPart programa"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+#, fuzzy
+msgid "Cannot open index file %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: _translatorinfo.cpp:1
+#, fuzzy
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "nobody"
+
+#: _translatorinfo.cpp:3
+#, fuzzy
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "nobody@nowhere.lt"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Pasirinkite aplankus, kuriuos norite indeksuoti"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupė:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Stabdyti dokumento krovimą"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Pažymėti &viską"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, fuzzy, no-c-format
+msgid "Select &None"
+msgstr ""
+"#-#-#-#-# privacy.po (privacy) #-#-#-#-#\n"
+"Nieko nežymėti\n"
+"#-#-#-#-# digikam.po (digikam) #-#-#-#-#\n"
+"Pasirinkti nieko\n"
+"#-#-#-#-# kstars.po (kstars) #-#-#-#-#\n"
+"Pasirinkti nieko"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Apversti žymėjimą"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Laisva vieta diske:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Šifravimas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Sistemos dėklo ženkliukas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Folders"
+msgstr "Aplankai"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Aplankas, kuriame K3b laiko laikinas bylas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, fuzzy, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "A&utomatiškai pažymės ženkliukus"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Esama byla"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Stabdyti dokumento krovimą"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "Maksimalus bitų kiekis per sekundę:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Maksimalus bitų kiekis per sekundę:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Prievadas:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Esama byla"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Iš&valyti"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Įrašyti &kaip..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "Takeliai"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maksimalus bitų kiekis per sekundę:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "Dydžių santykis:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "UDP tracker port:"
+msgstr "Popieriaus formatas:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "Dydžių santykis:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Dėmesio"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, fuzzy, no-c-format
+msgid "Status:"
+msgstr "Būsena:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, fuzzy, no-c-format
+msgid "Tracker:"
+msgstr "Takelis"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, fuzzy, no-c-format
+msgid "Share ratio:"
+msgstr "Dydžių santykis:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, fuzzy, no-c-format
+msgid "Torrent"
+msgstr "Esama byla"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, fuzzy, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, fuzzy, no-c-format
+msgid "C&ancel"
+msgstr "Atš&aukti"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, fuzzy, no-c-format
+msgid "Create Torrent"
+msgstr "Sukurtas:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Turite nurodyti bent vieną spausdintuvą."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Bylos parinktys"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, fuzzy, no-c-format
+msgid "Size of each chunk:"
+msgstr "Fono krepšio dydis:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, fuzzy, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, fuzzy, no-c-format
+msgid "256"
+msgstr "16"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, fuzzy, no-c-format
+msgid "512"
+msgstr "12"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, fuzzy, no-c-format
+msgid "1024"
+msgstr "224"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, fuzzy, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Stabdyti dokumento krovimą"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, fuzzy, no-c-format
+msgid "Comments:"
+msgstr "Komentarai:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "&Sukurti"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, fuzzy, no-c-format
+msgid "Ca&ncel"
+msgstr "A&tšaukti"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, fuzzy, no-c-format
+msgid "Trackers"
+msgstr "Takeliai"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Vardas:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Prievadas"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Sinchronizavimo pasirinkimai"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "&Numatytasis paieškos variklis:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Pasirinkimai"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Žemas"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Vidutinis"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Aukštas"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, fuzzy, no-c-format
+msgid "GUI update interval:"
+msgstr "Tik &kitas šablonas"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Tinklai"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Popieriaus formatas:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Testas"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Aplankas, kuriame K3b laiko laikinas bylas"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, fuzzy, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "A&utomatiškai pažymės ženkliukus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, fuzzy, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Aplankas, kuriame reikia generuoti bylas"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "A&utomatiškai pažymės ženkliukus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Aplankas, kuriame reikia generuoti bylas"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "A&utomatiškai pažymės ženkliukus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Aplankas, kuriame K3b laiko laikinas bylas"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, fuzzy, no-c-format
+msgid "GUI update interval"
+msgstr "Tik &kitas šablonas"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Priedų tvarkyklė"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Įkelti"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, fuzzy, no-c-format
+msgid "U&nload"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, fuzzy, no-c-format
+msgid "Device"
+msgstr "Įrenginys"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, fuzzy, no-c-format
+msgid "Folder1 path"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, fuzzy, no-c-format
+msgid "Folder2 path"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, fuzzy, no-c-format
+msgid "Folder3 path"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Sinchronizavimo pasirinkimai"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Esama byla"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, fuzzy, no-c-format
+msgid "Folders to scan"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, fuzzy, no-c-format
+msgid "Folder 1:"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, fuzzy, no-c-format
+msgid "Folder 2:"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, fuzzy, no-c-format
+msgid "Folder 3:"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, fuzzy, no-c-format
+msgid "Search Preferences"
+msgstr "Sinchronizavimo pasirinkimai"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr ""
+"#-#-#-#-# privacy.po (privacy) #-#-#-#-#\n"
+"Nieko nežymėti\n"
+"#-#-#-#-# digikam.po (digikam) #-#-#-#-#\n"
+"Pasirinkti nieko\n"
+"#-#-#-#-# kstars.po (kstars) #-#-#-#-#\n"
+"Pasirinkti nieko"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Naudotojo vardas:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Bendros parinktys"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, fuzzy, no-c-format
+msgid "Chunks"
+msgstr "Chorus"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, fuzzy, no-c-format
+msgid "Total:"
+msgstr "Iš viso:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, fuzzy, no-c-format
+msgid "Currently downloading:"
+msgstr "Esama eilutė:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, fuzzy, no-c-format
+msgid "Excluded:"
+msgstr "I&šskyrus ruožą:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, fuzzy, no-c-format
+msgid "Size:"
+msgstr "Dydis:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Eiga"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, fuzzy, no-c-format
+msgid "Seeders:"
+msgstr "Siuntėjas:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, fuzzy, no-c-format
+msgid "Leechers:"
+msgstr "SSL šifras:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, fuzzy, no-c-format
+msgid "Average Down Speed:"
+msgstr "Vidutinis"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, fuzzy, no-c-format
+msgid "Average Up Speed:"
+msgstr "Vidutinis"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, fuzzy, no-c-format
+msgid "Next update in:"
+msgstr "Tik &kitas šablonas"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Takeliai"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Valandos"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "Takelis"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Takelis"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Takelis"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Takelis"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, fuzzy, no-c-format
+msgid "Restore Defaults"
+msgstr ""
+"#-#-#-#-# k3b.po (k3b) #-#-#-#-#\n"
+"numatytas\n"
+"#-#-#-#-# kcmlilo.po (kcmlilo) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# kstars.po (kstars) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# kcmmediacontrol.po (kcmmediacontrol) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# mediacontrol.po (mediacontrol) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# krdc.po (krdc) #-#-#-#-#\n"
+"numatytas"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, fuzzy, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Esama eilutė:"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, fuzzy, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Pasirinkimai"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Esama byla"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Esama byla"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, fuzzy, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Tik atsiųsti"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, fuzzy, no-c-format
+msgid "Converting..."
+msgstr "Valoma %1..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Atnaujinti"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "Tik &kitas šablonas"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Tiksliai"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Įkelti"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Tik atsiųsti"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "Esama byla"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importuoti"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "įprastas"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "Kanalai"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Ištrinti"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Naujas"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Atnaujinti"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "Ant&raštė"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Filtrai"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Eiga"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "Dydžių santykis:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&stas"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normalus"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorijos"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, fuzzy, no-c-format
+msgid "upload:"
+msgstr "Parsisiųsti"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Išsaugoti į bylą"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, fuzzy, no-c-format
+msgid "O&k"
+msgstr "Ge&rai"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Bylos parinktys"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Bylos parinktys"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Bylos parinktys"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Bylos parinktys"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Bylos parinktys"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "Bylos parinktys"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Priedai"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Visi"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Išriktuoti"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Svarbus"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Nieko"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "Pasirinkimai"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, fuzzy, no-c-format
+msgid "Search:"
+msgstr "Ieškoti:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "Visos bylos"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, fuzzy, no-c-format
+msgid "Scheduler:"
+msgstr "Siuntėjas:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Bendros parinktys"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistema"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, fuzzy, no-c-format
+msgid "General:"
+msgstr "Bendra"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, fuzzy, no-c-format
+msgid "Search Engines"
+msgstr "&Iškoti kanalų"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, fuzzy, no-c-format
+msgid "Search engine name:"
+msgstr "Ieškoti &paslaugų teikėjo vardą:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, fuzzy, no-c-format
+msgid "&Add"
+msgstr "&Pridėti"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, fuzzy, no-c-format
+msgid "Engines"
+msgstr "Anglų"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, fuzzy, no-c-format
+msgid "R&emove All"
+msgstr ""
+"#-#-#-#-# amarok.po (amarok) #-#-#-#-#\n"
+"&Pašalinti\n"
+"#-#-#-#-# kmail.po (kmail) #-#-#-#-#\n"
+"Pa&šalinti\n"
+"#-#-#-#-# knewsticker.po (knewsticker) #-#-#-#-#\n"
+"&Pašalinti\n"
+"#-#-#-#-# juk.po (juk) #-#-#-#-#\n"
+"&Pašalinti"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, fuzzy, no-c-format
+msgid "Add Defau&lt"
+msgstr ""
+"#-#-#-#-# k3b.po (k3b) #-#-#-#-#\n"
+"numatytas\n"
+"#-#-#-#-# kcmlilo.po (kcmlilo) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# kstars.po (kstars) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# kcmmediacontrol.po (kcmmediacontrol) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# mediacontrol.po (mediacontrol) #-#-#-#-#\n"
+"įprastas\n"
+"#-#-#-#-# krdc.po (krdc) #-#-#-#-#\n"
+"numatytas"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "Tik &kitas šablonas"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Ieškoti"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, fuzzy, no-c-format
+msgid "Search engine:"
+msgstr "Ieškoti &tik:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, fuzzy, no-c-format
+msgid "Current search engine"
+msgstr "&Numatytasis paieškos variklis:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+#, fuzzy
+msgid "%1 KB/s"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+#, fuzzy
+msgid "Cannot open log file %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/util/file.cpp:87
+#, fuzzy
+msgid "Cannot write to %1 : %2"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/util/file.cpp:101
+#, fuzzy, c-format
+msgid "Cannot read from %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:108
+#, fuzzy
+msgid "Cannot move %1 to %2: %3"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+#, fuzzy
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: libktorrent/util/fileops.cpp:232
+#, fuzzy
+msgid "Cannot delete %1: %2"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+#, fuzzy
+msgid "Cannot open %1 : %2"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Neįkeltas"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+#, fuzzy
+msgid "Plugin Options"
+msgstr "Bylos parinktys"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+#, fuzzy
+msgid "Cannot open file %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, fuzzy, c-format
+msgid "Illegal token: %1"
+msgstr "Neleistinas prioritetas: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+#, fuzzy
+msgid "Decode error"
+msgstr "Įrenginys Klaida"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+#, fuzzy
+msgid "Unexpected end of input"
+msgstr "netikėta bylos pabaiga"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+#, fuzzy
+msgid "Cannot convert %1 to an int"
+msgstr "<qt>Nepavyksta atverti <b>%1</b> bylos skaitymui!</qt>"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+#, fuzzy
+msgid "Torrent is incomplete!"
+msgstr "Esama byla"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+#, fuzzy
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Ar Jūs norite priimti ar atmesti?"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+#, fuzzy
+msgid "Cannot migrate %1 : %2"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+#, fuzzy
+msgid "Select Folder to Save To"
+msgstr "Pasirink žodyną"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+#, fuzzy
+msgid "Seeding"
+msgstr "Siunčiama"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Atsisiunčiama"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Užstrigo"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Sustojo"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Klaida: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Patalpinta į eilę"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+#, fuzzy
+msgid "Error stopping torrent %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/torrent/queuemanager.cpp:742
+#, fuzzy
+msgid "Error starting torrent %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr ""
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, fuzzy, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"%n savaitė\n"
+"%n savaitės\n"
+"%n savaičių"
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, fuzzy, c-format
+msgid "Error reading from %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+#, fuzzy
+msgid "Error writing to %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, fuzzy, c-format
+msgid "Error writing to %1"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "Klaidingas serverio atsakas"
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr "Klaidingas serverio atsakas"
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "Klaidingas serverio atsakas"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr ""
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, fuzzy, c-format
+msgid "Cannot create index file: %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+#, fuzzy
+msgid "Cannot open file : %1 : %2"
+msgstr "Nepavyksta atidaryti bylos %1."
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Visos bylos"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder"
+msgstr "Visos bylos"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "Bylos parinktys"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+#, fuzzy
+msgid "loaded"
+msgstr "Parsisiųsti"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Bendros parinktys"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 neegzistuoja"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Bendros parinktys"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "Atsiuntimai"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "Žymės savybės:"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "Atsiuntimai"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "Visos bylos"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+#, fuzzy
+msgid "Available"
+msgstr "Prieinama versija"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+#, fuzzy
+msgid "Pending"
+msgstr "Siunčiama"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Šalis"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klientas"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+#, fuzzy
+msgid "Availability"
+msgstr ""
+"#-#-#-#-# kmldonkey.po (kmldonkey) #-#-#-#-#\n"
+"#-#-#-#-# kopete.po (kopete) #-#-#-#-#\n"
+"G&alimi:"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Įvertinimas"
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "Parsisiųsti"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Konvertuoti"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Lukterėkite..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IP filtras:"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+#, fuzzy
+msgid "File Exists"
+msgstr "Byla jau yra"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter"
+msgstr "Pasirinkimai"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter Options"
+msgstr "Bylos parinktys"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Statistika"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "SSL šifras:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "SSL šifras:"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Žymės savybės:"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Vardas:"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Užduotys"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Dabartines"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Vidutinis"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Vidutinis"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Vidutinis"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Vidutinis"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "SSL šifras:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Visos bylos"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "Torrent files"
+msgstr "Esama byla"
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "All files"
+msgstr "Visos bylos"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "Nepavyksta sukurti %1: %2"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, fuzzy, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Nepavyko sukurti aplanko %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr ""
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS kanalai"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Antraštė"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Aprašymas"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Jungtis"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "Dydžių santykis:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Laikas"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "Bylos parinktys"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "&Numatytasis paieškos variklis:"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "Bylos parinktys"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+#, fuzzy
+msgid "You must enter the search engine's name and URL"
+msgstr "Turite įvesti projekto vardą ir bylą"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+#, fuzzy
+msgid "Search Engine Options"
+msgstr "Paieškos parinktys"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "Valoma %1..."
+
+#: plugins/search/searchwidget.cpp:209
+#, fuzzy
+msgid "torrent files"
+msgstr "Esama byla"
+
+#: plugins/search/searchwidget.cpp:267
+#, fuzzy
+msgid "Search finished"
+msgstr "Sinchronizavimas baigtas"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Anglų"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+#, fuzzy
+msgid "Do you want to download or save the torrent?"
+msgstr "Ar Jūs norite priimti ar atmesti?"
+
+#: plugins/search/htmlpart.cpp:166
+#, fuzzy
+msgid "Download Torrent"
+msgstr "Tik atsiųsti"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Nepavyko sukurti aplanko %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Takeliai"
diff --git a/translations/ms/Makefile.am b/translations/ms/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/ms/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/ms/messages/Makefile.am b/translations/ms/messages/Makefile.am
new file mode 100644
index 0000000..fc19612
--- /dev/null
+++ b/translations/ms/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = ms
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/ms/messages/ktorrent.po b/translations/ms/messages/ktorrent.po
new file mode 100644
index 0000000..ac08726
--- /dev/null
+++ b/translations/ms/messages/ktorrent.po
@@ -0,0 +1,5024 @@
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-02-13 12:57+0730\n"
+"Last-Translator: Sharuzzaman Ahmat Raslan <sharuzzaman@myrealbox.com>\n"
+"Language-Team: LANGUAGE <kde-i18n-doc@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Maklumat"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+#, fuzzy
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Dokumen yang hendak dibuka"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+#, fuzzy
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Dokumen yang hendak dibuka"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+#, fuzzy
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Dengar semua alamat"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+#, fuzzy
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Dengar semua alamat"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IPFilter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+#, fuzzy
+msgid "Set max upload rate"
+msgstr "<b>Kadar Ke_segaran Menegak:</b>"
+
+#: apps/ktorrent/ktorrent.cpp:574
+#, fuzzy
+msgid "Set max download rate"
+msgstr "<b>Kadar Ke_segaran Menegak:</b>"
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "Torrent Files"
+msgstr ""
+"*.db|Fail Pengkalan Data\n"
+"*|Semua Fail"
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "All Files"
+msgstr ""
+"*.db|Fail Pengkalan Data\n"
+"*|Semua Fail"
+
+#: apps/ktorrent/ktorrent.cpp:627
+#, fuzzy
+msgid "Open Location"
+msgstr "Buka Fail"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Mematikan $MODEL: "
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "Mematikan $MODEL: "
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: off"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Laras Semua..."
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "Menetapkan"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "Menetapkan"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "Menetapkan"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+#, fuzzy
+msgid "Choose a file"
+msgstr "Fail Wujud"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "Pilih lokasi untuk menyimpan fail"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+#, fuzzy
+msgid "Malformed URL."
+msgstr "URL Autokonfigurasi:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, fuzzy, c-format
+msgid "Cannot create torrent: %1"
+msgstr "gagal reka direktori:%s"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "Tidak dapat mencari bahagian KDevDesigner."
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Gagal mencipta fail %s"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Gagal mencipta fail %s"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Gagal mencipta fail %s"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Name=Ralat proses"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "ralat menulis ke fail"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:108
+#, fuzzy
+msgid "Debug mode"
+msgstr "Mod Penyelamatan"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+#, fuzzy
+msgid "Document to open"
+msgstr "Dokumen yang hendak dibuka"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "Plugin"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Pilihan Umum"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:131
+#, fuzzy
+msgid "The downloads icon"
+msgstr "Tiada icon"
+
+#: apps/ktorrent/main.cpp:134
+#, fuzzy
+msgid "1.0 application icon"
+msgstr "Name=Aplikasi"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "Diperlukan oleh"
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "Fail Wujud"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Pilihan Umum"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Pilihan Umum"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Pilihan Umum"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Tidak menjumpai fail comps."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "Anda mesti masukkan sekurang-kurangnya satu Sistem Operasi"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+#, fuzzy
+msgid "Torrent Files (*.torrent)"
+msgstr ""
+"*.db|Fail Pengkalan Data\n"
+"*|Semua Fail"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+#, fuzzy
+msgid "Choose File to Save Torrent"
+msgstr "Pilih lokasi untuk menyimpan fail"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+#, fuzzy
+msgid "Creating %1..."
+msgstr "Mencipta"
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "%1 (widget tersendiri)"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+#, fuzzy
+msgid "New Group"
+msgstr "Teks baru"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "Name=KDevAdaProject"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "Maklumat penjejak"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "Tiada icon"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Muat Turun"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Pemilih torrent"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "Muat Turun"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "Muat Turun"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Pemilih torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Pemilih torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Tambah Bar Alatan"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+#, fuzzy
+msgid "Manual Announce"
+msgstr "/Bantuan/_Manual"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Pralihat"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "Buka Fail"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+#, fuzzy
+msgid "Data Directory"
+msgstr "Direktori"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+#, fuzzy
+msgid "Temporary Directory"
+msgstr "Direktori"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Tiada icon"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+#, fuzzy
+msgid "Add to Group"
+msgstr "Tambah Bar Alatan ke '%1'"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "URL Autokonfigurasi:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Keutamaan"
+
+#: apps/ktorrent/pref.cpp:147
+#, fuzzy
+msgid "Download Options"
+msgstr "Opsyen RAID"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Umum"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, fuzzy, no-c-format
+msgid "General Options"
+msgstr "Pilihan Umum"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Opsyen Sistem Fail"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+#, fuzzy
+msgid "Downloaded"
+msgstr "Pakej sudah dimuatturun"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Saiz"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+#, fuzzy
+msgid "Uploaded"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, fuzzy, no-c-format
+msgid "Down Speed"
+msgstr "Kelajuan Failover"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+#, fuzzy
+msgid "Up Speed"
+msgstr "Kelajuan Failover"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+#, fuzzy
+msgid "Time Left"
+msgstr "Waktu Alaska"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+#, fuzzy
+msgid "% Complete"
+msgstr "Selesai"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "Nama Perkongsian"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Pakej sudah dimuatturun"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "Waktu Alaska"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Torrent"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "Alamat rakan jauh:"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:378
+#, fuzzy
+msgid "Remove Download"
+msgstr "Muatturun Dipilih"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "Tiada icon"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+#, fuzzy
+msgid "Yes, delete the files"
+msgstr ""
+"*.db|Fail Pengkalan Data\n"
+"*|Semua Fail"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+#, fuzzy
+msgid "No, keep the files"
+msgstr ""
+"*.db|Fail Pengkalan Data\n"
+"*|Semua Fail"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Pengguna"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, fuzzy, no-c-format
+msgid "Queue Manager"
+msgstr "Pengurus Pencetak"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "Pemilih torrent"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+#, fuzzy
+msgid "Download completed"
+msgstr "Muatturun Dipilih"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Muatturun Dipilih"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "ralat menulis ke fail"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr ""
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+#, fuzzy
+msgid "A KDE KPart Application"
+msgstr "Name=KDevelop: KDE/C++"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+#, fuzzy
+msgid "Cannot open index file %1 : %2"
+msgstr "Tidak dapat membuka '%1'. Fail tidak wujud."
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Sharuzzaman Ahmat Raslan"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "<sharuzzaman@myrealbox.com>"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Muat Turun"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "Edit Pengguna"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Fail torrent awam"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, fuzzy, no-c-format
+msgid "Download"
+msgstr "Muat Turun"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, fuzzy, no-c-format
+msgid "Select &All"
+msgstr "Laras Semua..."
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, fuzzy, no-c-format
+msgid "Select &None"
+msgstr "Pilih Partisyen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, fuzzy, no-c-format
+msgid "Invert Selection"
+msgstr "Terbal&ik Pilihan"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "Muat Turun"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, fuzzy, no-c-format
+msgid "Encryption"
+msgstr "Huraian"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, fuzzy, no-c-format
+msgid "Use protocol encryption"
+msgstr "Guna Hint Saiz"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, fuzzy, no-c-format
+msgid "Custom IP"
+msgstr "%1 (widget tersendiri)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Namahos atau Alamat IP/Subnet:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Namahos atau Alamat IP/Subnet:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "Comment=Pengurus Sistem Kawalan Versi"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Aplet Amaran Dulang Sistem"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Aplet Amaran Dulang Sistem"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Folders"
+msgstr "Lo-Fi"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Muat Turun"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, fuzzy, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Berbalik ke yang Ter_akhir Disimpan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Fail torrent awam"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, fuzzy, no-c-format
+msgid "Download Toolbar"
+msgstr "Tambah Bar Alatan"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Fail torrent awam"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "<b>Kadar Ke_segaran Menegak:</b>"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "<b>Kadar Ke_segaran Menegak:</b>"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "(tiada tetikus dikonfigurasikan)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, fuzzy, no-c-format
+msgid "Add potential peer"
+msgstr "Tambah Bar Alatan ke '%1'"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "Alamat rakan jauh:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Fail torrent awam"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, fuzzy, no-c-format
+msgid "Add peer:"
+msgstr "Tambah Bar Alatan"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, fuzzy, no-c-format
+msgid "Maximum downloads:"
+msgstr "Volum Logikal Maksimum:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, fuzzy, no-c-format
+msgid "Maximum seeds:"
+msgstr "Volum Logikal Maksimum:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "$prog tidak dimulakan..."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "$prog tidak dimulakan..."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, fuzzy, no-c-format
+msgid "(0 is no limit)"
+msgstr "(tiada tetikus dikonfigurasikan)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Maximum download rate:"
+msgstr "<b>Kadar Ke_segaran Menegak:</b>"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "Nama Perkongsian"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, fuzzy, no-c-format
+msgid "Number of upload slots:"
+msgstr "Papar nombor baris"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "UDP tracker port:"
+msgstr "Amerika/Port_of_Spain"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "Nama Perkongsian"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Maximum upload rate:"
+msgstr "<b>Kadar Ke_segaran Menegak:</b>"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(tiada tetikus dikonfigurasikan)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, fuzzy, no-c-format
+msgid "Attention"
+msgstr "Perhatian!"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, fuzzy, no-c-format
+msgid "KT Queue Dialog"
+msgstr "dialog telah dibatalkan"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, fuzzy, no-c-format
+msgid "Tracker:"
+msgstr "Maklumat penjejak"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, fuzzy, no-c-format
+msgid "Share ratio:"
+msgstr "Nama Perkongsian"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, fuzzy, no-c-format
+msgid "Controlled by"
+msgstr "Diperlukan oleh"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, fuzzy, no-c-format
+msgid "M&ove up"
+msgstr "Menetapkan"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, fuzzy, no-c-format
+msgid "Move dow&n"
+msgstr "/Mudah Alih"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "Dokumen yang hendak dibuka"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, fuzzy, no-c-format
+msgid "Move to &bottom"
+msgstr "Dokumen yang hendak dibuka"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, fuzzy, no-c-format
+msgid "&QM Controlled"
+msgstr "Diperlukan oleh"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, fuzzy, no-c-format
+msgid "&User Controlled"
+msgstr "Edit Pengguna"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, fuzzy, no-c-format
+msgid "Paste URL"
+msgstr "URL Autokonfigurasi:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, fuzzy, no-c-format
+msgid "Create Torrent"
+msgstr "Pemilih torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Anda mesti masukkan sekurang-kurangnya satu Sistem Operasi"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "File Options"
+msgstr "Fail Wujud"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, fuzzy, no-c-format
+msgid "Size of each chunk:"
+msgstr "Guna Hint Saiz"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, fuzzy, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Fail torrent awam"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, fuzzy, no-c-format
+msgid "Ca&ncel"
+msgstr "Lokasi sijil CA SSL."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Nama:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "Namahos atau Alamat IP/Subnet:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Lebih Keutamaan"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "Hasil pencarian bagi "
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Keutamaan"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, fuzzy, no-c-format
+msgid "Memory usage:"
+msgstr "penggunaan: %s [pilihan]"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Rendah"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Sederhana"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Tinggi"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, fuzzy, no-c-format
+msgid "GUI update interval:"
+msgstr "Pereka GUI KDE"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Amerika/Port_of_Spain"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, fuzzy, no-c-format
+msgid "Number of chunks found :"
+msgstr "Papar nombor baris"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, fuzzy, no-c-format
+msgid "Show a system tray icon"
+msgstr "Aplet Amaran Dulang Sistem"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Aplet Amaran Dulang Sistem"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, fuzzy, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Berbalik ke yang Ter_akhir Disimpan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Berbalik ke yang Ter_akhir Disimpan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Berbalik ke yang Ter_akhir Disimpan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Tidak menjumpai fail comps."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, fuzzy, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Hantar kepada Skrip CGI"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, fuzzy, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "Hantar kepada Skrip CGI"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, fuzzy, no-c-format
+msgid "Memory usage"
+msgstr "penggunaan: %s [pilihan]"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, fuzzy, no-c-format
+msgid "GUI update interval"
+msgstr "Pereka GUI KDE"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, fuzzy, no-c-format
+msgid "Support for DHT"
+msgstr "Tetap Buddy untuk %1"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, fuzzy, no-c-format
+msgid "Number of upload slots"
+msgstr "Papar nombor baris"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, fuzzy, no-c-format
+msgid "Plugin Manager"
+msgstr "Pengurus Pencetak"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, fuzzy, no-c-format
+msgid "Load"
+msgstr "Muatan"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Semua Pakej"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Semua Pakej"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, fuzzy, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Masukkan peranti yang anda hendak guna."
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, fuzzy, no-c-format
+msgid "Detected devices:"
+msgstr "Peranti Rangkaian"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Peranti"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, fuzzy, no-c-format
+msgid "Ports Forwarded"
+msgstr "Port lain"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, fuzzy, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Port lain"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, fuzzy, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Amerika/Port_of_Spain"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, fuzzy, no-c-format
+msgid "Rescan"
+msgstr "Ulangkesan Pe_ranti"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Tidak menjumpai fail comps."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Lebih Keutamaan"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Dokumen yang hendak dibuka"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, fuzzy, no-c-format
+msgid "Folders to scan"
+msgstr "Dokumen yang hendak dibuka"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, fuzzy, no-c-format
+msgid "Search Preferences"
+msgstr "Lebih Keutamaan"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "Port lain"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "Pilih Partisyen"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "Namapengguna"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, fuzzy, no-c-format
+msgid "Change password ..."
+msgstr "Tukar Susunan Tab"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, fuzzy, no-c-format
+msgid "Port number"
+msgstr "Nombor baris:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "Port lain"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Pilihan Umum"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, fuzzy, no-c-format
+msgid "username"
+msgstr "Namapengguna"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, fuzzy, no-c-format
+msgid "password"
+msgstr "Katalaluan"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, fuzzy, no-c-format
+msgid "Total:"
+msgstr "Jumlah :"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, fuzzy, no-c-format
+msgid "Currently downloading:"
+msgstr "Muatturun pakej `%s' (%s/%s)..."
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, fuzzy, no-c-format
+msgid "Downloaded:"
+msgstr "Pakej sudah dimuatturun"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Saiz:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Perkembangan"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, fuzzy, no-c-format
+msgid "Peer"
+msgstr "Alamat rakan jauh:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, fuzzy, no-c-format
+msgid "Average Down Speed:"
+msgstr "Kelajuan Failover"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, fuzzy, no-c-format
+msgid "Average Up Speed:"
+msgstr "Kelajuan Failover"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, fuzzy, no-c-format
+msgid "Next update in:"
+msgstr "Naikkan halaman berikut '%2'"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Maklumat penjejak"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Perkongsian"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "Guna Hint Saiz"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "Hantar kepada Skrip CGI"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Tambah Bar Alatan ke '%1'"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Maklumat penjejak"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Maklumat penjejak"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, fuzzy, no-c-format
+msgid "Show list of peers"
+msgstr "Papar nombor baris"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, fuzzy, no-c-format
+msgid "Show list of trackers"
+msgstr "Papar nombor baris"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, fuzzy, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Lebih Keutamaan"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Lokaliti Tapisan Efektif"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Guna Hint Saiz"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, fuzzy, no-c-format
+msgid "IP filter file:"
+msgstr "Comment=Fail Projek KDevelop"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, fuzzy, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Tukar Teks ke Postscript"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, fuzzy, no-c-format
+msgid "Level1 filter url"
+msgstr "Kaedah Url tidak diketahui %s"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, fuzzy, no-c-format
+msgid "Use level1 filter?"
+msgstr "Guna Hint Saiz"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "Sumber Cakera Kemaskini"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Volum Logikal Maksimum:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Volum Logikal Maksimum:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "Alamat rakan jauh:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Aplet Amaran Dulang Sistem"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Pemilih torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, fuzzy, no-c-format
+msgid "Import an existing download"
+msgstr "Muatturun fail BitTorrent"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "Torrent"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Data:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "default"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, fuzzy, no-c-format
+msgid "&New"
+msgstr "Baru"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, fuzzy, no-c-format
+msgid "&Title"
+msgstr "Tajuk"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Pemindahan Fail (FTP)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "kemaskini semua fail tetapan"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Name=Proses berjaya"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "Nama Perkongsian"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, fuzzy, no-c-format
+msgid "Left click category"
+msgstr "Klik pada borang untuk memasukkan %1..."
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, fuzzy, no-c-format
+msgid "Right click category"
+msgstr "Klik pada borang untuk memasukkan %1..."
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "Muat Turun"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, fuzzy, no-c-format
+msgid "upload:"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, fuzzy, no-c-format
+msgid "* zero means no limit"
+msgstr "(tiada tetikus dikonfigurasikan)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, fuzzy, no-c-format
+msgid "Save to file"
+msgstr "Dokumen yang hendak dibuka"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, fuzzy, no-c-format
+msgid "&Load from file"
+msgstr "Comment=Fail Projek KDevelop"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&k"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, fuzzy, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Guna Hint Saiz"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, fuzzy, no-c-format
+msgid "Edit s&chedule"
+msgstr "Ubah sambungan..."
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Opsyen RAID"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Opsyen Sistem Fail"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Opsyen RAID"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Opsyen RAID"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Opsyen RAID"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "Opsyen Sistem Fail"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Plugin"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Semua"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Nyahpepijat"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "Pemindahan Fail (FTP)"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, fuzzy, no-c-format
+msgid "Search:"
+msgstr "Cari"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "Opsyen Sistem Fail"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, fuzzy, no-c-format
+msgid "InfoWidget:"
+msgstr "<i>info_label</i>"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Pilihan Umum"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, fuzzy, no-c-format
+msgid "General:"
+msgstr "Umum"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, fuzzy, no-c-format
+msgid "Connections:"
+msgstr "Ubah sambungan..."
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, fuzzy, no-c-format
+msgid "Use default browser"
+msgstr "Guna Hint Saiz"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, fuzzy, no-c-format
+msgid "Custom browser path:"
+msgstr "Comment=Projek Tersendiri"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, fuzzy, no-c-format
+msgid "Search Engines"
+msgstr "Tapi_san pencarian:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, fuzzy, no-c-format
+msgid "Search engine name:"
+msgstr "Name=KDevelop: KDE/C++"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, fuzzy, no-c-format
+msgid "&Add"
+msgstr "Tambah Bar Alatan"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, fuzzy, no-c-format
+msgid "R&emove All"
+msgstr "Laras Semua..."
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, fuzzy, no-c-format
+msgid "Add Defau&lt"
+msgstr "Tambah Bar Alatan ke '%1'"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Cari"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, fuzzy, no-c-format
+msgid "Search engine:"
+msgstr "Tapi_san pencarian:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, fuzzy, no-c-format
+msgid "Current search engine"
+msgstr "Hasil pencarian bagi "
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, fuzzy, no-c-format
+msgid "Use custom browser"
+msgstr "Comment=Projek Tersendiri"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+#, fuzzy
+msgid "%1 KB/s"
+msgstr "IP_sec"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, fuzzy, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "&Tip Hari Ini"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+#, fuzzy
+msgid "Yes, Last"
+msgstr "Mengembalikan Sesi Terakhir"
+
+#: libktorrent/util/log.cpp:103
+#, fuzzy
+msgid "Cannot open log file %1 : %2"
+msgstr "Tidak dapat membuka '%1'. Fail tidak wujud."
+
+#: libktorrent/util/file.cpp:87
+#, fuzzy
+msgid "Cannot write to %1 : %2"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/util/file.cpp:101
+#, fuzzy, c-format
+msgid "Cannot read from %1"
+msgstr "tidak dapat membaca dari `%s': %s"
+
+#: libktorrent/util/fileops.cpp:78
+#, fuzzy
+msgid "Cannot create directory %1: %2"
+msgstr "gagal reka direktori:%s"
+
+#: libktorrent/util/fileops.cpp:92
+#, fuzzy
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/util/fileops.cpp:108
+#, fuzzy
+msgid "Cannot move %1 to %2: %3"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+#, fuzzy
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/util/fileops.cpp:232
+#, fuzzy
+msgid "Cannot delete %1: %2"
+msgstr "Tidak boleh Padam"
+
+#: libktorrent/util/fileops.cpp:251
+#, fuzzy
+msgid "Cannot create %1: %2"
+msgstr "gagal reka direktori:%s"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Tidak dapat membuka fail imej %s"
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Tidak dapat memuatkan fail!"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+#, fuzzy
+msgid "Cannot open %1 : %2"
+msgstr "Buka Fail"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "Kembangkan Semua Blok"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Gagal reka fail: %s"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Gagal mencipta fail %s"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Loaded"
+msgstr ""
+"Modul Dimuatkan: \n"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Not loaded"
+msgstr ""
+"Modul Dimuatkan: \n"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+#, fuzzy
+msgid "Plugin Options"
+msgstr "Opsyen RAID"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+#, fuzzy
+msgid "Cannot open file %1 : %2"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/migrate/migrate.cpp:45
+#, fuzzy
+msgid "The directory %1 does not exist"
+msgstr "Tidak dapat membuka '%1'. Fail tidak wujud."
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, fuzzy, c-format
+msgid "Illegal token: %1"
+msgstr "Token Ring"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+#, fuzzy
+msgid "Decode error"
+msgstr "Name=Ralat proses"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+#, fuzzy
+msgid "Unexpected end of input"
+msgstr ""
+"akhir fail tidak dijangka dalam %s\n"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+#, fuzzy
+msgid "Cannot convert %1 to an int"
+msgstr "Tukar Teks ke Postscript"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+#, fuzzy
+msgid "Torrent is incomplete!"
+msgstr "dulang terbuka"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+#, fuzzy
+msgid "Corrupted torrent!"
+msgstr "Pemilih torrent"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+#, fuzzy
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Tidak menjumpai fail comps."
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+#, fuzzy
+msgid "Parse Error"
+msgstr "Name=Ralat proses"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+#, fuzzy
+msgid "Cannot migrate %1 : %2"
+msgstr "Migrasi ke %s"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+#, fuzzy
+msgid "Select Folder to Save To"
+msgstr "Berbalik ke yang Ter_akhir Disimpan"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+#, fuzzy
+msgid "Not started"
+msgstr "$prog tidak dimulakan..."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+#, fuzzy
+msgid "Downloading"
+msgstr "Memuatturun %s"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr ""
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Dihentikan"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+#, fuzzy
+msgid "Error: "
+msgstr "Name=Ralat proses"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+#, fuzzy
+msgid "Error stopping torrent %1 : %2"
+msgstr "Name=Ralat proses"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+#, fuzzy
+msgid "Error starting torrent %1 : %2"
+msgstr "Name=Ralat proses"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+#, fuzzy
+msgid "Unknown client"
+msgstr "Nama Klien"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, fuzzy, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "Alamat rakan jauh:"
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "Comment=Fail Projek KDevelop"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Kembangkan Semua Blok"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Kembangkan Semua Blok"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "Kembangkan Semua Blok"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, fuzzy, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Ralat membaca kandungan fail kickstart %s: %s"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, fuzzy, c-format
+msgid "Error reading from %1"
+msgstr "Name=Ralat proses"
+
+#: libktorrent/torrent/cachefile.cpp:403
+#, fuzzy
+msgid "Error writing to %1 : %2"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, fuzzy, c-format
+msgid "Error writing to %1"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Gagal mencipta fail %s"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "Jawapan tidak sah telah diterima."
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr "Jawapan tidak sah telah diterima."
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "Jawapan tidak sah telah diterima."
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+#, fuzzy
+msgid "Cannot open file %1: %2"
+msgstr "Dokumen yang hendak dibuka"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, fuzzy, c-format
+msgid "Cannot create index file: %1"
+msgstr "Gagal mencipta fail %s"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+#, fuzzy
+msgid "Cannot open file : %1 : %2"
+msgstr "Dokumen yang hendak dibuka"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+#, fuzzy
+msgid "UPnP Devices"
+msgstr "Peranti Rangkaian"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Opsyen Sistem Fail"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "Opsyen Sistem Fail"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+#, fuzzy
+msgid "loaded"
+msgstr "Tetapan berjaya dimuatnaik"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Pilihan Umum"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "Tiada direktori %s tertentu (%s)."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+#, fuzzy
+msgid "%1 is a directory"
+msgstr "Direktori"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Pilihan Umum"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "Pemilih torrent"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "Muatturun Dipilih"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "Mengembalikan Sesi Terakhir"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "Fail Wujud"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Ada"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Tertangguh"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "Guna Hint Saiz"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+#, fuzzy
+msgid "Info Widget"
+msgstr "%1 (widget tersendiri)"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "gagal reka direktori:%s"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+#, fuzzy
+msgid "Country"
+msgstr "Diperlukan oleh"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klien"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "Semua Pakej"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+#, fuzzy
+msgid "Information Widget Options"
+msgstr "Selit %1 (widget tersendiri)"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:102
+#, fuzzy
+msgid "Loading txt file..."
+msgstr "Comment=Fail Projek KDevelop"
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:194
+#, fuzzy
+msgid "File converted."
+msgstr "Fail Wujud"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+#, fuzzy
+msgid "Could not load filter:"
+msgstr "Tidak dapat mencari bahagian KDevDesigner."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IPFilter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+#, fuzzy
+msgid "Status: Not loaded."
+msgstr "Tidak dapat mencari bahagian KDevDesigner."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+#, fuzzy
+msgid "File Exists"
+msgstr "Fail Wujud"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter"
+msgstr "Tapisan Sendiri"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter Options"
+msgstr "Opsyen Saiz Tambahan"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Status"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Aplet Amaran Dulang Sistem"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Muatturun Dipilih"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Aplet Amaran Dulang Sistem"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Nama:"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Torrent"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "Guna Hint Saiz"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Kelajuan Failover"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Kelajuan Failover"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Kelajuan Failover"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Lo-Fi"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Lo-Fi"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "Torrent files"
+msgstr ""
+"*.db|Fail Pengkalan Data\n"
+"*|Semua Fail"
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "All files"
+msgstr ""
+"*.db|Fail Pengkalan Data\n"
+"*|Semua Fail"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "Ralat Dengan Data"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, fuzzy, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Tidak dapat memuatkan fail!"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+#, fuzzy
+msgid "Import existing download"
+msgstr "Muatturun fail BitTorrent"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Tajuk"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Huraian"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "Nama Perkongsian"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "Waktu Alaska"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "Name=Plugin Kate Pertama Saya"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+#, fuzzy
+msgid "File not found."
+msgstr "Comment=Fail Projek KDevelop"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "Name=Plugin Kate Pertama Saya"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+#, fuzzy
+msgid "Open Bandwidth Scheduler"
+msgstr "Dokumen yang hendak dibuka"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "Opsyen Sistem Fail"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+#, fuzzy
+msgid "Search Engine Options"
+msgstr "Opsyen Saiz Tambahan"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "Tetap Buddy untuk %1"
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "fail torrent"
+
+#: plugins/search/searchwidget.cpp:267
+#, fuzzy
+msgid "Search finished"
+msgstr "Comment=Proses selesai dengan jaya"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Tapi_san pencarian:"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Muatturun Torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Muatturun"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Muatkan cakera lain"
+
+#~ msgid "Alt+X"
+#~ msgstr "Alt+X"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Maklumat penjejak"
+
+#, fuzzy
+#~ msgid "Alt+N"
+#~ msgstr "Alt+K"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "You must add at least one tracker."
+#~ msgstr "Anda mesti masukkan sekurang-kurangnya satu Sistem Operasi"
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "Pakej sudah dimuatturun"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+K"
+
+#~ msgid "Alt+U"
+#~ msgstr "Alt+U"
+
+#, fuzzy
+#~ msgid "Alt+A"
+#~ msgstr "Alt+K"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+K"
+
+#, fuzzy
+#~ msgid "Max ratio:"
+#~ msgstr "Nama Perkongsian"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "Torrent"
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Muat Turun"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Tetapan berjaya dimuatnaik"
+
+#~ msgid "Name"
+#~ msgstr "Nama"
+
+#, fuzzy
+#~ msgid "Author"
+#~ msgstr "Pengarang:"
+
+#, fuzzy
+#~ msgid "Load All"
+#~ msgstr "Laras Semua..."
+
+#, fuzzy
+#~ msgid "Unload All"
+#~ msgstr "Laras Semua..."
+
+#, fuzzy
+#~ msgid "Tracker"
+#~ msgstr "Maklumat penjejak"
+
+#, fuzzy
+#~ msgid "Tracker URL:"
+#~ msgstr "Maklumat penjejak"
+
+#, fuzzy
+#~ msgid "Tracker status:"
+#~ msgstr "Maklumat penjejak"
+
+#, fuzzy
+#~ msgid "Cha&nge Tracker"
+#~ msgstr "Maklumat penjejak"
+
+#~ msgid "St&atus"
+#~ msgstr "St&atus"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Muatturun Dipilih"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "Tapi_san pencarian:"
diff --git a/translations/nb/Makefile.am b/translations/nb/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/nb/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/nb/messages/Makefile.am b/translations/nb/messages/Makefile.am
new file mode 100644
index 0000000..61136e8
--- /dev/null
+++ b/translations/nb/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = nb
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/nb/messages/ktorrent.po b/translations/nb/messages/ktorrent.po
new file mode 100644
index 0000000..5cff1e5
--- /dev/null
+++ b/translations/nb/messages/ktorrent.po
@@ -0,0 +1,4910 @@
+# translation of ktorrent.po to
+#
+# Alexander Nicolaysen Sørnes <alex@thehandofagony.com>, 2005, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-10-23 01:56+0200\n"
+"Last-Translator: Alexander Nicolaysen Sørnes <alex@thehandofagony.com>\n"
+"Language-Team: <nb@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Ingen innkommende forbindelser (brannmur?)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informasjon"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Data overført i denne økten"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Den nåværende farten på alle strømmene kombinert"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupper"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Start"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Stopp"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Start alle"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Stopp alle"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Lim inn strøm-URL . . ."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Åpne købehandler . . ."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Legg til/Fjern fra køen"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-filter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Sjekk dataintegritet"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Angi høyeste opplastingshastighet"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Angi høyeste nedlastingshastighet"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Strømfiler"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Alle filer"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Åpne plassering"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Fart ned: %1 / Opp: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Overført ned: %1 / opp: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 noder, %2 jobber"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: av"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Alle strømmer"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Flytt til venstre side"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Flytt til høyre side"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Flytt til bunnen"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Velg hurtigtast . . ."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Fjern hurtigtast"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Bytt rekkefølge for knappen"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nytt hurtigtastnummer:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Du må skrive inn IP'en i formatet «XXX.XXX.XXX.XXX». Du kan også bruke stjerner "
+"for rekker, som «127.0.0.*»."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Velg en fil"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Velg et filnavn å lagre som"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Misformet URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Nedlastinger"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Opplastinger"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Den oppgitte porten (%1) er ikke tilgjengelig eller i bruk av et annet program. "
+"KTorrent bruker nå port %2 i stedet."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent kan ikke godta tilkoblinger fordi portene %1 til %2 brukes av et annet "
+"program."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Klarte ikke lage strøm: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Flere datafiler i strømmen «%1» mangler, vil du lage dem på nytt eller la være "
+"laste dem ned?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Lag på nytt"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Ikke last ned"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Klarte ikke lage manglende filer på nytt: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Datafiler mangler"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Klarte ikke overse manglende filer: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Fila hvor dataene til strømmen «%1» lagres mangler, vil du lage den på nytt?"
+
+# | msgid "Recreate"
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Lag på nytt"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Klarte ikke lage datafil på nytt: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Datafil mangler"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Sjekker dataintegritet"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "uendelig"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1%"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Klarte ikke undersøke data: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Undersøker data for <b>%1</b>: "
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Et BitTorrent-program for KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Feilsøkingsmodus"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokument som skal åpnes"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS-modul"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Intermettgrensesnitt-modul"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statistikkmodul"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Programikon og et par andre"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Nedlastingsikonet"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Programikon for 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Bitlinjens verktøytips og «IWFileTreeItem»-sortering"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Visning av hvilket land folk kommer fra, for infomodulen (inneholder "
+"GeoLite-data laget av MaxMind, tilgjengelig fra http://www.maxmind.com/)."
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Flagg"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Filprioritering"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp ble brukt som et eksempel for vår egen UPnP-kode"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Tillegg for totalt deleforhold"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconf-forbedringer"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Nettgrensesnittet kald melk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAI-kode fra KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Raskere konvertering i IP-filtermodulen"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Fant to sikkerhetshull (som nå er fikset)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Kode for å laste stille med et lagringssted"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Feilretting i PHP-koden til nettgrensesnittet"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Bedre ytelse for filsystemet XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Kode for ikke å vise veldig lave hastigheter"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Kode for å vise advarsel om mulig brannmur"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Flere bidrag til koden"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+# | msgid "Several patches"
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Flere bidrag til koden"
+
+# | msgid "Filter Matches"
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Filtertreff"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Kode for å laste stille med et lagringssted"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Du må velge en fil eller en mappe."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Du har ikke lagt til en sporer, er du sikker på at du vil lage strømfilen?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Du må legge til minst én node."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Strømfiler (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Velg fil for å lagre strøm"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Lager %1 . . ."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Selvvalgte grupper"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Ny gruppe"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Rediger navn"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Fjern gruppe"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Åpne fane"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Skirv inn gruppenavnet."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Gruppen «%1» finnes fra før."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Skriv inn det nye gruppenavnet."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktive opplastinger"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Opplastinger i kø"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Nedlastinger i kø"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Nedlastinger fra brukere"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Opplastinger fra brukere"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Inaktive strømmer"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Inaktive nedlastinger"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Inaktive opplastinger"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktive strømmer"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktive nedlastinger"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Fjern strøm"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Fjern strøm og data"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Legg til personer"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Flere kilder for personer"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Strømmens kilder for personer:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Personutveksling"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Manuell annonsering"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Forhåndsvisning"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Åpne mappe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Datamappe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Midlertidig mappe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Velg plassering for nedlastinger"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Fjern fra gruppe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Legg til gruppe"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Fartsgrenser"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Strømmen finnes ikke. Rapporter denne feilen til KTorrent-utviklerne."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Mulig person lagt til."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Misformet IP-adresse."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Innstillinger"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Nedlastingsalternativer"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT-porten må være forskjellig fra UDP-sporerporten."
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Generelt"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Generelle innstillinger"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Klarte ikke slå opp %1: %2\n"
+"Oppgi en gyldig IP-adresse eller vertsnavn."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avansert"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Avanserte innstillinger"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Synlige kolonner"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Lastet ned"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Størrelse"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Lastet opp"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Nedhastighet"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Opphastighet"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tid igjen"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Delere"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Nedlastere"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% ferdig"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Delingsforhold"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Tid brukt på å laste ned"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Tid brukt på å laste opp"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Alle strømmer %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Kan ikke starte mer enn én nedlasting, \n"
+"Kan ikke starte mer enn %n nedlastinger, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"og én opplasting. \n"
+"og %n opplastinger. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Gå til «Innstillinger -> Oppsett av KTorrent» hvis du vil endre grensene."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Strømfila «%1» er ikke ferdig lastet ned. Vil du slette de uferdige dataene "
+"også?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Fjern nedlasting"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Fjern data"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Behold data"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Du vil miste all data du har lastet ned. Er du sikker?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Du holder allerede på å kontrollere dataene for strømmen «%1»."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Velg hvor nedlastingene for «%1» skal lagres"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Du har avmerket følgende filer som finnes fra før, så du vil miste all data fra "
+"disse. Er du sikker?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Ja, slett filene"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nei, behold filene"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " for lite!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Bruker"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Købehandler"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nei (privat strøm)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Hastighet:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Nedlasting: <font color='#1c9a1c'>%1</font></td>"
+"<td>Opplasting: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Overføring:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Nedlasting: <font color='#1c9a1c'>%3</font></td>"
+"<td>Opplasting: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> er ferdig lastet ned.<br>Gjennomsnittsfart: %2 ned / %3 opp."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Nedlasting ferdig"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> har nådd det høyeste delingsforholdet på %2 og er derfor stoppet."
+"<br>Lastet opp %3 med en gjennomsnittsfart på %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Deling ferdig"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> har blitt delt lenger enn grensen på %2 timer og er derfor stoppet."
+"<br>Lastet opp %3 med en gjennomsnittsfart på %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> har blitt stoppet med følgende feil: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Fant korrupte data i strømmen <b>%1</b> "
+"<br>Du bør kjøre en datakontroll på strømmen."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> har nådd det høyeste delingsforholdet på %2 og kan derfor ikke legges "
+"til i køen. Fjern grensen manuelt hvis du vil fortsette å dele."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> har blitt delt lenger enn grensen på %2 timer og kan derfor ikke "
+"legges til i køen. Fjern grensen manuelt hvis du vil fortsette å dele."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Strømmen kan ikke legges til i køen."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Klarte ikke starte <b>%1</b>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan ikke starte mer enn én nedlasting. "
+"<br>\n"
+"Kan ikke starte mer enn %n nedlastinger. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan ikke starte mer enn én nedlasting. "
+"<br>\n"
+"Kan ikke starte mer enn %n nedlastinger. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Strømmen kan ikke startes"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Det er ikke nok plass på disken."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "Disken din begynner å bli full.<br/><b>%1</b> lastes ned til «%2»."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Strømmen har blitt stoppet<br/>"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Enheten begynner å bli full"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Fartsgrense i KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Ubegrenset"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Fartsgrense for <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Et KDE KPart-program"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Klarte ikke åpne indeksfila «%1»: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Alexander N. Sørnes"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "alex@thehandofagony.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Velg hvilke filer du vil laste ned"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Last ned til:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Gruppe:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Br&ukerkontrollert"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Start strøm"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Last ned"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Merk &alle"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Merk i&ngen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Snu om valget"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Diskplass"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Nødvendig diskplass:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Ledig diskplass:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Etter nedlasting:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Kryptering"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Bruk protokollkryptering"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Protokollkryptering brukes for å forhindre at internettleverandører senker "
+"farten på BitTorrent-forbindelser."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Tillat ukrypterte forbindelser"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr "Hvis dette er av kan du kun koble til klienter som støtter kryptering."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Protokoll for desentralisert deling. Se manualen for mer informasjon."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "Br&uk DHT for å få flere likemenn"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP-port for DHT-kommunikasjon:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Selvvalgt IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Sen&d selvvalgt IP eller vertsnavn til sporeren"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Selvvalgt IP eller vertsnavn:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ikon i systemkurven"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Vis ikon i s&ystemkurven"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Vis &fartslinje i systemkurven."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Vis sprettoppmeldinger i systemkurven"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Båndbredde for opplastinger (i KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Båndbredde for nedlastinger (i KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Mapper"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Katalog for lagring av midlertidige filer:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Flytt ferdige nedlastinger til:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "L&agre nedlastinger automatisk til:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Kopier .torrent-filer til:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Nedlastingsverktøylinje"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Sett fartsgrense for denne strømmen"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Høyeste opplastingshastighet:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Høyeste nedlastingshastighet:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 = ubegrenset)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Legg til mulig person"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Personens IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Skriv inn personens IP og port."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrents svarteliste"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Merk: Svartelista gjelder kun for denne økten. Bruk lagre/åpne for å lagre "
+"oppføringene eller bruk IP-filtermodulen (Personvokter)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Bannlyste personer"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Personens IP-adresse"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Legg til person:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Legger en person til i svartelisten"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Fjerner valgte person fra svartelisten"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Tøm"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Tømmer listen"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "L&agre som . . ."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Lagre denne svartelista for bruk med KTorrents IP-filtermodul"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Høyeste antall nedlastinger:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Høyeste antall frø:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Start nedlasting med lite displass:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minste diskplass:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Ikke start"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Alltid spør"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Tving start"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 = ubegrenset)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Høyeste nedlastingshastighet:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Begrensning av totale forbindelser:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Høyeste delingstid:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Høyeste antall forbindelser per strøm:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Antall opplastingsplasser:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP-sporerport:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Høyeste delingsforhold:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Høyeste opplastingshastighet:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/s (0 = ubegrenset)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Timer (0 = ubegrenset)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Fortsett å dele etter at nedlasting er ferdig"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Følg med"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Portene over må videresendes hvis du er bak en ruter. UPnP-tillegsmodulen kan "
+"gjøre dette for deg."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT kødialog"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Sporer:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Delingsforhold:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Byte igjen:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Strøm"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Kontrollert av"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Oppla&stinger"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Lastet opp:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Flytt &opp"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Flytt &ned"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Flytt øverst"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Flytt til &bunnen"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&Kontrollert av købehandleren"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Br&ukerkontrollert"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Lim inn URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Avbryt"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Lag strøm"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Fila eller katalogen du vil lage en strøm av:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Du må legge til minst én sporer eller node."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Filinnstillinger"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Størrelse på hver bit:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Starte delin&g av strømmen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "&Desentralisert (kun DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privat strøm (DHT ikke tillat)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Kommentarer:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "L&ag"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Avbryt"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Sporere"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT-noder"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Node:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP eller vertsnavn"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"MERK: Noen kjente gode DHT-noder er allerede satt inn. Du bør antakelig sette "
+"inn din egen IP-adresse og port også hvis du vil dele denne strømmen."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Avanserte innstillinger"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent-metoden:</b> Standard, kombinerer de andre metodene basert på våre "
+"testresultater."
+"<br>\n"
+"<b>Gjeldende hastighet:</b> Den ekleste: ByteIgjen / GjeldendeHastighet"
+"<br>\n"
+"<b>Gjennomsnittsfart:</b> ByteIgjen / Gjennomsnittsfart"
+"<br>\n"
+"<b>Basert på prøver:</b> Tiden beregnes ved å ta X antall prøver av farten"
+"<br>\n"
+"<b>Endring i gjennomsnittet:</b> Det flyttende gjennomsnittet som beregnes fra "
+"X antall prøver"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Gjeldende fart"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Total gjennomsnittsfart"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Utvalgte prøver"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Flyttende gjennomsnitt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(tar effekt etter omstart)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Ytelse"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Minnebruk:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Lavt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Middels"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Høyt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Oppdateringsintervall for grensesnittet:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Datakontroll"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Ikke kontroller biter større en&n dette ved opplasting"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "&Kontroller data etter"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "korrupte biter"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Nettverk"
+
+# | msgid "Maximum number of connections per torrent (0 = no limit)"
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Høyeste antall forbindelser per strøm (0 = ubegrenset)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, fuzzy, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Ikke bruk KDE-&mellomtjeneren for HTTP-sporerforbindelser"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Mellomtjener for HTTP-sporer:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Undersøker data"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Undersøker data for strømmen:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Antall biter funnet:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Antall biter som feilet/ikke ble lastet ned:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Høyeste antall nedlastinger (0 = ubegrenset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Høyeste antall frø (0 = ubegrenset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Høyeste antall forbindelser per strøm (0 = ubegrenset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Høyeste antall forbindelser alle strømmer (0 = ubegrenset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Høyeste opplastingshastighet i KB/s (0 = ubegrenset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Høyeste nedlastingshastighet i KB/s (0 = ingen grense)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Høyeste delingsforhold (0 = ubegrenset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Høyeste delingsforhold (0 = ubegrenset)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Vis ikon i systemkurven"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Vis fartslinje i systemkurven"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Båndbredde for nedlastinger (i KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Båndbredde for opplastinger (i KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Vis sprettoppmeldinger når en strøm er ferdig."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Fortsett å dele etter at nedlasting er ferdig"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Katalog for lagring av midlertidige filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Hvorvidt nedlastinger automatisk skal lagres i standard nedlastingskatalog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Katalog for lagring av nedlastede filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Hvorvidt nedlastinger automatisk skal lagres i standard nedlastingskatalog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Katalog for lagring av nedlastede filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Hvorvidt nedlastinger automatisk skal lagres i standard nedlastingskatalog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Katalog for lagring av midlertidige filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Hvorvidt sporeren skal gis en selvvalgt IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP som skal gis til sporeren"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Minnebruk"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Oppdateringsintervall for grensesnittet"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Støtte for DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT-port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Antall opplastingsplasser"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Kolonner som vises i KTorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Tilleggsbehandler"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Slå på"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Slå &av"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Slå på alle"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Slå av alle"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Standard UPnP-enhet"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Oppdagete enheter:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Enhet"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Videresendte porter"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN-forbindelse"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "&Videresend porter"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Angre videresending av porter"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Søk på nytt"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Skru på undersøking av mappe1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Skru på undersøking av mappe2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Skru på undersøking av mappe3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Sti til «mappe1»"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Sti til «mappe2»"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Sti til «mappe3»"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Hvorvidt strømmer skal åpnes stille eller ikke."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Slettehandling på."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Flyttehandling på."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Innstillinger for mappeundersøking"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Undersøk mappe &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt + 1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Undersøk mappe &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt + 2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Undersøk mappe &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt + 3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Flytt til «lastet»-katalog etter l&asting"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Flytt strøm til «lastet»-katalogen etter den er lastet"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "&Åpne strømmer stille"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Ikke vis vinduet for velging av hvilke filer som skal lastes ned"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Slett etter lastin&g"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Sletter strøm etter lasting"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Mapper å undersøke"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Mappe 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Mappe 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Mappe 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Søkeinnstillinger"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Internettjener"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Videresend port"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Økt-TTL (i sekunder)"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Velg tilkobling"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Brukernavn:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Endre passord . . ."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Sti til PHP-programfilen:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Portnummer"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "videresend port"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Levetid for økten"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "tema for brukergrensesnittet"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "sti til PHP-programfilen"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "brukernavn"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "passord"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Biter"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Totalt:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Laster ned nå:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Lastet ned:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Ekskludert:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Igjen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Størrelse:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Klump"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Framgang"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Person"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Oppnevnte personer"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Delere:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Nedlastere:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Gjennomsnittsfart ned:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Gjennomsnittsfart opp:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Neste oppdatering om:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Sporerstatus:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Delene av strømmen som er lastet ned:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Delene av strømmen som er tilgjengelige:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Deler"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Opplastingen vil stoppe når delingsforholdet går over denne verdien. Velg 0 for "
+"ingen grense."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, fuzzy, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Opplastingen vil stoppe når delingsforholdet går over denne verdien. Velg 0 for "
+"ingen grense."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, fuzzy, no-c-format
+msgid "Ratio limit:"
+msgstr "Begrensning av totale forbindelser:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Begrensning virker bare i delemodus"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "Br&uke grense?"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Oppd&ater sporer"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minste oppdateringsintervall – 60 sekunder"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Legg til spore&r"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Fjern sporer"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "E&ndre sporer"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Bruk standardverdier"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Vis personvisningsfane i hovedvinduet"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Vis fane for bitnedlastingsvisning i hovedvinduet"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Vis sporerfane i hvoedvinduet"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Vis liste over personer"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Vis liste over &biter som lastes ned nå"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Vis liste over sporere"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Innstillinger for IP-blokkering"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Velg filterfil for Personbeskytteren "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Bruke Personbeskytter-filter?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP-filterfil:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Lastet &ned/Konverter"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Last ned Personbeskytter-filteret fra bluetack.co.uk eller blocklist.org.\n"
+"MERK: ZIP-fil fra bluetack.co.uk er støttet."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL til Nivå1-filter"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Bruke Nivå1-filter?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Konverterer . . ."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Trykk på «Konverter»-knappen for å starte konvertering av antip2p-fil. MERK: "
+"dette kan ta en tid, selv på raske maskiner, og mens dette gjøres kan du ikke "
+"bruke KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "Oppdateringsintervall for grensesnittet"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Høyeste antall frø:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Høyeste antall frø:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "Personer"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "Personens IP:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "Forbindelser:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Vis fartslinje i systemkurven"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Opplastinger"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "Forbindelser:"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Personer"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Last ned strøm"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, fuzzy, no-c-format
+msgid "Connections mesurments count"
+msgstr "Flagg for forbindelsesmeldinger"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Import av eksisterende nedlasting"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Strøm:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Data:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Oppgi strømmen og dataene som allerede er lastet ned for den strømmen."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importer"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "standard"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS-strømmer"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Strømmer"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "S&lett"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Ny"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artikler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Autooppdate&ring"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "&Overse TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Oppdater"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Tittel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Behold artikler (dager)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktiv"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtre"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Godta filtre"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Avlså filtre"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Regulære uttrykk"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Behandle som en &Serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Behandle"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Seriekriterier"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, fuzzy, no-c-format
+msgid "Match Without Episode"
+msgstr "Last ned treff uten episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Høyeste episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Høyeste sesong"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Minste sesong"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Minste episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "&Testtekst"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&st"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtertreff"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Båndbreddeplanlegger"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Venstreklikk på kategori"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kategor&i 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Slå av"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategori &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategori &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Høyreklikk på kategori"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategori &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategori 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorier"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "Last ned:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "Last opp:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s "
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* null betyr ubegrenset"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Lagre til fil"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Last inn fra fil"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Tilbakestill timeplan"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Innstillinger for planleggertilleggsmodulen"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "&Bruke båndbreddeplanlegger?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Båndbreddeplanlegger"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Bruke farger i stedet for bildekar&t?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Anbefalt for treige maskiner)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "R&ediger timeplan"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Slå på båndbreddeplanlegger?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Bruke farger i stedet for bildekart?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Bruk rik loggtekst"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Flagg for generelle infomeldinger"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Flagg for forbindelsesmeldinger"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Flagg for DHT-meldinger"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Flagg for meldinger om sporerinfo"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Flagg for meldinginger om lesing/skriving"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Flagg for meldinger fra IP-filtermodulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Flagg for meldinger fra søkemodulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Flagg for meldinger fra filimport-modulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Flagg for meldinger fra infomodulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Flagg for meldinger fra UPnP-modulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Flagg for meldinger fra katalogundersøkingsmodulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Flagg for meldinger fra planleggingsmodulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Innstilling for meldinger fra RSS-modulen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Innstilling for meldinger fra nettgrensesnitt-modulen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Innstillinger for loggviseren"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Tilleggsmoduler"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Alle"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Feilsøking"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Notis"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Viktig"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Ingen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Søk:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Mappeundersøker:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Planlegger:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Filimportmodul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Infomodul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-modul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Intermettgrensesnitt-modul"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "System"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Generelt"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Forbindelser:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Disk I/U:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Bruk &rik tekst for logg"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Ekstern nettleser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, fuzzy, no-c-format
+msgid "Open searches in external browser"
+msgstr "&Åpne søkeresultater i ekstern nettleser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Bruk standard nettleser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Sti til selvvalgt nettleser:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Søkemotorer"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Navn på søkemotor:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Legg til"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Motorer"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Fj&ern alle"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "&Legg til standard"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Oppdater fra Internett"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Søk"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Søkemotor:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Gjeldende søkemotor"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Bruk egendefinert nettleser"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Sti til programfilen for den egendefinerte nettleseren"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dag \n"
+"%n dager "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Ja, først"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Ja, sist"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Klarte ikke åpne loggfila «%1»: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Klarte ikke skrive til «%1»: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Klarte ikke lese fra %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Kan ikke opprette katalogen «%1»: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Klarte ikke lage en symbolsk kobling fra «%1» til «%2»: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Klarte ikke flytte «%1» til «%2»: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Klarte ikke kopoiere «%1» til «%2»: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Klarte ikke slette «%1»: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Klarte ikke lage «%1»: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Klarte ikke beregne filstørrelsen for «%1»: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Klarte ikke beregne filstørrelse: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Klarte ikke åpne «%1»: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Klarte ikke utvide fil: %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Klarte ikke utvide fila «%1»"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Klarte ikke søke i fil: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Klarte ikke skrive etter slutten av mmap-hurtigminne."
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Lastet"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Ikke lastet"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Tilleggsinnstillinger"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Klarte ikke åpne fila «%1»: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Katalogen «%1» finnes ikke"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Ugyldig tegn: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Dekodingsfeil"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Uventet slutt på inndata"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Klarte ikke konvertere %1 til et heltall"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Strømmen er ufullstendig."
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "ødelagt strøm"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Strømmen har ikke noe felt for annonsering og noder"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Klarte ikke åpne strømfila «%1»: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Spaltingsfeil"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"En feil oppstod under lesing av strømfila. Dette er mest sannsynlig fordi fila "
+"er ødelagt, eller fordi den ikke er en strømfil."
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"En feil oppstod under lesing av strømfila. Dette er mest sannsynlig fordi fila "
+"er ødelagt, eller fordi den ikke er en strømfil."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Klarte ikke opprette «%1»: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Du holder allerede på å laste ned denne strømmen (%1); lista over sporere i "
+"begge strømmene er nå slått sammen."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Du laster allerede ned denne strømmen (%1)"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Klarte ikke flytte «%1»: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Strømmen «%1» ble started med en tidligere versjon av KTorrent. Den blir nå "
+"overført for å sørge for at den virker med denne versjonen av KTorrent. Du vil "
+"bli spurt om hvor den skal lagres; veger du «Avbryt» lagres den i "
+"hjemmekatalogen din."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Velg katalog å lagre i"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Ikke startet"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Deler"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Laster ned"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Stanset"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Stoppet"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Feil: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Gjør klar diskplass"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "I kø"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Kontrollerer data"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr "Du vil miste all data du har lastet ned. Er du sikker?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Strømmen «%1» har nådd sitt høyeste delingsforhold. Ignorere grensen og starte "
+"deling uansett?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Nådde grense for høyeste delingsforhold."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Klarte ikke stoppe strømmen «%1»: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Klarte ikke starte strømmen «%1»: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Annonserer"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Ukjent klient"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 perspon\n"
+"%n personer"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Klarte ikke lage fila «%1»: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Klarte ikke skrive første bit til DND-fil: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Klarte ikke skrive siste bit til DND-fil: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Klarte ikke utvide fil: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Klarte ikke utvide fila «%1»"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Klarte ikke utvide fila «%1»"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Feil: Leser forbi slutten av fila «%1»"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Klarte ikk lese fra «%1»"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Klarte ikke skrive til «%1»: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Klarte ikke skrive til «%1»"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Klarte ikke finne diskplass på forhånd: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Klarte ikke binde til UDP-porten %1 eller de ti neste portene."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Ugyldig svar fra sporeren"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Ugyldig data fra sporeren"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Ugyldig sporer-URL"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Kan ikke åpne file «%1»: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Klarte ikke lage indeksfil: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Kan ikke åpne fila «%1»: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Bruker UPnP for å videresende porter på ruteren din automatisk"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Klarte ikke finne tjenesten for portvideresending i enhetens beskrivelse."
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP-enheter"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Undersøker kataloger for strømfiler automatisk, og laster disse."
+
+# | msgid "ScanFolder"
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Undersøk mappe"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Undersøk mappe"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Innstillinger for undersøking av mapper"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "lastet"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Mappeleser – Mappe %1: ugyldig URL eller mappa finnes ikke. Velg en gydlig "
+"mappe."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Internettgrensesnitt"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Innstillinger for Internettgrensesnittet"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+#, fuzzy
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "PHP-programfilen er ikke i standardstien, oppgi stien manuelt"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Skriv inn et nytt passord for internettgrensesnittet"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "«%1» finnes og kan kjøres"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "«%1» finnes ikke"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+#, fuzzy
+msgid "%1 is not executable"
+msgstr "«%1» er ikke en programfil"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "«%1» er en katalog"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+#, fuzzy
+msgid "%1 is not php executable path"
+msgstr "«%1» er ikke stien til PHP-programfilen"
+
+# | msgid "WebInterface"
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Internettgrensesnitt"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "TIllat kontroll av KTorrent gjennom nettleser"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Last ned først"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Last ned normalt"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Last ned sist"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Slett fil(er)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Tilgjengelig"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Venter"
+
+#: plugins/infowidget/fileview.cpp:343
+#, fuzzy
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Du kommer til å miste all data i disse filene, er du sikkert på at du vil gjøre "
+"dette?"
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "Br&uke grense?"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Infotillegg"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Viser mer informasjon om en nedlasting: hvilke biter som er lastet ned, hvor "
+"mange delere og nedlastere . . ."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Kan ikke legge sporere til en privat strøm."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Klarte ikke fjerne strømmens standardsporer."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Du kan ikke legge sporere til en privat strøm"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Land"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klient"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Kvalt"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Overhalt"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Tilgjengelighet"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Poeng"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Opplastingsplass"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Forespørsler"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Fjern person"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Bannlys person"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; – Tilgjengelige biter"
+"<br><img src=\"unavailable_color\">&nbsp; – Utilgjengelige biter"
+"<br><img src=\"excluded_color\">&nbsp; – Ekskluderte biter"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Innstillinger for informasjonstilleggsmodul"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; – Nedlastede biter"
+"<br><img src=\"unavailable_color\">&nbsp; – Biter som gjenstår"
+"<br><img src=\"excluded_color\">&nbsp; – Ekskluderte biter"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Konverter"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Lastet tekstfil . . ."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Vent . . ."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Fila er konvertert."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Klarte ikke laste filter:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Dårlig filterfil. Den er kanskje ødelagt eller av galt format."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+# | msgid "IPFilter"
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IP-filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: lastet og kjører."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: ikke lastet."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Fant ikke filterfil.</font> "
+"Last ned og konverter filterfil."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Den valgte fila finnes allerede. Vil du laste den ned på nytt?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Fila finnes fra før"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Filterfila (level1.dat) finnes allerede. Vil du konvertere den på nytt?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-blokkeringsfilter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Innstillinger for IP-blokkeringsfilter"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Status"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Deling ferdig"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Høyeste antall forbindelser per strøm:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Høyeste antall forbindelser per strøm:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Node:"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Sporere"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "Forbindelser:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Strøm"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Gjennomsnittsfart ned:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Gjennomsnittsfart ned:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Gjennomsnittsfart ned:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Nedlastere:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Mapper"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Strømfiler"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Alle filer"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Klarte ikke godkjenne data: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Klarte ikke laste strømfilen: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importerer delvis eller helt nedlastede strømmer fra andre programmer"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importer eksisterende nedlasting"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL til strøm"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+#, fuzzy
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Undersøker RSS-strømmer automatisk for strømmer som passer regulære uttryk og "
+"laster dem inn."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS-strømmer"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Tittel"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Beskrivelse"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Peker"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Sesong"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episode"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tid"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Planlegger"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Innstillinger for planleggingsmodul"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "MAN"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "TIR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "ONS"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "TOR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "FRE"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "LØR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "SØN"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Plan lagret."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Fant ikke fila."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Plan lastet."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Tilleggsmodul for båndbreddeplanlegging"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Åpne båndbreddeplanlegger"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Båndbreddeplanleggeren er slått av. Gå til «Innstillinger» -> "
+"«Planlegger» for å skru på den."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Loggviser"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Loggviser"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Bruk nettleseren til å søke etter strengen «%1» (store bokstaver) på "
+"søkemotoren du vil legge til. Deretter kopierer du URL-en i adressefeltet etter "
+"at søket er ferdig, og limer det inn her."
+"<br>Å søke etter «%2» i Google, for eksempel, gir adressen "
+"«http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8». Hvis du legger en "
+"URL her, kan KTorrent søke med motoren."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Du må oppgi søkemotorens navn og URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "En søkemotor med samme navn finnes allerede. Velg et annet navn."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Dårlig URL. Du må søke etter «FOOBAR» i nettleseren og lime inn den nøyaktige "
+"adressen her."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Søk"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Innstillinger for søkemotorer"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Søker etter «%1» . . ."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "strømfiler"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Søk ferdig"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Motorer"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Søk etter strømmer på flere populære strømsøkemotorer"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Vil du laste ned eller lagre strømmen?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Last ned strøm"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Last ned"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Finner personer som kjører KTorrent på det lokale nettverket, så du kan dele "
+"strømmer med dem"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Beregning av nedlastingstid:"
diff --git a/translations/nds/Makefile.am b/translations/nds/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/nds/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/nds/messages/Makefile.am b/translations/nds/messages/Makefile.am
new file mode 100644
index 0000000..45ab185
--- /dev/null
+++ b/translations/nds/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = nds
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/nds/messages/ktorrent.po b/translations/nds/messages/ktorrent.po
new file mode 100644
index 0000000..4b3463d
--- /dev/null
+++ b/translations/nds/messages/ktorrent.po
@@ -0,0 +1,5009 @@
+# Translation of ktorrent.po to Low Saxon
+#
+# Manfred Wiese <m.j.wiese@web.de>, 2006.
+# Sönke Dibbern <s_dibbern@web.de>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-12-07 22:58+0100\n"
+"Last-Translator: Sönke Dibbern <s_dibbern@web.de>\n"
+"Language-Team: Low Saxon <kde-i18n-nds@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Keen ankamen Verbinnen (vun Nettdiek blockeert?)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Info"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Wielt den aktuellen Törn överdragen Daten"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Aktuell Gauheit vun all Torrents tosamen"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Koppeln"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Starten"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Anhollen"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "All starten"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "All anhollen"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Torrent-Adress infögen..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Reegpleger opmaken..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Inregen/Utregen"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-Filter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Datenintegriteet pröven"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Hööchst Hoochlaadgauheit fastleggen"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Hööchst Daallaadgauheit fastleggen"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent-Dateien"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "All Dateien"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Adress opmaken"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Gauheit daal: %1 / hooch: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Överdragen daal: %1 / hooch: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "VPT: %1 Knütten, %2 Opgaven"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "VPT: ut"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "All Torrents"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Söken:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Op Groot-/Lüttschrieven oppassen"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Na Dock links verschuven"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Na Dock rechts verschuven"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Na Dock nerrn verschuven"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Tast towiesen..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Tastkombinatschoon wegdoon"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Knoopnummer ännern"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nieg Tastkombinatschoon-Tall:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Du muttst dat Formaat \"XXX.XXX.XXX.XXX\" för de IP-Adress bruken; Du kannst ok "
+"Platzhollers bruken, wenn Du en Adressrebeet angeven wullt, t.B. \"127.0.0.*\"."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Datei utsöken"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Söök en Dateinaam för't Sekern ut"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Leeg Adress."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Daalladen"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Hoochladen"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"De angeven Port (%1) is nich verföögbor oder warrt vun en anner Programm "
+"bruukt. KTorrent bruukt nu de Port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent kann keen Verbinnen annehmen, wiel en anner Programm al de Porten %1 "
+"bet %2 bruukt."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Torrent \"%1\" lett sik nich opstellen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"En Reeg Datendateien vun den Torrent \"%1\" fehlt. Wullt Du se nieg opstellen "
+"oder se nich daalladen?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Nieg opstellen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Nich daalladen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Fehlen Dateien laat sik nich nieg opstellen: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Datendateien fehlt"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Utsöken vun fehlen Dateien lett sik nich torüchnehmen: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"De Datei, de de Daten vun den Torrent \"%1\" bargt, fehlt. Wullt Du ehr nieg "
+"opstellen?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Nieg nieg opstellen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Datendatei \"%1\" lett sik nich nieg opstellen"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Datendatei fehlt"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Datenintegriteet warrt pröövt"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "ahn Enn"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Fehler bi't Daten-Inlesen: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Daten vun <b>%1</b> warrt dörkeken:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "En Bittorrent-Programm för KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Fehlersöök-Bedrief"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokment, dat opmaakt warrn schall"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS-Moduul"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Nettkoppelsteed-Moduul"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statistik-Moduul"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Programm-Lüttbild un en poor annere"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Dat Daalladen-Lüttbild"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 Programm-Lüttbild"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Stückbalken-Kortinfo un \"IWFileTreeItem\"-Sorteren"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Landfinner för InfoWidget-Moduul (Dit Produkt bargt GeoLite-Daten vun MaxMind, "
+"de sik op http://www.maxmind.com/ daalladen laat). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Landflaggen"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Datei-Prioriseren"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "\"Miniupnp\" wöör as Bispeel för uns egen UPnP-Ümsetten bruukt"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Kodeplaster för de globale Deel-Proportschoon"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "ZeroConf-Verbetern"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Kooltmelk-Nettböversiet"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl-Kode ut KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Gauer Ümwanneln binnen dat IPFilter-Moduul"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Hett 2 Sekerheitlöcker opdeckt (bilüttens sünd beed dichtmaakt)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Kodeplaster för't Laden ahn Nafraag, wenn de Oort seker is"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "PHP-Kode vun de Nettböversiet richt"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Besünner Vörweg-Plaatplatztoornen för XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Kodeplaster, mit dat bannig siete Gauheit nich wiest warrt"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Kodeplaster, dat mööglich Verhöden dör Nettdiek wiest"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Verscheden Kodeplasters"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Kodeplaster för't Versteken vun den Menübalken"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Kodeplaster för't Ännern vun de Dateiprioriteten över de Nettböversiet"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "En Reeg Nettböversiet-Kodeplasters"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Filterbalken-Kodeplaster"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Kodeplaster för't opfrischen vun de Dateiansicht ahn Utföhrsträng"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Verbetern bi't Opstellen vun SHA1-Pröövsummen"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Kodeplaster för't Laden ahn Nafraag, wenn de Oort seker is"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Du muttst en Datei oder en Orner utsöken."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Du hest keen Tracker toföögt. Wullt Du dissen Torrent liekers opstellen?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Du muttst tominnst een Knütt tofögen."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent-Dateien (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Datei för't Sekern vun den Torrent utsöken"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "\"%1\" warrt opstellt..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Egen Koppeln"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nieg Koppel"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Naam bewerken"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Koppel wegdoon"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Paneel opmaken"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Giff bitte den Naam vun den Koppel in."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Dat gifft den Koppel \"%1\" al."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Giff bitte den niegen Koppelnaam in."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktive Hoochladen"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Inreegt Hoochladen"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Inreegt Daalladen"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Bruker-Daalladen"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Bruker-Hoochladen"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Nich aktive Torrents"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Nich aktive Daalladen"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Nich aktive Hoochladen"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktive Torrents"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktive Daalladen"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Torrent wegmaken"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Torrent un Daten wegmaken"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Partners tofögen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Anner Partner-Borns"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Borns för Torrent-Partners:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "VPT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Partner tuschen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Mellen vun Hand"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Vöransicht"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Orner opmaken"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Datenorner"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Temporeerorner"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Daallaad-Teel fastleggen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Ut Koppel wegmaken"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Na Koppel tofögen"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Gauheit-Grenzen"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"Dat gifft dissen Torrent nich. Giff bitte de KTorrent-Schrievers vun dissen "
+"Programmfehler bescheed."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "In Fraag kamen Partner toföögt."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Leeg IP-Adress."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Instellen"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Daalladen-Optschonen"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "De VPT-Port mutt nich de sülve as de UDP-Trackerport wesen!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Allgemeen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Allgemeen Optschonen"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"\"%1\" lett sik nich affragen: %2\n"
+"Bitte giff en gellen IP-Adress oder Reeknernaam an."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Verwiedert"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Verwiedert Optschonen"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Sichtbor Striepen"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Daallaadt"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Grött"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Hoochlaadt"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Daallaadgauheit"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Hoochlaadgauheit"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Resttiet"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Verdelers"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Sugers"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% fardig"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Deel-Proportschoon"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Daallaad-Duer"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Verdeel-Duer"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "All Torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Mehr as 1 Daalladen laat sik nich starten, \n"
+"Mehr as %n Daalladen laat sik nich starten, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"un 1 Verdelen. \n"
+"un %n Verdelen. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "Du kannst de Grenzen ünner \"Instellen -> KTorrent instellen\" ännern."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Daalladen för Torrent \"%1\" wöör nich beendt. Wullt Du de nich kompletten "
+"Daten ok wegdoon?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Daalladen wegdoon"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Daten Wegdoon"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Daten wohren"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Di warrt all daallaadt Daten wegkamen. Wullt Du dit redig doon?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Du büst al bi, de Daten vun den Torrent \"%1\" to pröven!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Daallaad-Teel för \"%1\" utsöken"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Du hest de Utwahl för de nakamen, al vörhannen Dateien opheevt. Du warrst all "
+"Daten binnen disse Dateien verleren. Wullt Du redig wiedermaken?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Jo, Dateien wegdoon"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nee, Dateien wohren"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " kort!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Bruker"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Reegpleger"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nee (Privaat Torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Gauheit:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Daalladen: <font color='#1c9a1c'>%1</font></td>"
+"<td>Hoochladen: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Överdregen:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Daalladen: <font color='#1c9a1c'>%3</font></td>"
+"<td>Hoochladen: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> wöör heel daallaadt."
+"<br>Dörsnittlich Gauheit: %2 Daal / %3 Hooch."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Daalladen beendt"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> is bi sien hööchst Deel-Proportschoon vun %2 anlangt un wöör "
+"anhollen."
+"<br>Hoochlaadt %3 bi en dörsnittlich Gauheit vun %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Verdelen beendt"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> is bi sien hööchst Verdeeltiet vun %2 Stünnen anlangt un wöör "
+"anhollen."
+"<br>%3 mit en dörsnittlich Gauheit vun %4 hoochlaadt."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> hett mit dissen Fehler anhollen: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Binnen den Torrent <b>%1</b> gifft dat schaadhaftige Daten."
+"<br>Prööv man maal de Datenintegriteet vun den Torrent."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> is bi sien hööchst Deel-Proportschoon vunu %2 anlangt un lett sik "
+"nich inregen. Maak de Grenz vun Hand weg, wenn Du wiederverdelen wullt."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> is bi sien hööchst Verdeeltiet vun %2 Stünnen anlangt un lett sik "
+"nich inregen. Maak de Grenz vun Hand weg, wenn Du wiederverdelen wullt."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torrent lett sik nich inregen."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "<b>%1</b> lett sik nich opropen: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Mehr as 1 Torrent lett sik nich verdelen. "
+"<br>\n"
+"Mehr as %n Torrents laat sik nich verdelen. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Mehr as 1 Torrent lett sik nich daalladen."
+"<br>\n"
+"Mehr as %n Torrents laat sik nich daalladen. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Torrent lett sik nich starten"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Dor is nich noog Platz op de Fastplaat verföögbor."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"De Platz op Dien Fastplaat warrt knapp."
+"<br><b>%1</b> warrt na \"%2\" daallaadt."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent wöör anhollen.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Platz op Reedschap warrt knapp"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Gauheit-Grenz in kB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Ahn Grenz"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Gauheit-Grenzen för <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "En KDE-Komponentprogramm"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Index-Datei \"%1\" lett sik nich opmaken: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Manfred Wiese, Sönke Dibbern"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "m.j.wiese@web.de, s_dibbern@web.de"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Dateien utsöken, de Du daalladen wullt"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Daalladen na:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Koppel:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "&Brukerstüert"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Torrent starten"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Daalladen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "&All utsöken"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&Keen utsöken"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Utwahl ümdreihen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Platz op de Fastplaat"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Nödig Plattenspieker"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Free Platz op de Fastplaat:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Na't Daalladen:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Verslöteln"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Protokollverslöteln bruken"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Mit Protokollverslöteln lett sik verhöden, dat Internetanbeders "
+"Bittorrentverbinnen langsamer maakt."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Nich verslötelt Verbinnen tolaten"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Wenn dit utmaakt is, kannst Du Di bloots na Clients tokoppeln, de Verslöteln "
+"ünnerstütt."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>V</b>erdeelt <b>P</b>röövsumm-<b>T</b>abell-Protokoll."
+"<br>Dezentraliseert Partner-Uttuuschprotokoll. Mehr Informatschonen laat sik "
+"in't Handbook finnen."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "Över VPT mehr Partners in de &Künn kriegen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP-Port för de VPT-Kommunikatschoon:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Egen IP-Adress"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Den Tracker en egen IP-Adress oder Reeknernaam to&stüern"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Egen IP-Adress oder Reeknernaam:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Systeemafsnitt-Lüttbild"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "&Systeemafsnitt-Lüttbild wiesen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "&Gauheit binnen Systeemafsnitt wiesen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Systeemafsnitt gifft Bescheed"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Hoochlaad-Bandbred (as kB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Daallaad-Bandbreed (as kB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Ornern"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Orner för't Sekern vun Temporeerdateien:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Afslaten Daalladen verschuven na:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Daalladen &automaatsch sekern na:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Torrent-Dateien koperen na:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Daallaad-Warktüüchbalken"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Gauheit-Grenzen för Torrent fastleggen"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Hööchst Hoochlaadgauheit:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Hööchst Daallaadgauheit:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "kB/s (0 = ahn Grenz)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "In Fraag kamen Partner tofögen"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Partner-IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Giff bitte de IP-Adress un de Port vun den Partner in."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent-Leeglist"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Beacht bitte: De Leeglist gellt bloots för den lopen Törn. Du kannst Dien "
+"Indrääg sekern un laden, oder dat IPFilter-Moduul (\"PeerGuardian\") bruken."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Utslaten Partners"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Partner-IP"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Partner tofögen:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Föögt en Partner na de Leeglist to."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Maakt den utsöchten Partner ut de Leeglist weg."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Leddig maken"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Maakt de List leddig"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Sekern &as..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Disse Leeglist för dat IPFilter-Moduul vun KTorrent sekern"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Hööchsttall Daalladen:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Hööchsttall Verdelen:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Daalladen bi wenig Platz op de Fastplaat starten:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minn Platz op de Fastplaat:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Nich starten"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Jümmers nafragen"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Start verdwingen"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 = keen Grenz)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Hööchst Daallaadgauheit:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Globaal Verbinnengrenz:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Hööchst Verdeeltiet:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Hööchsttall vun Verbinnen per Torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Tall vun Hoochlaad-Plätz:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP-Trackerport:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Hööchst Deel-Proportschoon:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Hööchst Hoochlaadgauheit:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "kB/s (0 = ahn Grenz)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Stünnen (0 = keen Grenz)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Wieder hoochladen, wenn en Daalladen beendt is"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Wohrscho"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"De baven angeven Porten mööt ok wiederleddt warrn, wenn Du achter en Nettweger "
+"sittst. Dat UPnP-Moduul kann dat för Di doon."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Töövreeg-Dialoog vun KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "VPT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Deel-Proportschoon:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Övrige Bytes:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Stüert dör"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Hoochladen"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Hoochlaadt:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Na &baven verschuven"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Na &nerrn verschuven"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Na baven verschuven"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Na &nerrn verschuven"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&RP-stüert"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "&Brukerstüert"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Adress infögen"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "Adress:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&OK"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Afbreken"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Torrent opstellen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "De Datei oder Orner, för de(n) Du en Torrent opstellen wullt:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Du muttst tominnst een Tracker oder Knütt tofögen."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Datei-Optschonen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Grött vun elk Stück:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "kB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Torrent-&Verdelen starten"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Ver&deelt (bloots VPT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privaat Torrent (VPT nich tolaten)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Kommentaren:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Opstellen"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Afbreken"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackers"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "VPT-Knütten"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Knütt:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP-Adress oder Reeknernaam"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Beacht: En Reeg gode, bakannte VPT-Knütten sünd al inföögt. Föög man ok Dien "
+"egen IP-Adress un Port to, wenn Du dissen Torrent verdelen wullt."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Verwiedert Instellen"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent-Algoritmus:</b> Standardalgoritmus, tosamensett ut en Reeg anner "
+"Algoritmen, op uns Tests opbuut."
+"<br>\n"
+"<b>Aktuell Gauheit:</b> Eenfach Algoritmus - Utstahn Bytes / Aktuell Gauheit"
+"<br>\n"
+"<b>Globaal Dörsnitt-Gauheit:</b> Utstahn Bytes / Dörsnitt-Gauheit"
+"<br>\n"
+"<b>X Stickproven:</b> Tiet ut x Gauheitproven estemeert"
+"<br>\n"
+"<b>Glieden Dörsnitt:</b> Glieden Dörsnitt-Gauheit, utreekt ut x Proven"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Aktuell Gauheit"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Globaal Dörsnitt-Gauheit"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "X Stickproven"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Glieden Dörsnitt"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(warrt na en Niegstart övernahmen)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "&Plaatplatz nich vörweg toornen"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Platz op de Fastplaat &vörweg heel toornen (verhöödt Deeldateien)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Eenfach (langsam)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Na Dateisysteem"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Leisten"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Spiekerbruuk:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Siet"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Middel"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Hooch"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Böversiet-Opfrischtiet:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Gau CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Langsam CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Datenprööv"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Bi't Hoochladen &keen Stücken nieg pröven, de grötter sünd as"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Daten&integriteet pröven na"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "schaadhaftig Stücken"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Nettwark"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Hööchsttall för nieg Verbinnen:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP för IP-Paketen:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "KDE-Pro&xyinstellen nich för HTTP-Trackerverbinnen bruken"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Proxy för HTTP-Tracker:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Daten warrt dörkeken"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Torrent-Daten warrt dörkeken:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Tall vun funnen Stücken:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Tall vun fehlslaan / nich daallaadt Stücken:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Utproberen"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "Textbeteker 2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "Textbeteker 3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Hööchsttall vun Daalladen (0 = ahn Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Hööchsttall vun Verdelen (0 = ahn Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Daalladen starten, wenn dat to wenig free Platz op de Fastplaat gifft?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Hööchsttall vun Verbinnen per Torrent (0 = ahn Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Hööchsttall vun Verbinnen för all Torrents (0 = ahn Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Hööchst Hoochlaadgauheit in kB/s (0 = ahn Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Hööchst Daallaadgauheit in kB/s (0 = ahn Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Hööchst Deel-Proportschoon (0 = keen Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Hööchst Verdeeltiet (0 = keen Grenz)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Systeemafsnitt-Lüttbild wiesen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Gauheit binnen Systeemafsnitt wiesen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Daallaad-Bandbreed (as kBit/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Hoochlaaden-Bandbreed (as kBit/s)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Opduker wiesen, wenn en Torrent beendt is."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Wieder hoochladen, wenn en Torrent beendt is"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Orner för't Sekern vun Temporeerdateien"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Gifft an, wat Daalladen automaatsch na den Spiekerorner sekert warrn schöölt"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Orner för't Sekern vun daallaadt Dateien"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Gifft an, wat afslaten Daalladen automaatsch na den Afslaten-Orner verschaven "
+"warrt"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Orner, na den afslaten Daalladen verschaven warrt"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Gifft an, wat .torrent-Dateien automaatsch na den Spiekerorner sekert warrt"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Orner för't Sekern vun .torrent-Dateien"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Gifft an, wat en egen IP-Adress na den Tracker övergeven warrn schall"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Orner, na den tolest sekert wöör"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP-Adress, de na den Tracker övergeven warrt"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Spiekerbruuk"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Böversiet-Opfrischtiet"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Ünnerstütten för VPT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "VPT-Port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Tall vun Hoochlaad-Plätz"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Striepen binnen KTorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Tiet-Estemeeralgoritmus"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Wenn dat keen Platz mehr för't Afsluten vun't Daalladen gifft un de fre'e Platz "
+"op de Fastplaat lütter is as minDiskSpace, warrt de Torrent anhollen."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Moduulpleger"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Laden"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Afladen"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "&All laden"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "All a&fladen"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Standard-UPnP-Reedschap"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Opdeckt Reedschappen:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Reedschap"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Wiederleddt Porten"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN-Verbinnen"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Porten wieder&ledden"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Port-Wiederledden torüchnehmen"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Nieg dörkieken"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Orner 1 dörkieken?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Orner 2 dörkieken?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Orner 3 dörkieken?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Padd na Orner1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Padd na Orner 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Padd na Orner 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr ""
+"Gifft an, wat en Torrent ahn Torüchmellen opmaakt warrn schall oder nich."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Wegdoon-Akschoon pröövt."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Verschuven-Akschoon pröövt."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Instellen för't Dörkieken vun Ornern"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Orner &1 dörkieken"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Orner &2 dörkieken"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Orner &3 dörkieken"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "&Na't Laden na Orner \"Laadt\" verschuven"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Torrent na't Laden na den Orner \"Laadt\" verschuven"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Torrents a&hn Torüchmellen opmaken"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Dialoog \"Dateien för't Daalladen utsöken\" nich wiesen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Na't &Laden wegdoon"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Deit den Torrent na't Laden weg"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Ornern för't Dörkieken"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Orner 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Orner 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Orner 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Söök-Vörinstellen"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Nettserver"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Port wiederledden"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Törn-TTL (in s):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Koppelsteed utsöken:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Brukernaam:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Passwoort ännern..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Padd na dat PHP-Programm:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Portnummer"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Port wiederledden"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Törn-Leevtiet"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Koppelsteed-Skin"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Padd na dat PHP-Programm"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "Brukernaam"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "Passwoort"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Stücken"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Tosamen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Opstunns an't Daalladen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Daallaadt:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Utslaten:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Över:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Grött:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Stück"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Vörankamen"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Partner"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Towiest Partners"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Verdelers:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Sugers:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Dörsnittlich Daallaadgauheit:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Dörsnittlich Hoochlaadgauheit:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Tokamen Opfrischen in:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Tracker-Status:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Al daallaadt Delen vun den Torrent:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Verföögbor Delen vun den Torrent:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Verdelen"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Wenn Dien Deel-Proportschoon bi dissen Weert anlangt is, warrt nix mehr "
+"hoochlaadt. De Weert \"Null\" bedüüdt \"ahn Grenz\"."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Wenn Dien Verdeeltiet bi dissen Weert anlangt is, warrt nix mehr hoochlaadt."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Stünnen"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Proportschoongrenz:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Ingrenzen funkscheneeert bloots in Verdeel-Bedrief"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Tiet&grenz:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Tracker &opfrischen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Sietst Opfrischtiet - 60 Sekunnen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "&Tracker tofögen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Tracker wegmaken"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Tracker ä&nnern"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Standardweerten wedderherstellen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Partner-Ansicht in't Hööftfinster wiesen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Stück-Daallaadansicht in't Hööftfinster wiesen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Tracker-Ansicht in't Hööftfinster wiesen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Partner-List wiesen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "List mit &opstunns daallaadt Stücken wiesen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Tracker-List wiesen"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP-Filterinstellen"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "PeerGuardian-Filterdatei utsöken"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "PeerGuardian-Filter bruken?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP-Filterdatei:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "&Daalladen/Ümwanneln"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Du kannst PeerGuardian-Filterdateien vun bluetack.co.uk oder vun blocklist.org "
+"daalladen.\n"
+"Henwies: Zip-Dateien vun bluetack.co.uk warrt ünnerstütt."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "\"Stoop 1\"-Filteradress"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "\"Stoop 1\"-Filter bruken?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "An't Ümwanneln..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Klick op den Knoop \"Ümwanneln\", wenn Du dat Ümwanneln vun de antip2p-Datei "
+"starten wullt. Beacht bitte: Dit mag ok op gauer Reekners wat duern, un binnen "
+"disse Tiet lett sik KTorrent nich bruken."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Opfrischen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Diagrammen jümmers opfrischen na"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Böversiet-Opfrischen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Daten jümmers tohoopstellen na"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "Millisekunnen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Hööchstweert"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Gröttst Weert op y-Ass:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Akraat"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Bruuk de \"Wat is dat\"-Hülp, wenn Du mehr weten wullt"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Du kannst för den gröttsten Weert op de y-Ass fastleggen:\n"
+" - Hööchstweert: Gröttst jichtens meten Gauheit\n"
+" - Akraat: Gröttst in't Diagramm sichtbor Gauheit"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Partner-Gauheit"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Partner-Gauheit:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "opfrischen jümmers na"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "Diagrammdaten opfrischen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Dat Tohoopstellen vun Daten över vele tokoppelte Partners mag wat Perzessertiet "
+"kösten."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Partner-Verbinnen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+"Bi grote Weerten warrt dat Diagramm mit tokoppelte Partners villicht leger "
+"leesbor."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Verdelers in Swärm wiesen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Sugers in Swärm wiesen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Tall vun Meten"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Hoochladen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Verbinnen"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Partners"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Partner-Gauheitdiagrammen an-/utmaken"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Tiet twischen twee Tohoopstellen vun Daten över de Partner-Gauheit"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Dat Wiesen vun Sugers in Swärm an-/utmaken"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Dat Wiesen vun Verdelers in Swärm an-/utmaken"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Tall vun Daallaad-Meten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Tall vun Partnergauheit-Meten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Tall vun Hoochlaad-Meten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Tall vun Verbinnentall-Meten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Tall vun \"DHT\"-Meten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Hööchstweert y-Ass"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Al vörhannen Daalladen importeren"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Daten:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Bitte den Torrent un de för em al daallaadten Daten angeven."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importeren"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "Standard"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS-Strööm"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Strööm"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Wegdoon"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nieg"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&Adress"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artikeln"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Auto&maatsch opfrischen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "TTL över&gahn"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Opfrischen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Titel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Artikeln wohren (Daag)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktiv"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtern"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Annehm-Filtern"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Afwies-Filtern"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Reguleer Utdrück"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "As &Reeg hanteren"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Verarbeiden"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Reeg-Markmalen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Resultaten passt ahn Episood"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Hööchst Episood"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Hööchst Saisong"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Sietst Saisong"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Sietst Episood"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Te&xt utproberen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "&Utproberen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filter-Resultaten"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Bandbreedplaner"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Linksklick-Kategorie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "&Kategorie 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Utmaken"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normaal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategorie &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategorie &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Rechtsklick-Kategorie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategorie &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategorie 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorien"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "Daalladen:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "Hoochladen:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "kB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Kategorie</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 bedüüdt \"ahn Grenz\""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "As Datei sekern"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "Ut Datei &laden"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Planer torüchsetten"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&OK"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Instellsiet för't Planer-Moduul"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "&Bandbreedplaner bruken?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Bandbreedplaner"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Klören ansteed &Pixelbiller bruken?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(För langsamer Reekners anraadt)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "&Plaan bewerken"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Bandbreedplaner anmaken?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Klören ansteed Pixelbiller bruken?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Logbooktext formateren"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Narichten-Mark för allgemeen Informatschonen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Narichten-Mark för Verbinnen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Narichten-Mark för VPT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Narichten-Mark för Tracker-Informatschonen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Narichten-Mark för Fastplaat-In-/Utgaavinformatschonen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Narichten-Mark för't IP-Filter-Moduul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Narichten-Mark för't Söök-Moduul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Narichten-Mark för't Moduul \"Deeldatei-Import\""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Narichten-Mark för't Infofinster-Moduul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Narichten-Mark för't UPnP-Moduul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Narichten-Mark för't Moduul \"Orner dörkieken\""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Narichten-Mark för't Planer-Moduul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Narichten-Mark för't RSS-Moduul"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Narichten-Mark för't Nettkoppelsteed-Moduul"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Logbookkieker-Optschonen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Modulen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "All"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Fehlersöök"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Henwies"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Wichtig"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Keen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-Filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Söken:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Orner dörkieken:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Planer:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Deeldatei-Import:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Infofinster:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-Moduul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Nettkoppelsteed-Moduul:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Systeem"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Allgemeen:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Verbinnen:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Fastplaat-In-/Utgaav:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Logbooktext &formateren"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Extern Nettkieker"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Söken in extern Nettkieker opmaken"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Standard-Nettkieker bruken"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Padd na dat Nettkiek-Programm:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Söökmaschinen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Naam vun de Söökmaschien:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Tofögen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Söökmaschinen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "Adress"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "All &wegmaken"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "&Standard tofögen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Ut Internet opfrischen"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Söken"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Söökmaschien:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Söökmaschien opstunns"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Egen Nettkieker bruken"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Padd na dat Nettkiek-Programm"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 kB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 kB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"Een Dag\n"
+"%n Daag"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Jo, toeerst"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Jo, tolest"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Logbookdatei \"%1\" lett sik nich opmaken: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Datei \"%1\" lett sik nich schrieven: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Datei \"%1\" lett sik nich lesen"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Orner \"%1\" lett sik nich opstellen: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Symlink vun %1 na %2 lett sik nich opstellen: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "\"%1\" lett sik nich na %2 verschuven: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "\"%1\" lett sik nich na %2 koperen: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "\"%1\" lett sik nich wegdoon: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "\"%1\" lett sik nich opstellen: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Dateigrött vun \"%1\" lett sik nich utreken : %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Dateigrött lett sik nich utreken : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Datei \"%1\" lett sik nich opmaken: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Datei \"%1\" lett sik nich ruttrecken"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Datei lett sik nich ruttrecken"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Binnen Datei \"%1\" lett sik nich söken"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Achter dat Enn vun den \"mmap\"-Puffer lett sik nix schrieven!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Status: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Laadt"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Nich laadt"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Moduul-Optschonen"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Datei \"%1\" lett sik nich opmaken: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Den Orner \"%1\" gifft dat nich"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Leeg Beteker: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Dekodeer-Fehler"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Nich verwacht Ingaav-Enn"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "\"%1\" lett sik nich na en Heeltall ümwanneln"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent is nich komplett!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrent is schaadhaftig!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrent hett keen Künnigmaak- oder Knüttenfeld"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Torrent-Datei \"%1\" lett sik nich opmaken: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Inleesfehler"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Bi't Laden vun den Torrent hett dat en Fehler geven. De Torrent is wull "
+"schaadhaftig, oder keen Torrent-Datei.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Bi't Laden vun den Torrent hett dat en Fehler geven. De Torrent is villicht "
+"schaadhaftig, oder keen Torrent-Datei."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "\"%1\" lett sik nich opstellen: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Du laadst den Torrent \"%1\" al daal. De Tracker-List vun beed Torrents wöör "
+"tosamenföhrt."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Du laadst den Torrent \"%1\" al daal. "
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "\"%1\" lett sik nich verlagern: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"De Torrent \"%1\" wöör mit en öller Verschoon vun KTorrent start. Dormit de "
+"Torrent ok redig mit disse Verschoon vun KTorrent löppt, warrt he verlagert. "
+"Wenn Du bi de Fraag na en Spiekeroort för den Torrent op \"Afbreken\" klickst, "
+"warrt he binnen Dien Tohuus-Orner sekert."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Teelorner för't Sekern utsöken"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Nich start"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "An't Verdelen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "An't Daalladen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Afreten"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Anhollen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Fehler: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Plattenspieker warrt towiest"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Inreegt"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Daten warrt pröövt"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Anhollen. Keen Platz mehr op Reedschap na."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Du hest för't Daalladen vun dissen Torrent nich mehr noog Platz op Dien "
+"Fastplaat free . Wullt Du redig wiedermaken?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Nich noog Platz op Fastplaat för \"%1\""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" is bi sien Hööchst-Deelproportschoon anlangt. Grenz övergahn, un "
+"liekers wiederverdelen?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Bi de Hööchst-Deelproportschoon anlangt."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Torrent \"%1\" lett sik nich anhollen: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Torrent \"%1\" lett sik nich starten: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Künnig maken"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Nich bekannt Client"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 Partner\n"
+"%n Partners"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Datei \"%1\" lett sik nich opstellen: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Eerst Stück lett sik nich na DND-Datei schrieven: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Lest Stück lett sik nich na DND-Datei schrieven: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "\"%1\" lett sik nich schrieven: Bloots leesbor Dateisysteem"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Datei \"%1\" lett sik nich utfoolden: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Datei \"%1\" lett sik nich utfoolden: Nich heel schreven"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Datei \"%1\" lett sik nich utfoolden"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Fehler: Achter dat Enn vun Datei \"%1\" lett sik nix lesen"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Fehler bi't Lesen vun %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Fehler bi't Schrieven na \"%1\": %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Fehler bi't Schrieven na \"%1\""
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Plattenspieker lett sik nich vörweg towiesen: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "UDP-Port %1 un de 10 nakamen Porten laat sik nich bruken."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Leeg Antwoort vun Tracker"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Leeg Daten vun Tracker"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Leeg Tracker-Adress"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Datei \"%1\" lett sik nich opmaken: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Indexdatei \"%1\" lett sik nich opstellen"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Datei \"%1\" lett sik nich opmaken: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+"Bruukt UPnP för't automaatsche Wiederledden vun Porten op Dien Nettweger"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"In de Reedschap-Beschrieven lett sik keen Deenst för't Port-Wiederledden "
+"finnen!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP-Reedschappen"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Kiekt automaatsch binnen Ornern na Torrent-Dateien un laadt se."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Orner dörkieken"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Orner dörkieken"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Instellen för't Dörkieken vun Ornern"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "Laadt"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Orner dörkieken - Orner %1: Leeg Adress, oder dat gifft den Orner nich. Bitte "
+"söök en gellen Orner ut."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Nettkoppelsteed"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Nettkoppelsteed-Optschonen"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Dat PHP-Programm lett sik nich över Dien PATH-Variabel finnen, bitte giff den "
+"Padd vun Hand in."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Giff bitte en nieg Passwoort för de Nettkoppelsteed in."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "Dat gifft \"%1\", un dat is ok utföhrbor."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "\"%1\" gifft dat nich"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "\"%1\" lett sik nich utföhren"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "\"%1\" is en Orner."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "\"%1\" is nich de Padd na't PHP-Programm"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Nettböversiet"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Dat Kuntrulleren vun KTorrent över en Nettkieker tolaten"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Toeerst daalladen"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Normaal daalladen"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Tolest daalladen"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Datei(en) wegdoon"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Verföögbor"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Plaant"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Di warrt all Daten binnen disse Datei wegkamen. Wullt Du redig wiedermaken?\n"
+"Di warrt all Daten binnen disse Dateien wegkamen. Wullt Du redig wiedermaken?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Keen Grenz"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Informatschonen-Finster"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Wiest mehr Daalladen-Informatschonen, so t.B., welk Stücken al daallaadt wöörn, "
+"oder de Tall vun Anbeders un Daalladers, ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Na en privaat Torrent lett sik keen Tracker tofögen."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Torrent-Standardtracker lett sik nich wegdoon."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Du kannst keen Trackers na en privaat Torrent tofögen"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Land"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Client"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Drosselt"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Afwiest"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Verföögborkeit"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Pünkt"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Hoochlaad-Platz"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Anfragen"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Partner op de Töhn pedden"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Partner utsluten"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Verföögbor Stücken"
+"<br><img src=\"unavailable_color\">&nbsp; - Nich verföögbor Stücken"
+"<br><img src=\"excluded_color\">&nbsp; - Utslaten Stücken"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Infofinster-Optschonen"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Daallaadt Stücken"
+"<br><img src=\"unavailable_color\">&nbsp; - Stücken för't Daalladen"
+"<br><img src=\"excluded_color\">&nbsp; - Utslaten Stücken"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Ümwanneln"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Textdatei warrt laadt..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Tööv bitte..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Datei ümwannelt."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Filter lett sik nich laden:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Leeg Filter-Datei. Se is villicht schaadhaftig oder hett en leeg Formaat."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Schutert utsöchte Partners na ehr IP-Adressen ut"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP-Filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: Laadt un löppt."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: Nich laadt."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Filterdatei nich funnen.</font> "
+"Laad en Filterdatei daal un wannel ehr üm."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Dat gifft de utsöchte Datei al. Wullt Du ehr nochmaal dalladen?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Gifft Datei al"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Dat gifft de Filterdatei (level1.dat) al, wullt Du ehr nochmaal ümwanneln?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-Filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Instellen för den IP-Filter"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistik"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Statistik-Optschonen"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Tokoppelt Sugers"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Sugers in Swärm"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Tokoppelt Verdelers"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Verdelers in Swärm"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Dörsnitt vun tokoppelt Sugers per Torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Dörsnitt vun tokoppelt Verdelers per Torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Dörsnitt vun tokoppelt Sugers per lopen Torrent"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Dörsnitt vun tokoppelt Verdelers per lopen Torrent"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Knütten"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Opgaven"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Överdregen-Statistik wiesen"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Gauheit-Statistik"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Verbinnen-Statistik"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Jüst nu"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Dörsnitt"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Grenz"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Dörsnittlich vun Suger"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Dörsnittlich na Suger"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Dörsnittlich vun Verdeler"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Vun Sugers"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Vun Verdelers"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Verkloren"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent-Dateien"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "All Dateien"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Daten laat sik nich pröven: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Torrentdatei \"%1\" lett sik nich laden"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importeert deelwies oder fardig daallaadt Torrents vun anner Clients"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Vörhannen Daalladen importeren"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL vun den Stroom"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Kiekt RSS-Strööm automaatsch mit reguleer Utdrück na passen Torrents dör un "
+"laadt se."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS-Strööm"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+"För \"%1\" lett sik keen Torrent finnen, de gellt un sik daalladen lett."
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Titel"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Beschrieven"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Link"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Saisong"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episood"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tiet"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Planer"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Planermoduul-Instellen"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "Ma."
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "Di."
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "Mi."
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "Du."
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "Fr."
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "Sa."
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "Sü."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Plaan sekert."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Datei lett sik nich finnen."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Plaan laadt."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Bandbreedplaner-Moduul"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Bandbreedplaner opmaken"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"De Bandbreed-Planer wöör utmaakt. Du kannst em över \"Instellen\" -> "
+"\"Planer\" anmaken."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Logbookkieker"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Logbookkieker"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Wiest de Logbook-Utgaven vun KTorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Söök mit Dien Nettkieker na de Tekenkeed \"%1\" (Grootbookstaven) över de "
+"Söökmaschien, de Du tofögen wullt. "
+"<br>Wenn de Söök afslaten is, kopeer de Adress ut den Adressbalken, un föög ehr "
+"hier in."
+"<br>"
+"<br>En Söök na \"%1\" över Google a.B. hett dit Resultaat: "
+"\"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8\". Wenn Du disse "
+"Adress hier toföögst, kann KTorrent Google för de Söök bruken."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Söök mit Dien Nettkieker na de Tekenkeed \"%1\" (Grootbookstaven) över de "
+"Söökmaschien, de Du tofögen wullt, un bruuk de URL vun de Siet mit de "
+"Söökresultaten nerrn."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Du muttst Naam un Adress vun de Söökmaschien ingeven"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Dat gifft al en Söökmaschien mit dissen Naam. Bitte giff en anner Naam in."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Leeg Adress. Du schullst mit Dien Nettkieker na FOOBAR söken, un de naue Adress "
+"hier rinkoperen/infögen."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Söök"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Söökmaschien-Optschonen"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "\"%1\" warrt söcht..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Torrent-Dateien"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Söök beendt"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Söökmaschinen: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Na Torrents mit en Reeg faken bruukte Torrent-Söökmaschinen söken"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Wullt Du den Torent daalladen oder sekern?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Torrent daalladen"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Daalladen"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Söcht för't Delen vun Torrents na Partners binnen dat lokale Nettwark, op de ok "
+"KTorrent löppt."
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Resttiet-Algoritmus:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Stück %1 lett sik nich laden"
+
+#~ msgid "Alt+X"
+#~ msgstr "Alt+X"
+
+#~ msgid "TrackerViewBase"
+#~ msgstr "TrackerViewBase"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "Deenstfeld vun IP-Paketen"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+S"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+R"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr "Land-Lokaliseren för dat Infofinster-Moduul. De Flaggen sünd vun http://flags.blogpotato.de/. Velen Dank ok."
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "Du muttst tominnst een Tracker tofögen."
+
+#~ msgid "DownloadPref"
+#~ msgstr "Daallaad-Instellen"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+P"
+
+#~ msgid "Alt+U"
+#~ msgstr "Alt+O"
+
+#~ msgid "Alt+A"
+#~ msgstr "Alt+A"
+
+#~ msgid "Form1"
+#~ msgstr "Form1"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+P"
+
+#~ msgid "Form2"
+#~ msgstr "Form2"
+
+#~ msgid "Max ratio:"
+#~ msgstr "Hööchst Deel-Proportschoon:"
+
+#~ msgid "Name"
+#~ msgstr "Naam"
+
+#~ msgid "Author"
+#~ msgstr "Autor"
+
+#~ msgid "IP filter plugin, filters out unwanted peers"
+#~ msgstr "IP-Filter-Moduul: Filtert leegleden Partners ut"
+
+#~ msgid "Shows logging output in a widget"
+#~ msgstr "Wiest de Logbook-Utgaav binnen en Finster"
+
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "\"Richtig\" Nieg-Utgaven daalladen"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "Tracker-Adress:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "Tracker-Status:"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "De angeven UDP-Port (%1) is nich verföögbor oder warrt vun en anner Programm bruukt. KTorrent bruukt ansteed de Port %2."
+
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Orner för de Daten vun \"%1\" utsöken"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Daalladen %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Hoochladen %1/%2"
+
+#~ msgid "Search Engine:"
+#~ msgstr "Söökmaschien:"
+
+#~ msgid "Clear Search Histor&y"
+#~ msgstr "Söök-Vörges&chicht leddig maken"
+
+#~ msgid "Torrents"
+#~ msgstr "Torrents"
+
+#~ msgid "Tracker"
+#~ msgstr "Tracker"
+
+#~ msgid "St&atus"
+#~ msgstr "St&atus"
+
+#~ msgid "You need to have default save directory selected to load torrents silently."
+#~ msgstr "Du muttst en Standardorner för't Sekern angeven, wenn Du Torrents ahn Nafraag daalladen wullt."
diff --git a/translations/nl/Makefile.am b/translations/nl/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/nl/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/nl/messages/Makefile.am b/translations/nl/messages/Makefile.am
new file mode 100644
index 0000000..69faf0b
--- /dev/null
+++ b/translations/nl/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = nl
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/nl/messages/ktorrent.po b/translations/nl/messages/ktorrent.po
new file mode 100644
index 0000000..91cafe5
--- /dev/null
+++ b/translations/nl/messages/ktorrent.po
@@ -0,0 +1,4929 @@
+# translation of ktorrent.po to Nederlands
+# Rinse de Vries <rinsedevries@kde.nl>, 2005, 2006, 2007, 2008.
+# Maarten Rütten <maartenrutten@kde.nl>, 2005.
+# Bram Schoenmakers <bramschoenmakers@kde.nl>, 2005, 2006, 2008.
+# Martijn van Vliet <mvanvliet@gmail.com>, 2006, 2007.
+# Rinse de Vries <RinseDeVries@home.nl>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-03-10 13:43+0100\n"
+"Last-Translator: Bram Schoenmakers <bramschoenmakers@kde.nl>\n"
+"Language-Team: Nederlands <kde-i18n-nl@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Geen binnenkomende verbindingen (mogelijk geblokkeerd door firewall)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informatie"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Data overgedragen tijdens de huidige sessie"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Huidige snelheid van alle torrents bij elkaar"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Groepen"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Starten"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Stoppen"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Alles starten"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Alles stoppen"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Torrent-URL plakken..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Wachtrijmanager openen..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "In wachtrij zetten/Uit wachtrij halen"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-filter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Gegevensintegriteit controleren"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Maximum uploadsnelheid"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Maximum downloadsnelheid"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent-bestanden"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Alle bestanden"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Locatie openen"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Snelheid down: %1 / up: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Overgedragen down: %1 / up: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 nodes, %2 opdrachten"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: uit"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Alle torrents"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Zoeken:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Hoofdlettergevoelig"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Naar linker dock verplaatsen"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Naar rechterdock verplaatsen"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Naar benedendock verplaatsen"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Versneller toekennen..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Versneller verwijderen"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Knopnummer veranderen"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nieuw acceleratienummer:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"IP-adressen dienen ingevoerd te worden met de opmaak XXX.XXX.XXX.XXX. Er kunnen "
+"ook jokertekens worden gebruikt voor bepaalde bereiken, bijvoorbeeld 127.0.0.*."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Openen"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Opslaan als"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Ongeldig URL-adres."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Uploads"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"De ingestelde poort (%1) is niet beschikbaar of reeds in gebruik door een ander "
+"programma. KTorrent gaat nu verder op poort %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent is op het moment niet in staat om verbindingen aan te nemen: de "
+"poorten %1 tot %2 zijn reeds in gebruik door een ander programma."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "De torrent %1 kan niet worden aangemaakt."
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Er ontbreken een of meer bestanden in de torrent \"%1\". Wilt u deze bestanden "
+"opnieuw aanmaken, of wilt u deze niet downloaden?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Opnieuw aanmaken"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Niet downloaden"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Kan de ontbrekende bestanden niet opnieuw aanmaken: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Bestandsgegevens ontbreken"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Kan geen ontbrekende bestanden deselecteren: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Het bestand waarin de gegevens van torrent \"%1\" zijn opgeslagen ontbreekt. "
+"Wilt u dit bestand opnieuw aanmaken?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Niet opnieuw aanmaken"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Kan het bestand %1 niet opnieuw aanmaken."
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Bestand ontbreekt"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Integriteit van bestandsgegevens controleren"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "oneindig"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Fout bij het doorzoeken van gegevens: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Data van '<b>%1</b>' worden gescand op chunks:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Een BitTorrent-programma voor KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Afluistermodus"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr "Torrent uit URL-adres stilzwijgend opslaan"
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Te openen document"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS-plugin:"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Webinterfaceplugin:"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statistiekenplugin"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Toepassingspictogram en enkele anderen"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Het downloadpictogram"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 toepassingspictogram"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+"Hulpballon voor de chunkbalk en sortering van bestandsboomstructuur in "
+"infowidget"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Geolocatiezoeker voor InfoWidget-plugin (dit product bevat GeoLite-gegevens, "
+"gemaakt door MaxMind, beschikbaar op http://www.maxmind.com/)."
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Landvlaggen"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Downloadprioriteit bestanden instellen"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "MiniUPnP is als voorbeeld gebruikt voor onze eigen UPnP-implementatie"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Patch voor globale maximum deelverhouding"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "ZeroConf-verbeteringen"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk webinterface"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl-code van KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Snelheidsverbeteringen voor conversie in ipfilter plugin"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Ontdekte twee veiligheidslekken (beiden zijn opgelost)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Patch om stil te kunnen laden met een opslaglocatie"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Fixes in PHP-code van de webinterface"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS-specifieke schijfruimtetoewijzing"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Patch voor het niet weergeven van lage bandbreedte"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Patch voor het herkennen van eventuele aanwezigheid van firewalls"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Diverse patches"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Patch voor het verbergen van de menubalk"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Patch voor het wijzigen van bestandsprioriteiten in de webinterface"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Diverse patches voor de webinterface"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Patch voor de filterbalk"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Patch voor non-threaded bijwerking van de bestandsweergave"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Optimalisatie naar SHA1 hash-generatie"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+"Patch om de berekening van de vrije schijfruimte op FreeBSD te repareren"
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr "Patch om stilzwijgend te kunnen laden vanaf de commandoregel"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Selecteer eerst een bestand of map."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "U hebt geen tracker toegevoegd. Wilt u deze torrent toch aanmaken?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Voeg tenminste één node toe."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent-bestanden (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Torrent opslaan als"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "%1 wordt aangemaakt..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Aangepaste groepen"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Groep aanmaken"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Hernoemen"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Groep verwijderen"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "In nieuw tabblad openen"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Voer een groepsnaam in."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "De groep %1 bestaat reeds."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Voer een nieuwe groepsnaam in."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Actieve uploads"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Uploads@wachtrij"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Downloads@wachtrij"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Downloads@gebruiker"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Uploads@gebruiker"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Inactieve torrents"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Inactieve downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Inactieve uploads"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Actieve torrents"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Actieve downloads"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Torrent verwijderen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Torrent en gegevens verwijderen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Peers toevoegen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Extra peerbronnen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Torrent-peerbronnen:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Peer-uitwisseling"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Handmatig aankondigen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Voorbeeld"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Map openen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Opslaglocatie"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Tijdelijke gegevensmap"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Downloadlocatie instellen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Uit groep verwijderen"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Aan groep toevoegen"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Snelheidslimieten"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"Torrent bestaat niet. Rapporteer deze bug a.u.b. bij de ontwikkelaars van "
+"KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Potentiële peer toegevoegd."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Ongeldig IP-adres."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Instellingen"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Downloadinstellingen"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+"De ingestelde poort voor DHT dient een ander poortnummer te hebben dan de poort "
+"voor UDP-tracker!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Algemeen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Algemene instellingen"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Kan %1 niet opzoeken: %2\n"
+"Geef a.u.b. een geldig IP-adres of hostnaam op."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Geavanceerde instellingen"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Zichtbare kolommen"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Gedownload"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Grootte"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Geüpload"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Downloadsnelheid"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Uploadsnelheid"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Resterende tijd"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Seeders"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Leechers"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Voltooid"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Ratio"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Downloadtijd"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Uploadtijd"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Alle torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Kan niet meer dan 1 download \n"
+"Kan niet meer dan %n downloads "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"en 1 upload tegelijk starten. \n"
+"en %n uploads tegelijk starten. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Ga naar Instellingen -> KTorrent instellen - indien u deze limieten wilt "
+"veranderen."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"De torrent %1 is nog niet klaar met downloaden. Wilt u naast de torrent ook de "
+"incomplete bestandsgegevens behorende bij deze torrent verwijderen?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Download verwijderen"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Gegevens verwijderen"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Gegevens behouden"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Alle gedownloade gegevens zullen verloren gaan. Weet u zeker dat u wilt "
+"doorgaan?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Er is reeds een bestandscontrole op de torrent %1 gaande!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Kies een nieuwe map voor gegevens van %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"U heeft de volgende bestaande bestanden gedeselecteerd. Alle gegevens in deze "
+"bestanden zullen verloren gaan, wilt u doorgaan?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Ja, bestanden verwijderen"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nee, bestanden behouden"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " te weinig!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Gebruiker"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Wachtrijmanager"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nee (privé-torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Snelheid:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Overgedragen:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> is klaar met downloaden."
+"<br>Gemiddelde snelheid: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Download voltooid"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> heeft zijn maximum deelverhouding van %2 bereikt en is nu stilgezet."
+"<br>Er werd geüpload %3 op een gemiddelde snelheid van %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Uploaden voltooid"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> heeft zijn maximum tijd om te seeden van %2 bereikt en is nu "
+"stilgezet."
+"<br>Er werd geüpload %3 op een gemiddelde snelheid van %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> is gestopt met de volgende foutmelding: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Er zijn beschadigde gegevens aangetroffen in de torrent <b>%1</b>"
+"<br>Het zou een goed idee zijn om nu zélf een controle op de integriteit van de "
+"bestandsgegevens in deze torrent uit te voeren."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> heeft zijn maximum deelverhouding van %2 bereikt en kon daarom niet "
+"in wachtrij worden gezet."
+"<br>Verwijder het deellimiet indien u wilt doorgaan met uploaden."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> heeft zijn maximum tijd om te seeden van %2 bereikt en kon daarom "
+"niet in wachtrij worden gezet."
+"<br>Verwijder het limiet indien u wilt doorgaan met seeden."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torrent kan niet in wachtrij worden gezet."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Kan <b>%1</b> niet starten : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan niet meer dan 1 torrent seeden. "
+"<br>\n"
+"Kan niet meer dan %n torrents seeden. "
+"<br> "
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan niet meer dan 1 torrent downloaden. "
+"<br>\n"
+"Kan niet meer dan %n torrents downloaden. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Torrent kan niet worden gestart"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Er is een te kort aan schijfruimte."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "De schijfruimte raakt op. <br><b>%1</b> wordt gedownload naar %2."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent is gestopt.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Schijfruimte op apparaat raakt leeg"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Snelheidslimiet in KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Ongelimiteerd"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Snelheidslimiet voor <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Een KDE KPart-toepassing"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Kan indexbestand %1 niet openen: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Martijn van Vliet,Maarten Rütten,Rinse de Vries,Bram Schoenmakers"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"mvanvliet@gmail.com,maartenrutten@kde.nl,rinsedevries@kde.nl,"
+"bramschoenmakers@kde.nl"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Selecteer de bestanden die u wilt downloaden"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Downloaden naar:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Groep:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Aansturen door gebr&uiker"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Uploaden van torrent &starten"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Downloaden"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "&Alles selecteren"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&Niets selecteren"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Selectie omkeren"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Schijfruimte"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Benodigde schijfruimte:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Vrije schijfruimte:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Na afronden download:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Encryptie"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Protocolversleuteling gebruiken"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Protocolversleuteling kan worden gebruikt om te verhinderen dat (bepaalde) "
+"internetproviders BitTorrent-verbindingen vertragen."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Onversleutelde verbindingen toestaan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Indien niet aangevinkt, zal KTorrent enkel verbinding kunnen maken met clients "
+"die encryptie ondersteunen."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Gedecentraliseerde peeruitwisselingsprotocol. Zie het handboek voor meer "
+"informatie."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "DHT gebr&uiken om extra peerbronnen te verkrijgen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP-poort voor DHT-communicatie:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Aangepast IP-adres"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Aa&ngepast IP-adres of hostnaam naar de tracker zenden"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Aangepast IP-adres of hostnaam:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Systeemvakpictogram"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Pictogram in s&ysteemvak plaatsen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "&Snelheidsindicatie op systeemvakpictogram tonen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Notificatieberichten boven systeemvak tonen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Uploadbandbreedte (KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Downloadbandbreedte (KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Mappen"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Tijdelijke gegevensmap:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Verplaats afgeronde downloads naar:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Downloads &automatisch opslaan in:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Kopieer .torrent-bestanden naar:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Downloadwerkbalk"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Snelheidslimieten voor torrent instellen"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maximum uploadsnelheid:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maximum downloadsnelheid:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/sec (0 is geen limiet)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Potentiële peer toevoegen"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Peer IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Poort:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Voer het IP-adres en de poort van de peer in."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent's zwarte lijst"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Opmerking: De zwarte lijst is alleen van toepassing op de huidige sessie. Maak "
+"gebruik van opslaan/openen om uw adressenlijst te hergebruiken, of maak gebruik "
+"van de IP-filter plugin (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Verbannen peers"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Peer IP-adres"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Peer toevoegen:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Voegt een peer aan de zwarte lijst toe"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Verwijdert een geselecteerde peer van de zwarte lijst"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Leegmaken"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Maakt deze lijst leeg"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Op&slaan als..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Sla deze zwarte lijst op indien u het met de KTorrent IP-filter plugin wilt "
+"blijven gebruiken"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maximum downloads:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maximum uploads:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Download starten bij weinig vrije schijfruimte:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimum schijfruimte:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Niet starten"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Altijd vragen"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Start afdwingen"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 is geen limiet)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maximum downloadsnelheid:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Maximum aantal verbindingen totaal:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Max. tijd om te seeden:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maximum aantal verbindingen per torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Aantal upload slots:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Poort UDP-tracker:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maximum deelverhouding:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maximum uploadsnelheid:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/sec (0 is geen limiet)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Uren (0 is geen limiet)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Doorgaan met uploaden nadat een download is voltooid"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Attentie"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"De bovenstaande poorten dienen doorgestuurd te worden naar het IP-adres van uw "
+"computer indien u zich achter een router bevindt. De UPnP-plugin kan dit voor u "
+"doen."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT wachtrij-dialoogvenster"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Deelverhouding:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Bytes over:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Aangestuurd door"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Upload&s"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Geüpload:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "&Omhoog verplaatsen"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Omlaag verplaatse&n"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Naar bovenkant verplaatsen"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Naar onder&kant verplaatsen"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Aansturen door &wachtrij"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Aansturen door gebr&uiker"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "URL plakken"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL-adres:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&OK"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Annuleren"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Torrent aanmaken"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Het bestand of de map waarvan u een torrent wilt aanmaken:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Voeg tenminste één tracker of node toe."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Bestandsopties"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Grootte van elke chunk:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Uploaden van torrent &starten"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Gedecentraliseerd (enkel DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privé-torrent (DHT niet toegestaan)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Commentaar:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "Aan&maken"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Annuleren"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackers"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT nodes"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Node:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP of hostnaam"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Poort"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Opmerking: Enkele bekende goede nodes zijn al voor u ingevuld. U zult "
+"waarschijnlijk uw eigen IP-adres en poort ook in willen voeren indien u van "
+"plan bent deze torrent te gaan uploaden."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Geavanceerde instellingen"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr "Algoritme voor schatten van resterende tijd:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent algoritme:</b> Het standaard algoritme. Een combinatie van andere "
+"algoritmes en gebaseerd op onze eigen tests."
+"<br>\n"
+"<b>Huidige snelheidsalgoritme:</b> Het meest simpele algoritme - Bytes te doen/ "
+"Huidige snelheid."
+"<br>\n"
+"<b>Globaal gemiddeld snelheidsalgoritme:</b> Bytes te doen/ Gemiddelde "
+"snelheid."
+"<br>\n"
+"<b>Window of X algoritme:</b> Resterende tijd berekend uit een gemiddelde van X "
+"metingen."
+"<br>\n"
+"<b>Moving average algoritme:</b> Moving average, tijdsberekening uit een "
+"gemiddelde van X metingen."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Huidige snelheid"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Globale gemiddelde snelheid"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Windows of X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Moving avarage"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(treedt in werking na herstarten)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Toewijzen van schijfrui&mte uitschakelen"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+"Volledig toewijzen van schijfr&uimte (langzaam, maar voorkomt fragmentatie)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Normaal (traag)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Naar bestandssysteem"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Prestatie"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Geheugengebruik:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Laag"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Gemiddeld"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Hoog"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Interface bijwerken in:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Snelle CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Langzame CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Dataverificatie tijdens uploadmodus"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Hercontroleer gee&n chunks groter dan"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Doe een integriteitscontrole op bestandsgegevens na"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "beschadigde chunks"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Netwerken"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maximum aantal halfopen verbindingen:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP voor IP-pakketten:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+"Maak geen gebruik van KDE's eigen pro&xy voor de HTTP-trackerverbindingen."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP-tracker proxy:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Controleren van gegevens"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Data van torrent worden gescand op chunks:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Aantal goede chunks:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Aantal onjuiste chunks / niet gedownload:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Testen"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maximum aantal actieve downloads (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maximum aantal actieve uploads (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Downloads starten bij weinig schijfruimte?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maximum aantal verbindingen per torrent (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Maximum aantal verbindingen totaal (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maximum uploadsnelheid in KB/sec (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maximum downloadsnelheid in KB/sec (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maximum deelverhouding (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maximum tijd om te seeden in uren (0 = geen limiet)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Pictogram in systeemvak plaatsen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Snelheidsindicatie op systeemvakpictogram tonen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Downloadsnelheid (KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Uploadsnelheid (KB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Popup-berichten tonen wanneer een torrent is voltooid."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Doorgaan met uploaden nadat een download is voltooid"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Map om tijdelijke bestanden op te slaan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Indien u een download automatisch op wilt slaan in een standaard opslaglocatie"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Map om gedownloade bestanden op te slaan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Indien u een afgeronde download automatisch wilt verplaatsen naar een standaard "
+"opslaglocatie."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Map om afgeronde downloads naar te verplaatsen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Indien u torrent-bestanden automatisch op wilt slaan in een standaard "
+"opslaglocatie"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Map om torrent-bestanden naar toe te kopieren."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Indien u een aangepast IP-adres aan de tracker wilt meegeven"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Map die het laatst was gebruikt als de opslaglocatie"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP om aan de tracker mee te geven"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Geheugengebruik"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Interface bijwerken in"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Ondersteuning voor DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT-poort"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Aantal uploadsloten"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Weergegeven kolommen in de basisweergave van Ktorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "ETA algoritme"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"De torrent zal worden gestopt als er niet genoeg schijfruimte over is om de "
+"torrent af te ronden en wanneer de schijfruimte minder is dan minDiskSpace."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Pluginmanager"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Laden"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "O&ntladen"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Alles &laden"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Alles on&tladen"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Standaard te gebruiken UPnP-apparaat"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Gedetecteerde apparaten:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Apparaat"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Doorgestuurde poorten"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN-verbinding"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Poorten &doorsturen"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Poortdoorsturing ongedaan maken"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Opnieuw zoeken"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Torrent-detectie van map 1 activeren?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Torrent-detectie van map 2 activeren?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Torrent-detectie van map 3 activeren?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Pad map 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Pad map 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Pad map 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Voor het wel of niet stil openen van een torrent."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Verwijderhandeling geselecteerd."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Verplaatshandeling geselecteerd."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Instellingen mapdetectie"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Map &1 detecteren"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Map &2 detecteren"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Map &3 detecteren"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Verplaats het torrent-bestand naar de &map \"loaded\" na het laden"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Verplaatst het torrent-bestand naar de map \"loaded\" na het te laden"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Torrent-bestanden s&til openen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+"Dialoogvenster 'Selecteer de bestanden die u wilt downloaden' niet weergeven."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Torrent-bestanden ver&wijderen na het laden"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Verwijdert het torrent-bestand na het laden"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Te detecteren mappen"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Map 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Map 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Map 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Zoekinstellingen"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Webserver"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Poort doorsturen"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Sessie TTL (in sec):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Selecteer interface:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Wachtwoord aanpassen..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Uitvoerbaar pad naar php:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Poortnummer"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Poort doorsturen"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Levensduur inactieve sessie"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Model interface"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Uitvoerbaar pad naar php"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "gebruikersnaam"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "wachtwoord"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Chunks"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Totaal:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Nu aan het downloaden:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Gedownload:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Uitgesloten:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Te doen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Grootte:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Chunk"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Voortgang"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Peer"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Toegewezen peers"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Seeders:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Leechers:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Gemiddelde downloadsnelheid:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Gemiddelde uploadsnelheid:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Volgende update:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Trackerstatus:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Delen van de torrent die zijn gedownload:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Delen van de torrent die beschikbaar zijn:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Delen"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Het uploaden zal stoppen wanneer de deelverhouding deze waarde heeft bereikt. "
+"Nul betekent geen limiet."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Het uploaden zal stoppen wanneer er geüpload is voor dit aantal uren."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Uren"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Ratio limiet"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Limiet werkt alleen in de uploadmodus"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Tijds&limiet:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Tracker &updaten"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minimale interval tussen updates - 60 seconden"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Trac&ker toevoegen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Tracker verwijderen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Tracker aa&npassen"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Standaard instellingen herstellen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Tabblad met peers in het hoofdvenster tonen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Tabblad met chunks in het hoofdvenster tonen"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Tabblad met trackers in het hoofdvenster tonen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Tabblad met peers tonen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Tabblad met informatie over chun&ks tonen"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Tabblad met trackers tonen"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP filterinstellingen"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Selecteer PeerGuardian filterbestand "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "PeerGuardian filter gebruiken?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP filterbestand:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Dow&nloaden/Converteren"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Download PeerGuardian's filter van bluetack.co.uk of blocklist.org.\n"
+"Opmerking: Zip-bestand van bluetack.co.uk wordt nu ondersteund."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Level1 filter URL"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Level1 filter gebruiken?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Bezig met converteren..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Klik op de knop 'Converteren' om het omzetten van het anti-p2p-bestand te "
+"starten. Opmerking: Dit proces kan enige tijd in beslag nemen, óók op de "
+"snellere computers. Tijdens dit proces kunt u KTorrent niet gebruiken."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Updaten"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Update grafieken elke"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Interface-updates"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Verzamel gegevens elke"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "miliseconden"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maximum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Maximum snelheidsschaal modus"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Exact"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Zie 'Wat is dit' voor meer hulp."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Maximum waarde op de OY-geschaalde as:\n"
+"- Top: Globaal behaalde maximum snelheid\n"
+"- Exact:Maximum behaalde snelheid zichtbaar op de grafiek"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Snelheid peers"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Snelheid peers:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "updaten elke"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "grafiekbijwerkingen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Het verzamelen van gegevens over verbonden peers kan CPU-intensief zijn."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Peer-verbindingen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Grote waardes kunnen de grafieken vervagen."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Seeders in zwermen tonen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Leechers in zwermen tonen"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Telling van meting"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Upload"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Verbindingen"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Snelheidsgrafieken van peers aan/uit"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Interval tussen het verkrijgen van snelheidgegevens van peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Weergave van leechers in zwermen aan/uit zetten"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Weergave van seeders in zwermen aan/uit"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Telling van downloadmeting"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Telling van snelheidsmeting van peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Telling van uploadmeting"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Telling van het aantal verbindingen"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Telling van DHT-meting"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "OY-as maximum wijze"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Bestaande download importeren"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Gegevens:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Geef het torrent-bestand en de reeds gedownloade gegevens op."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importeren"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "standaard"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS feeds"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Feeds"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Verwijderen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nieuw"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artikelen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Feed bijwe&rken elke"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "TTL ne&geren"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Vernieuwen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Titel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Archiefgrootte (dagen)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Actief"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filters"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Accepterende filters"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Verwerpende filters"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Reguliere expressies"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Behandelen als &serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Filteren"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Criteria voor series"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Overeenkomsten zonder episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Maximaal episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Maximaal seizoen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Minimaal seizoen"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Minimaal episode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Te&kst uittesten"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&sten"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Gefilterde overeenkomsten"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Bandbreedteplanner"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Profiel linkermuisknop"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "&Profiel 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Uitgeschakeld"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normaal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Profiel &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Profiel &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Profiel rechtermuisknop"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Profiel &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "Pro&fiel 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Profielen"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>Profiel 1</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>Profiel 3</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "download:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "upload:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>Profiel 2</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* nul betekent geen limiet"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Opslaan als"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Openen"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Opnieuw instellen"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Instellingenpagina bandbreedteplannerplugin"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "&Bandbreedteplanner gebruiken?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Bandbreedteplanner"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Kleuren in plaats van pi&xmaps gebruiken?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Aanbevolen voor tragere systemen)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "P&lanner aanpassen"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Bandbreedteplanner activeren?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Kleuren in plaats van pixmaps gebruiken?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Gebruik opgemaakte tekst in logvenster"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Berichtenvlag voor algemene informatie"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Berichtenvlag voor verbindingen"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Berichtenvlag voor DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Berichtenvlag voor trackerinformatie"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Berichtenvlag voor I/O-informatie harde schijf"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Berichtenvlag voor IP-filter plugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Berichtenvlag voor zoekplugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Berichtenvlag voor importplugin gedeeltelijke bestanden"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Berichtenvlag voor Infowidgetplugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Berichtenvlag voor UPnP-plugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Berichtenvlag voor mapdetectieplugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Berichtenvlag voor plannerplugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Berichtenvlag voor RSS-plugin"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Berichtenvlag voor webinterfaceplugin"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Instellingen logweergave"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Plugins"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Alles"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Afluistermeldingen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Opmerkingen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Belangrijk"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Geen"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Zoeken:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Mapdetectie:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Planner:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Download importeren:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Infowidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-plugin:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Webinterface:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Systeem"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Algemeen:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Verbindingen:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Schijf I/O:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Opgemaakte te&kst in logvenster tonen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Externe webbrowser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Open zoekresultaten in e&xterne webbrowser"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Standaard browser gebruiken"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Pad naar aangepaste browser:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Zoekmachines"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Naam zoekmachine:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Toevoegen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Machines"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL-adres"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "All&es verwijderen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Standaard &toevoegen"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Bijwerken vanaf internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Zoeken"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Zoekmachine:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Huidige zoekmachine"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Niet-standaard browser gebruiken"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Uitvoerbaar pad naar aangepaste browser"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dag \n"
+"%n dagen "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Ja, als eerst"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Ja, als laatst"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Kan logbestand %1 niet openen: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Kan niet schrijven naar %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Kan niet lezen van %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Kan map %1 niet aanmaken: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Kan de symbolische koppeling van %1 naar %2 niet aanmaken: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Kan %1 niet verplaatsen naar %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Kan %1 niet kopiëren naar %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Kan %1 niet verwijderen: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Kan %1 niet aanmaken: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Kan de bestandsgrootte van %1 niet berekenen: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Kan de bestandsgrootte niet berekenen: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Kan %1 niet openen: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Kan geen gegevens toevoegen aan bestand: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Kan geen gegevens aan het bestand toevoegen"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Kan niet zoeken in bestand: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Kan niet voorbij het einde van de mmap-buffer schrijven!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Status: <b>%2</b><br>Auteur: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Geladen"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Ongeladen"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Plugins beheren"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Kan bestand %1 niet openen: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "De map %1 bestaat niet"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Ongeldig woord: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Decodeerfout"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Onverwacht einde van invoer"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Kan %1 niet converteren naar een integer"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent is incompleet!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrent is beschadigd!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrent mist invoervelden voor aankondigingen of nodes"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Niet in staat torrent-bestand %1 te openen: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Ontleedfout"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Er deed zich een fout voor tijdens het laden van de torrent. De torrent is "
+"waarschijnlijk beschadigd of is geen geldig torrent-bestand.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Er deed zich een fout voor tijdens het laden van de torrent. De torrent is "
+"waarschijnlijk beschadigd of is geen geldig torrent-bestand."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Niet in staat %1 aan te maken: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"De torrent %1 wordt op het moment al gedownload, de lijst met trackers van "
+"beide torrents zijn nu samengevoegd."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "De torrent %1 wordt op het moment al gedownload"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Kan %1 niet migreren: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"De torrent %1 is ooit gestart met een vorige versie van KTorrent. Om te "
+"garanderen dat deze torrent samenwerkt met de huidige versie van KTorrent, zal "
+"de torrent eerst worden omgezet. \n"
+"U zult opnieuw gevraagd worden waar de torrent opgeslagen dient te worden. Als "
+"u kiest voor annuleren, zal uw persoonlijke map geselecteerd worden."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Selecteer een map om gegevens te bewaren"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Niet gestart"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Uploaden"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Downloaden"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Onderbroken"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Gestopt"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Fout: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Schijfruimte toewijzen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Wachtrij"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Gegevens controleren"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Gestopt. Geen schijfruimte over op apparaat."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Er is onvoldoende schijfruimte aanwezig om deze torrent te downloaden. Weet u "
+"zeker dat u wilt doorgaan?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Onvoldoende schijfruimte voor %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" heeft zijn ingestelde deelverhouding al bereikt. Wilt u de "
+"limiet negeren en verdergaan met uploaden?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Maximum ingestelde deelverhouding is bereikt."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Fout bij het stoppen van torrent %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Fout bij het starten van torrent %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Aankondigen"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Onbekende client"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 peer\n"
+"%n peers"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Kan het bestand %1 niet aanmaken: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Kan de eerste chunk niet wegschrijven naar het DND-bestand: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Kan de laatste chunk niet wegschrijven naar het DND-bestand: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Kan %1 niet openen om weg te schrijven: alleen-lezen bestandssysteem."
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Kan geen gegevens toevoegen aan bestand %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Kan geen gegevens aan het bestand %1 toevoegen: incomplete schrijving"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Kan geen gegevens aan het bestand %1 toevoegen"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Fout: Lezen buiten het bereik van bestand %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Fout bij het lezen van %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Fout bij het schrijven naar %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Fout bij het schrijven naar %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Kan geen schijfruimte toewijzen: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Kan niet aan UDP-poort %1 of één van de 10 volgende poorten binden."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Ongeldig antwoord van tracker"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Onjuiste gegevens verkregen van tracker"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Ongeldig URL-adres voor tracker"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Kan bestand %1 niet openen: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Kan indexbestand %1 niet aanmaken"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Kan bestand %1 niet openen: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Gebruikt UPnP om poorten automatisch door te sturen vanaf de router"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Kan geen voorziening voor poortdoorsturing in de apparaatomschrijving vinden!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP-apparaten"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Detecteert en laadt automatisch torrent-bestanden vanuit een ingestelde map."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Map doorzoeken"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Mapdetectie"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Instellingen mapdetectie"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "geladen"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Mapdetectie - Map %1: Ongeldig URL-adres of map bestaat niet. Voer a.u.b. een "
+"geldige map in."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Webinterface"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Instellingen webinterface"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Het programma php staat niet in het standaardzoekpad. Voer het pad naar het "
+"programma handmatig in."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Voer een nieuw wachtwoord in voor uw webinterface-login."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 bestaat en is uitvoerbaar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 bestaat niet"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 is niet uitvoerbaar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 is een map"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 is geen pad naar het programma php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Webinterface"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+"Maakt het mogelijk KTorrent aan te sturen door middel van een webbrowser"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Als eerste downloaden"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Normaal downloaden"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Als laatste downloaden"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Bestand(en) verwijderen"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Beschikbaar"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "In behandeling"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Alle gegevens in dit bestand zullen verloren gaan. Weet u zeker dat u wilt "
+"doorgaan?\n"
+"Alle gegevens in deze bestanden zullen verloren gaan. Weet u zeker dat u wilt "
+"doorgaan?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Geen limiet"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Infowidget"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Toont extra informatie over een torrent. Zoals welke chunks zijn gedownload, "
+"het aantal seeders en leechers ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Er kan geen tracker worden toegevoegd aan een privé-torrent."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "De standaard tracker kan niet worden verwijderd."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Aan een privé-torrent kunnen geen trackers worden toegevoegd."
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Land"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Client"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Choked"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Snubbed"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Beschikbaarheid"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Score"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Uploadslot"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Verzoeken"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Peer kicken"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Peer bannen"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Beschikbare chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Niet-beschikbare chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Uitgesloten chunks"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Instellingen infowidget"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Binnengehaalde chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Binnen te halen chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Uitgesloten chunks"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Converteren"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Bezig met laden van tekstbestand..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Even geduld a.u.b..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Bestand is geconverteerd."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Kon filter niet laden: "
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Onjuist filterbestand. Het is mogelijk beschadigd of heeft een verkeerde "
+"indeling."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtert ongewilde peers aan de hand van het IP-adres."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP-filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: Geladen en in werking."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: Niet geladen."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Geen filterbestand aangetroffen.</font> "
+"Download en converteer filterbestand."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+"Het geselecteerde bestand is al aanwezig, wilt u het opnieuw downloaden?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Bestand bestaat"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Het filterbestand (level1.dat) is al aanwezig, wilt u het opnieuw converteren?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-blokfilter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Instellingen IP-blokfilter"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistieken"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Instellingen statistieken"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Leechers verbonden"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Leechers in zwerm"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Seeders verbonden"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Seeders in zwermen tonen"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Gemiddeld aantal verbonden leechers per torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Gemiddeld aantal verbonden seeders per torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Gemiddeld aantal verbonden leechers per draaiende torrent"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Gemiddeld aantal verbonden seeders per draaiende torrent"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Nodes"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Taken"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Geeft overdrachtstatistieken weer"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Snelheidsstatistieken"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Verbindingsstatistieken"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Huidige"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Gemiddeld"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Limiet"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Gemiddelde van leecher"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Gemiddelde naar leecher"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Gemiddelde van seeder"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Van leechers"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Van seeders"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent-bestanden"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Alle bestanden"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Kan gegevens niet controleren: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Kan torrent-bestand niet laden: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Importeert een gedeeltelijk of volledig afgeronde torrent, al dan niet gestart "
+"in een andere client"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Bestaande download importeren"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL van feed"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Filtert automatisch RSS-feeds door ze te doorzoeken op overeenkomende reguliere "
+"expressies."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS-feeds"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Kon geen geldige torrent vinden en downloaden voor %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Titel"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Omschrijving"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Koppeling"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Seizoen"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episode"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tijd"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Planner"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Instellingen bandbreedteplanner"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "ma"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "di"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "wo"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "do"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "vr"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "za"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "zo"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Planning opgeslagen."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Bestand werd niet aangetroffen."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Planning geladen."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Bandbreedteplannerplugin"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Bandbreedteplanning openen"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"De bandbreedteplanner is niet geactiveerd. Ga naar Instellingen -> "
+"KTorrent instellen -> Planner - om het te activeren."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Logweergave"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Logweergave"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Geeft KTorrent's loguitvoer weer"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Gebruik uw webbrowser om te zoeken naar de tekst %1 (hoofdletters) met de "
+"zoekmachine die u wilt toevoegen."
+"<br> Kopieer daarna het URL-adres uit de locatiebalk en plak deze hier als "
+"URL-adres voor de nieuwe zoekmachine."
+"<br>"
+"<br>Bijvoorbeeld, zoeken naar %1 met Google resulteert in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> Als u dit URL-adres hier toevoegt, kan KTorrent met Google zoeken."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Gebruik uw webbrowser om naar de string %1 (hoofdletters) te zoeken op de "
+"zoekmachine die u wilt toevoegen. Gebruik de resulterende URL beneden."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Voer eerst de naam en het URL-adres van de zoekmachine in."
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Er is reeds een zoekmachine met deze naam aanwezig. Voer een andere naam in."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Onjuist URL-adres. U dient te zoeken naar de term FOOBAR met uw webbrowser, en "
+"daarna het exacte URL-adres hier naartoe te kopiëren."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Zoeken"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Instellingen zoekmachine"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Zoeken naar %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent-bestanden"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Zoekopdracht voltooid"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr "Machine:"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Zoek naar torrent-bestanden op verschillende populaire zoekmachines"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Wilt u de torrent downloaden of opslaan?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Torrent downloaden"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Downloaden"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Zoekt andere computers die ktorrent op het lokale netwerk draaien om torrents "
+"mee te delen."
diff --git a/translations/pa/Makefile.am b/translations/pa/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/pa/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/pa/messages/Makefile.am b/translations/pa/messages/Makefile.am
new file mode 100644
index 0000000..944337a
--- /dev/null
+++ b/translations/pa/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = pa
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/pa/messages/ktorrent.po b/translations/pa/messages/ktorrent.po
new file mode 100644
index 0000000..2ff8d52
--- /dev/null
+++ b/translations/pa/messages/ktorrent.po
@@ -0,0 +1,5079 @@
+# translation of ktorrent.po to Panjabi
+# translation of ktorrent.po to Punjabi
+# Amanpreet Singh Alam <aalam@redhat.com>, 2005.
+# Amanpreet Singh Alam <amanpreetalam@yahoo.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2005-10-30 12:32+0530\n"
+"Last-Translator: Amanpreet Singh Alam <amanpreetalam@yahoo.com>\n"
+"Language-Team: Punjabi <fedora-trans-pa@redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, fuzzy, no-c-format
+msgid "Info"
+msgstr "ਨਹੀਂ"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+#, fuzzy
+msgid "Set max upload rate"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਪਲੋਡ ਦਰ:"
+
+#: apps/ktorrent/ktorrent.cpp:574
+#, fuzzy
+msgid "Set max download rate"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਪਲੋਡ ਦਰ"
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "Torrent Files"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "ਟਿਕਾਣਾ ਖੋਲੋ"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "ਟੋਰੈਂਟ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਇੱਕ ਫਾਇਲ ਚੁਣੋ"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "ਅੱਪਲੋਡ"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "ਟੋਰੈਂਟ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Recreate"
+msgstr "ਬਣਾਓ(&a)"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "ਬਣਾਓ(&a)"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "ਬੇਅੰਤ"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "ਕੇਡੀਈ ਲਈ ਬਿੱਟਟੋਰੈਂਟ ਹੈ"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "ਡੀਬੱਗ ਢੰਗ"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "ਖੋਲਣ ਲਈ ਦਸਤਾਵੇਜ਼"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:131
+#, fuzzy
+msgid "The downloads icon"
+msgstr "ਡਾਊਨਲੋਡ ਚੋਣ"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+#, fuzzy
+msgid "You must select a file or a folder."
+msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਫਾਇਲ ਜਾਂ ਡਾਇਰੈਕਟਰੀ ਦੀ ਚੋਣ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ।"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਟਰੈਕਰ ਜੋੜਨਾ ਚਾਹੀਦਾ ਹੈ।"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+#, fuzzy
+msgid "Torrent Files (*.torrent)"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+#, fuzzy
+msgid "Choose File to Save Torrent"
+msgstr "ਟੋਰੈਂਟ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਇੱਕ ਫਾਇਲ ਚੁਣੋ"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+#, fuzzy
+msgid "Creating %1..."
+msgstr "%1 ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "ਨਾਂ"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "ਟਰੈਕਰ"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "ਅੱਪਲੋਡ"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "ਡਾਊਨਲੋਡ ਚੋਣ"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "ਅੱਪਲੋਡ"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਓ"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "ਅੱਪਲੋਡ"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਓ"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਓ"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "ਜਾਰੀ ਪੀਅਰ"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "ਡਾਊਨਲੋਡ ਚੋਣ"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "ਡਾਊਨਲੋਡ ਚੋਣ"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, fuzzy, no-c-format
+msgid "General Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "ਸਥਿਤੀ"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+#, fuzzy
+msgid "Downloaded"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "ਅੱਪਲੋਡ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "ਡਾਊਨ ਗਤੀ"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "ਉੱਪਰ ਗਤੀ"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "ਬਾਕੀ ਸਮਾਂ"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "ਪੀਅਰ"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "ਪੀਅਰ"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% ਮੁਕੰਮਲ"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "ਬਾਕੀ ਸਮਾਂ"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:378
+#, fuzzy
+msgid "Remove Download"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "ਕੀ ਤੁਸੀਂ ਟੋਰੈਂਟ ਡਾਊਨਲੋਡ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "ਡਾਊਨਲੋਡ ਚੋਣ"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਓ"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+#, fuzzy
+msgid "Download completed"
+msgstr "ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr ""
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+#, fuzzy
+msgid "Cannot open index file %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "ਅਮਨਪਰੀਤ ਸਿੰਘ ਆਲਮ"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "aalam@redhat.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਓ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, fuzzy, no-c-format
+msgid "Download"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "ਆਰਜ਼ੀ ਫਾਇਲਾਂ ਸੰਭਾਲਣ ਲਈ ਡਾਇਰੈਕਟਰੀ"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, fuzzy, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "ਡਾਊਨਲੋਡ ਸਵੈ-ਚਾਲਤ ਹੀ ਏਥੇ ਸੰਭਾਲੋ(&A)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "ਡਾਊਨਲੋਡ ਸੰਦ-ਪੱਟੀ"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਪਲੋਡ ਦਰ:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਪਲੋਡ ਦਰ"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "ਕਿਬਾ/ਸਕਿੰਟ (ਬਿਨਾਂ ਸੀਮਾ ਲਈ 0)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "ਪੋਰਟ:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, fuzzy, no-c-format
+msgid "Banned Peers"
+msgstr "ਜਾਰੀ ਪੀਅਰ"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, fuzzy, no-c-format
+msgid "Maximum seeds:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "ਚਾਲੂ ਨਹੀਂ ਹੋਇਆ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "ਚਾਲੂ ਨਹੀਂ ਹੋਇਆ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(ਬਿਨਾਂ ਸੀਮਾ ਲਈ 0 )"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Maximum download rate:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਪਲੋਡ ਦਰ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, fuzzy, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "ਪ੍ਰਤੀ ਡਾਊਨਲੋਡ ਵੱਧ ਤੋਂ ਵੱਧ ਕੁਨੈਕਸ਼ਨ:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "UDP tracker port:"
+msgstr "ਟਰੈਕਰ ਮੰਗ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਅੱਪਲੋਡ ਦਰ:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "ਕਿਬਾ/ਸਕਿੰਟ (ਬਿਨਾਂ ਸੀਮਾ ਲਈ 0)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(ਬਿਨਾਂ ਸੀਮਾ ਲਈ 0 )"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, fuzzy, no-c-format
+msgid "Status:"
+msgstr "ਸਥਿਤੀ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, fuzzy, no-c-format
+msgid "Tracker:"
+msgstr "ਟਰੈਕਰ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, fuzzy, no-c-format
+msgid "Torrent"
+msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "ਅੱਪਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "ਅੱਪਲੋਡ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, fuzzy, no-c-format
+msgid "C&ancel"
+msgstr "ਰੱਦ ਕਰੋ(&n)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, fuzzy, no-c-format
+msgid "Create Torrent"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਓ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, fuzzy, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਉਣ ਲਈ ਬਣਾਈ ਜਾਣ ਵਾਲੀ ਫਾਇਲ ਜਾਂ ਡਾਇਰੈਕਟਰੀ ਦਾ ਨਾਂ:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਟਰੈਕਰ ਜੋੜਨਾ ਚਾਹੀਦਾ ਹੈ।"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "File Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, fuzzy, no-c-format
+msgid "Size of each chunk:"
+msgstr "ਹਰ ਚਕ ਦਾ ਅਕਾਰ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "ਕਿਬਾ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, fuzzy, no-c-format
+msgid "Comments:"
+msgstr "ਟਿੱਪਣੀਆਂ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "ਬਣਾਓ(&a)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "ਰੱਦ ਕਰੋ(&n)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, fuzzy, no-c-format
+msgid "Trackers"
+msgstr "ਟਰੈਕਰ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "ਨਾਂ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "ਪੋਰਟ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "ਪ੍ਰਤੀ ਡਾਊਨਲੋਡ ਵੱਧੋ-ਵੱਧ ਕੁਨੈਕਸ਼ਨ ਦੀ ਗਿਣਤੀ (0= ਬੇਅੰਤ)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "ਟਰੈਕਰ ਮੰਗ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ (0 = ਕੋਈ ਸੀਮਾ ਨਹੀਂ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, fuzzy, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ (0 = ਕੋਈ ਸੀਮਾ ਨਹੀਂ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, fuzzy, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "ਪ੍ਰਤੀ ਡਾਊਨਲੋਡ ਵੱਧੋ-ਵੱਧ ਕੁਨੈਕਸ਼ਨ ਦੀ ਗਿਣਤੀ (0= ਬੇਅੰਤ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, fuzzy, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "ਪ੍ਰਤੀ ਡਾਊਨਲੋਡ ਵੱਧੋ-ਵੱਧ ਕੁਨੈਕਸ਼ਨ ਦੀ ਗਿਣਤੀ (0= ਬੇਅੰਤ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "ਕਿਬ/ਸਕਿੰਟ 'ਚ ਡਾਊਨਲੋਡ ਦੀ ਵੱਧ ਤੋਂ ਵੱਧ ਗਤੀ (0 = ਕੋਈ ਸੀਮਾ ਨਹੀਂ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, fuzzy, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ ਗਤੀ (0 = ਕੋਈ ਸੀਮਾ ਨਹੀਂ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ (0 = ਕੋਈ ਸੀਮਾ ਨਹੀਂ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ (0 = ਕੋਈ ਸੀਮਾ ਨਹੀਂ)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files"
+msgstr "ਆਰਜ਼ੀ ਫਾਇਲਾਂ ਸੰਭਾਲਣ ਲਈ ਡਾਇਰੈਕਟਰੀ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, fuzzy, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "ਡਾਊਨਲੋਡ ਸਵੈ-ਚਾਲਤ ਹੀ ਏਥੇ ਸੰਭਾਲੋ(&A)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, fuzzy, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "ਡਾਊਨਲੋਡ ਫਾਇਲਾਂ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਡਾਇਰੈਕਟਰੀ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "ਡਾਊਨਲੋਡ ਸਵੈ-ਚਾਲਤ ਹੀ ਏਥੇ ਸੰਭਾਲੋ(&A)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "ਡਾਊਨਲੋਡ ਫਾਇਲਾਂ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਡਾਇਰੈਕਟਰੀ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "ਡਾਊਨਲੋਡ ਸਵੈ-ਚਾਲਤ ਹੀ ਏਥੇ ਸੰਭਾਲੋ(&A)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "ਆਰਜ਼ੀ ਫਾਇਲਾਂ ਸੰਭਾਲਣ ਲਈ ਡਾਇਰੈਕਟਰੀ"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, fuzzy, no-c-format
+msgid "U&nload"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, fuzzy, no-c-format
+msgid "Ports Forwarded"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, fuzzy, no-c-format
+msgid "Alt+1"
+msgstr "Alt+Y"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, fuzzy, no-c-format
+msgid "Alt+2"
+msgstr "Alt+Y"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, fuzzy, no-c-format
+msgid "Alt+3"
+msgstr "Alt+Y"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, fuzzy, no-c-format
+msgid "Search Preferences"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, fuzzy, no-c-format
+msgid "Chunks"
+msgstr "ਚਕ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, fuzzy, no-c-format
+msgid "Currently downloading:"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, fuzzy, no-c-format
+msgid "Downloaded:"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, fuzzy, no-c-format
+msgid "Excluded:"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "ਚਕ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "ਤਰੱਕੀ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "ਜਾਰੀ ਪੀਅਰ"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, fuzzy, no-c-format
+msgid "Seeders:"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, fuzzy, no-c-format
+msgid "Average Down Speed:"
+msgstr "ਡਾਊਨ ਗਤੀ"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, fuzzy, no-c-format
+msgid "Average Up Speed:"
+msgstr "ਉੱਪਰ ਗਤੀ"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "ਟਰੈਕਰ"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "ਟਰੈਕਰ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "ਟਰੈਕਰ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "ਟਰੈਕਰ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "ਟਰੈਕਰ"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, fuzzy, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, fuzzy, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, fuzzy, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "ਡਾਊਨਲੋਡ ਸੰਦ-ਪੱਟੀ"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, fuzzy, no-c-format
+msgid "Converting..."
+msgstr "%1 ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "ਵੱਧ ਤੋਂ ਵੱਧ ਡਾਊਨਲੋਡ:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "ਅੱਪਲੋਡ"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "ਡਾਊਨਲੋਡ ਸੰਦ-ਪੱਟੀ"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "ਤਰੱਕੀ"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, fuzzy, no-c-format
+msgid "upload:"
+msgstr "ਅੱਪਲੋਡ"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, fuzzy, no-c-format
+msgid "* zero means no limit"
+msgstr "(ਬਿਨਾਂ ਸੀਮਾ ਲਈ 0 )"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, fuzzy, no-c-format
+msgid "Debug"
+msgstr "ਡੀਬੱਗ ਢੰਗ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, fuzzy, no-c-format
+msgid "Search:"
+msgstr "ਖੋਜ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, fuzzy, no-c-format
+msgid "Scheduler:"
+msgstr "ਪੀਅਰ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, fuzzy, no-c-format
+msgid "General:"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, fuzzy, no-c-format
+msgid "Search Engines"
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, fuzzy, no-c-format
+msgid "Search engine name:"
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "ਖੋਜ"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, fuzzy, no-c-format
+msgid "Search engine:"
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, fuzzy, no-c-format
+msgid "Current search engine"
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 ਗੈਬਾ"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 ਮੈਬਾ"
+
+#: libktorrent/interfaces/functions.cpp:39
+#, fuzzy
+msgid "%1 KB"
+msgstr "%1 ਗੈਬਾ"
+
+#: libktorrent/interfaces/functions.cpp:41
+#, fuzzy
+msgid "%1 B"
+msgstr "%1 ਮੈਬਾ"
+
+#: libktorrent/interfaces/functions.cpp:47
+#, fuzzy
+msgid "%1 KB/s"
+msgstr "%1 ਕਿਬਾ/ਸਕਿੰਟ"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+#, fuzzy
+msgid "Cannot open log file %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/util/file.cpp:87
+#, fuzzy
+msgid "Cannot write to %1 : %2"
+msgstr "ਟੋਰੈਂਟ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %1"
+
+#: libktorrent/util/file.cpp:101
+#, fuzzy, c-format
+msgid "Cannot read from %1"
+msgstr "ਟੋਰੈਂਟ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "ਡਾਇਰੈਕਟਰੀ %1 ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr ""
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "%1 ਨੂੰ %2 ਲਈ ਭੇਜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "%1 ਨੂੰ %2 ਲਈ ਨਕਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "%1 ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ : %2"
+
+#: libktorrent/util/fileops.cpp:251
+#, fuzzy
+msgid "Cannot create %1: %2"
+msgstr "%1 ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ : %2"
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+#, fuzzy
+msgid "Cannot open %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Loaded"
+msgstr "ਅੱਪਲੋਡ"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Not loaded"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+#, fuzzy
+msgid "Plugin Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+#, fuzzy
+msgid "Cannot open file %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+#, fuzzy
+msgid "Cannot convert %1 to an int"
+msgstr "%1 ਨੂੰ %2 ਲਈ ਭੇਜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ: %3"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+#, fuzzy
+msgid "Torrent is incomplete!"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+#, fuzzy
+msgid "Corrupted torrent!"
+msgstr "ਇੱਕ ਟੋਰੈਂਟ ਬਣਾਓ"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+#, fuzzy
+msgid " Unable to open torrent file %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "ਕੀ ਤੁਸੀਂ ਟੋਰੈਂਟ ਡਾਊਨਲੋਡ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+#, fuzzy
+msgid "Cannot migrate %1 : %2"
+msgstr "%1 ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+#, fuzzy
+msgid "Select Folder to Save To"
+msgstr "ਸੰਭਾਲਣ ਲਈ ਡਾਇਰੈਕਟਰੀ ਚੁਣੋ"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "ਚਾਲੂ ਨਹੀਂ ਹੋਇਆ"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "ਡਾਊਨਲੋਡ ਜਾਰੀ ਹੈ"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "ਸਥਾਪਤ"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+#, fuzzy
+msgid "Error stopping torrent %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+#, fuzzy
+msgid "Error starting torrent %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr ""
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "%1 ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, fuzzy, c-format
+msgid "Error reading from %1"
+msgstr "ਟੋਰੈਂਟ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+#, fuzzy
+msgid "Error writing to %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, fuzzy, c-format
+msgid "Error writing to %1"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "ਟਰੈਕਰ"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+#, fuzzy
+msgid "Cannot open file : %1 : %2"
+msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+#, fuzzy
+msgid "loaded"
+msgstr "ਅੱਪਲੋਡ"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ"
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "(ਬਿਨਾਂ ਸੀਮਾ ਲਈ 0 )"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "ਟੋਰੈਂਟ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %1"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "ਚੋਕ"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "ਅੱਪਲੋਡ"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+#, fuzzy
+msgid "Status: Not loaded."
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+#, fuzzy
+msgid "File Exists"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter"
+msgstr "ਮੇਰੀ ਪਸੰਦ"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter Options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "ਸਥਿਤੀ"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "ਪੀਅਰ"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਆਈਕਾਨ ਵੇਖਾਓ(&y)"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "ਪ੍ਰਤੀ ਡਾਊਨਲੋਡ ਵੱਧ ਤੋਂ ਵੱਧ ਕੁਨੈਕਸ਼ਨ:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "ਪ੍ਰਤੀ ਡਾਊਨਲੋਡ ਵੱਧ ਤੋਂ ਵੱਧ ਕੁਨੈਕਸ਼ਨ:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "ਨਾਂ"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "ਟਰੈਕਰ"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "(ਬਿਨਾਂ ਸੀਮਾ ਲਈ 0 )"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "ਡਾਊਨ ਗਤੀ"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "ਡਾਊਨ ਗਤੀ"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "ਡਾਊਨ ਗਤੀ"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "ਪੀਅਰ"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "ਪੀਅਰ"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "Torrent files"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "%1 ਨੂੰ ਹਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ : %2"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, fuzzy, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "ਟੋਰੈਂਟ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr ""
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "ਬਾਕੀ ਸਮਾਂ"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "ਫਾਇਲ ਚੋਣ"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+#, fuzzy
+msgid "You must enter the search engine's name and URL"
+msgstr "ਤੁਹਾਨੂੰ ਨਾਂ ਖੇਤਰ ਭਰਨਾ ਪਵੇਗਾ।"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+#, fuzzy
+msgid "Search Engine Options"
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "%1 ਲਈ ਖੋਜ ਜਾਰੀ ਹੈ ..."
+
+#: plugins/search/searchwidget.cpp:209
+#, fuzzy
+msgid "torrent files"
+msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#: plugins/search/searchwidget.cpp:267
+#, fuzzy
+msgid "Search finished"
+msgstr "ਮੁਕੰਮਲ"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+#, fuzzy
+msgid "Do you want to download or save the torrent?"
+msgstr "ਕੀ ਤੁਸੀਂ ਟੋਰੈਂਟ ਡਾਊਨਲੋਡ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: plugins/search/htmlpart.cpp:166
+#, fuzzy
+msgid "Download Torrent"
+msgstr "ਡਾਊਨਲੋਡ ਸੰਦ-ਪੱਟੀ"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "ਟੋਰੈਂਟ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕਦੀ: %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "ਟਰੈਕਰ"
+
+#, fuzzy
+#~ msgid "Alt+N"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+Y"
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਟਰੈਕਰ ਜੋੜਨਾ ਚਾਹੀਦਾ ਹੈ।"
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "ਡਾਊਨਲੋਡ"
+
+#, fuzzy
+#~ msgid "Alt+K"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Alt+U"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Alt+A"
+#~ msgstr "Alt+Y"
+
+#~ msgid "Form1"
+#~ msgstr "Form1"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Form2"
+#~ msgstr "Form1"
+
+#, fuzzy
+#~ msgid "Name"
+#~ msgstr "ਨਾਂ"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ"
+
+#, fuzzy
+#~ msgid "Tracker URL:"
+#~ msgstr "ਟਰੈਕਰ"
+
+#, fuzzy
+#~ msgid "Tracker status:"
+#~ msgstr "ਟਰੈਕਰ"
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "ਸੰਭਾਲਣ ਲਈ ਡਾਇਰੈਕਟਰੀ ਚੁਣੋ"
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "ਡਾਊਨਲੋਡ"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "ਅੱਪਲੋਡ"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "ਕੇ-ਟੋਰੈਂਟ"
+
+#, fuzzy
+#~ msgid "Tracker"
+#~ msgstr "ਟਰੈਕਰ"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "ਸਥਿਤੀ"
+
+#, fuzzy
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Tracker request timed out"
+#~ msgstr "ਟਰੈਕਰ"
+
+#, fuzzy
+#~ msgid "Alt+G"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+Y"
+
+#~ msgid "finished"
+#~ msgstr "ਮੁਕੰਮਲ"
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "ਡਾਊਨਲੋਡ ਮੁਕੰਮਲ"
+
+#, fuzzy
+#~ msgid "Completed"
+#~ msgstr "% ਮੁਕੰਮਲ"
+
+#, fuzzy
+#~ msgid "Alt+C"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "ਖੋਜ"
+
+#, fuzzy
+#~ msgid "Alt+O"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "ਟੋਰੈਂਟ ਫਾਇਲਾਂ (*.torrent)"
+
+#~ msgid "You must fill in the name field."
+#~ msgstr "ਤੁਹਾਨੂੰ ਨਾਂ ਖੇਤਰ ਭਰਨਾ ਪਵੇਗਾ।"
+
+#, fuzzy
+#~ msgid "Alt+R"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Down:"
+#~ msgstr "ਡਾਊਨਲੋਡ"
+
+#, fuzzy
+#~ msgid "KTorrent's UPnP plugin"
+#~ msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#, fuzzy
+#~ msgid "KTorrent's IP filter plugin"
+#~ msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#, fuzzy
+#~ msgid "KTorrent's log viewer plugin"
+#~ msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#, fuzzy
+#~ msgid "KTorrent's search plugin"
+#~ msgstr "ਟੋਰੈਂਟ ਖੋਜ ਇੰਜਣ"
+
+#, fuzzy
+#~ msgid "Alt+Q"
+#~ msgstr "Alt+Y"
+
+#, fuzzy
+#~ msgid "Downlo&ad"
+#~ msgstr "ਡਾਊਨਲੋਡ"
+
+#, fuzzy
+#~ msgid "&Seed"
+#~ msgstr "ਉੱਪਰ ਗਤੀ"
+
+#, fuzzy
+#~ msgid "Alt+E"
+#~ msgstr "Alt+Y"
+
+#~ msgid "yes"
+#~ msgstr "ਹਾਂ"
+
+#~ msgid "no"
+#~ msgstr "ਨਹੀਂ"
+
+#, fuzzy
+#~ msgid "Cannot preallocate diskspace : %s"
+#~ msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#, fuzzy
+#~ msgid "&Status"
+#~ msgstr "ਸਥਿਤੀ"
+
+#, fuzzy
+#~ msgid "Unable to open cache file: %1"
+#~ msgstr "ਫਾਇਲ %1 ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ: %2"
+
+#, fuzzy
+#~ msgid "You must add a least one tracker."
+#~ msgstr "ਤੁਹਾਨੂੰ ਘੱਟੋ-ਘੱਟ ਇੱਕ ਟਰੈਕਰ ਜੋੜਨਾ ਚਾਹੀਦਾ ਹੈ।"
+
+#, fuzzy
+#~ msgid "Can't open index file"
+#~ msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
+
+#, fuzzy
+#~ msgid "Can't save chunk_info file : %1"
+#~ msgstr "ਇੱਕ ਤਤਕਰਾ ਫਾਇਲ ਬਣਾਈ ਜਾ ਰਹੀ ਹੈ: %1"
diff --git a/translations/pl/Makefile.am b/translations/pl/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/pl/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/pl/messages/Makefile.am b/translations/pl/messages/Makefile.am
new file mode 100644
index 0000000..498aaef
--- /dev/null
+++ b/translations/pl/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = pl
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/pl/messages/ktorrent.po b/translations/pl/messages/ktorrent.po
new file mode 100644
index 0000000..00eb11e
--- /dev/null
+++ b/translations/pl/messages/ktorrent.po
@@ -0,0 +1,4929 @@
+# translation of ktorrent-svn-707193.po to Polish
+#
+# Krzysztof Lichota <lichota@mimuw.edu.pl>, 2005, 2006, 2007.
+# Marcin Zasada <emzeta76@gazeta.pl>, 2005, 2006.
+# Jerzy Trzeciak <artusek@wp.pl>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent-svn-707193\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-09-03 13:54+0200\n"
+"Last-Translator: Jerzy Trzeciak <artusek@wp.pl>\n"
+"Language-Team: Polish <pl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Brak połączeń przychodzących (przypuszczalnie za zaporą sieciową)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informacja"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Dane przesłane w bieżącej sesji"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Aktualna szybkość wszystkich torrentów"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupy"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Uruchom"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Zatrzymaj"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Uruchom wszystko"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Zatrzymaj wszystko"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Wklej URL torrenta..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Otwórz menedżera kolejki..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Włącz/Wyłącz kolejkowanie"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Filtr IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Sprawdź poprawność danych"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Maksymalna szybkość wysyłania"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Maksymalna szybkość pobierania"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Pliki torrenta"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Wszystkie pliki"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Otwórz lokalizację"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Szybkość pob.: %1 / wys.: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Pobrano: %1 / wysłano: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: liczba węzłów: %1, zadania: %2"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: wyłączone"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Wszystkie torrenty"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Zadokuj z lewej strony"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Zadokuj z prawej strony"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Zadokuj na dole"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Przypisz skrót..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Usuń skrót"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Zmień numer przycisku"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nowy numer skrótu:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Podaj adres IP w formacie 'XXX.XXX.XXX.XXX'. Można użyć \"*\" do zakresu "
+"adresów, np.: '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Wybierz plik"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Wybierz nazwę pliku"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Nieprawidłowy URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Pobierane"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Wysyłane"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Podany port (%1) jest niedostępny lub używany przez inny program. KTorrent "
+"używa portu %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent nie może ustanowić połączenia, ponieważ porty od %1 do %2 są używane "
+"przez inny program."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Nie można utworzyć torrenta: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Brakuje niektórych plików torrenta \"%1\". Czy chcesz je utworzyć ponownie, czy "
+"pominąć ich pobieranie?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Utwórz ponownie"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Nie pobieraj"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Nie można utworzyć ponownie brakujących plików: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Brakuje plików z danymi"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Nie można odznaczyć brakujących plików: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Brakuje pliku z danymi dla torrenta \"%1\". Czy chcesz go utworzyć ponownie?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Utwórz ponownie"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Nie można utworzyć ponownie pliku danych: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Brak pliku z danymi"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Sprawdzanie poprawności danych"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "nieskończoność"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Błąd skanowania danych: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Skanowanie danych <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Program BitTorrent dla KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Tryb debugowania"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokument do otwarcia"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Wtyczka RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Wtyczka interfejsu WWW"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Wtyczka statystyk"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Ikona programu i kilka innych"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Ikona pobrań"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 Ikona programu"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Dymek do ChunkBar i sortowanie IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Lokalizator państw dla wtyczki Okno informacyjne (zawiera dane z GeoLite, "
+"utworzone przez MaxMind, dostępne z http://maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Flagi narodowe"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Priorytetyzacja pliku"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Wykorzystano Miniupnp jako przykład naszej implementacji UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Implementacja całkowitego maksymalnego współczynnika udziału"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Ulepszenia Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Interfejs Coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Kod IDEAl z KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Poprawki szybkości konwersji we wtyczce Filtr IP"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Wykryte dwa zagrożenia bezpieczeństwa (zostały naprawione)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Poprawka dla wczytywania bez potwierdzenia z lokalizacją zapisu"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Poprawki kodu PHP dla interfejsu WWW"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Wstępna alokacja przestrzeni dyskowej dla systemu plików XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Poprawka zapobiegająca wyświetleniu bardzo małych szybkości"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Poprawka pokazująca czy program jest za zaporą sieciową"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Szereg poprawek"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Szereg poprawek"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Dopasowania filtra"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Poprawka dla wczytywania bez potwierdzenia z lokalizacją zapisu"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Musisz wybrać plik lub katalog."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "Tracker nie został dodany. Czy na pewno chcesz utworzyć ten torrent?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Musisz dodać przynajmniej jeden węzeł sieciowy (adres)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Pliki torrenta (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Wybierz plik do zapisu torrenta"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Tworzenie %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Własne grupy"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nowa grupa"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Zmień nazwę"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Usuń grupę"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Otwórz zakładkę"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Proszę podać nazwę grupy."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Grupa %1 już istnieje."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Proszę podać nową nazwę grupy."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktywne wysyłania"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "W kolejce do wysłania"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "W kolejce do pobrania"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Pobierane przez użytkownika"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Wysyłane przez użytkownika"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Nieaktywne torrenty"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Nieaktywne pobierania"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Nieaktywne wysyłania"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktywne torrenty"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktywne pobierania"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Usuń plik torrenta"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Usuń plik torrenta i pobrane pliki"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Dodaj partnerów"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Dodatkowe źródła partnerów"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Źródła partnerów:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Wymiana partnerów"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Ręczna aktualizacja"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Podgląd"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Otwórz katalog"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Katalog danych"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Katalog tymczasowy"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Wybierz lokalizację dla pobierania"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Usuń z grupy"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Dodaj do grupy"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Ustawienia szybkości"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Torrent nie istnieje. Zgłoś błąd autorom Ktorrenta."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Dodano potencjalnego partnera."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Nieprawidłowy format adresu URL."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Ustawienia"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opcje pobierania"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "Port DHT musi być inny niż port UDP trackera!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Ogólne"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opcje ogólne"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Nie można odnaleźć %1 : %2\n"
+"Proszę podać prawidłowy adres IP lub nazwę komputera."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Zaawansowane"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Ustawienia zaawansowane"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Widoczne kolumny"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Stan"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Pobrano"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Rozmiar"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Wysłano"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Szybk. pobierania"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Szybk. wysyłania"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Pozostało"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Rozsiewający"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Pijawki"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% pobrania"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Udział"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Czas pobierania"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Czas wysyłania"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Wszystkie torrenty %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Można uruchomić tylko jedno pobieranie, \n"
+"Można uruchomić tylko %n pobrania, \n"
+"Można uruchomić tylko %n pobrań, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"i 1 rozsiewający. \n"
+"i %n rozsiewających. \n"
+"i %n rozsiewających. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Jeśli chcesz zmienić limity, to przejdź do Ustawienia -> Konfiguracja Ktorrent"
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Torrent %1 nie zakończył pobierania. Czy chcesz również usunąć niekompletne "
+"dane ?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Usuń pobieranie"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Usuń dane"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Zachowaj dane"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Utracisz wszystkie pobrane dane. Czy na pewno chcesz to zrobić?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Już sprawdzasz pobrane dane torrenta %1 !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Wybierz lokalizację pobierania dla %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Odznaczono następujące istniejące pliki. Możesz utracić wszystkie dane. Czy na "
+"pewno chcesz to zrobić ?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Tak, usuń pliki"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nie, zachowaj pliki"
+
+# KL: chodzi o to, że jest o ileś bajtów wolnego miejsca na dysku za mało
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " za mało!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Użytkownik"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Menedżer kolejki"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nie (torrent prywatny)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Szybkość:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Pobieranie: <font color='#1c9a1c'>%1</font></td>"
+"<td>Wysyłanie: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Wielkość transferu:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Pobrano: <font color='#1c9a1c'>%3</font></td>"
+"<td>Wysłano: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> zakończył pobieranie.<br>Średnia prędkość: %2 Pob. / %3 Wys."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Zakończono pobieranie"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> osiągnął swój współczynnik udziału %2 i został zatrzymany."
+"<br>Wysłano %3 ze średnią szybkością %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Zakończono wysyłanie"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> osiągnął maksymalny czas wysyłania %2 godzin(y) i został zatrzymany."
+"<br>Wysłano %3 ze średnią szybkością %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> zostało zatrzymane przez następujący błąd: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Wykryto błędne dane w torrencie <b>%1</b>"
+"<br>Wskazane jest wykonać sprawdzenie poprawności danych torrenta."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> osiągnął maksymalny współczynnik udziału %2 i nie może być "
+"kolejkowany. Usuń limit, jeśli chcesz kontynuować wysyłanie."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> osiągnął maksymalny czas wysyłania %2 godzin(y) nie może być "
+"kolejkowany. Usuń limit, jeśli chcesz kontynuować wysyłanie."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torrent nie został dodany do kolejki."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Nie można uruchomić <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Można wysyłać co najwyżej 1 torrent. "
+"<br>\n"
+"Można wysyłać co najwyżej %n torrenty. "
+"<br>\n"
+"Można wysyłać co najwyżej %n torrentów. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Można pobierać co najwyżej 1 torrent. "
+"<br>\n"
+"Można pobierać co najwyżej %n torrenty. "
+"<br>\n"
+"Można pobierać co najwyżej %n torrentów. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Nie można uruchomić torrenta"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Za mało wolnego miejsca na dysku."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Nie ma wolnego miejsca na Twoim dysku.<br /><b>%1</b> jest pobierany do '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent został zatrzymany.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Brak wolnego miejsca w urządzeniu"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Szybkość w KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Nieograniczona"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Ustawienia szybkości dla <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Osadzalny program KPart"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "Test KTUPnP"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Nie można otworzyć pliku indeksującego %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+"Marcin Zasada, \n"
+"Jerzy Trzeciak"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"emzeta76@gazeta.pl, \n"
+"artusek@wp.pl"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Wybierz pliki, które chcesz pobrać"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Pobieraj do:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupa:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Sterowanie przez &użytkownika"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Uruchom torrenta"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Pobieranie"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Wybierz wszystko"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Usuń zaz&naczenie"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Odwróć zaznaczenie"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Wielkość dysku"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Wymagane miejsce na dysku:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Wolne miejsce na dysku:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Po pobraniu:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Szyfrowanie"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Zastosuj szyfrowanie protokołu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Szyfrowanie protokołu stosuje się, żeby uniknąć ograniczania szybkości połączeń "
+"torrentowych przez ISP (dostawców usług internetowych)."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Zezwól na połączenia nieszyfrowane"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Jeśli ta opcja jest wyłączona, będzie można się łączyć tylko z klientami "
+"stosującymi szyfrowanie."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Protokół rozproszonej tablicy mieszającej. Więcej informacji znajdziesz w "
+"podręczniku."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "Użyj &DHT, żeby znaleźć dodatkowych partnerów"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Port UDP dla DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Numer IP użytkownika"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+"Wysyłaj ustawiony n&umer IP użytkownika lub nazwę komputera do trackera"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Numer IP użytkownika lub nazwa komputera:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ikona w tacce systemowej"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Pokaż ikonę w tacce s&ystemowej"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Pokazuj pasek &szybkości w tacce systemowej"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Pokazuj wyskakujące okienka komunikatów"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Wysyłanie (KB/sek):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Pobieranie (KB/sek):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Katalogi"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Katalog do przechowywania plików tymczasowych:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Przenieś zakończone pobrania do:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Automatycznie zapisz pobrania do:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Kopiuj pliki .torrent do:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Pasek narzędziowy pobierania"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Ustaw szybkość dla torrenta"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maksymalna szybkość wysyłania:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maksymalna szybkość pobierania:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/sek (0 oznacza bez limitu)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Dodaj potencjalnego partnera"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP partnera:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port TCP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Podaj IP i port partnera."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Czarna lista KTorrenta"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Uwaga: Czarna lista dotyczy tylko bieżącej sesji. Użyj zapisywania/otwierania, "
+"żeby zachować swoje wpisy, lub zastosuj wtyczkę IPFilter (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Zablokowani partnerzy"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Adres IP partnera"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Dodaj partnera do listy:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Dodaje partnera do czarnej listy"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Usuwa wybranych partnerów z czarnej listy"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Wy&czyść"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Czyści listę"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Z&apisz jako..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Zapisz czarną listę do wykorzystania przez wtyczkę Filtr IP"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maksymalna liczba pobierań:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maksymalna liczba wysyłań:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Uruchamianie z małą ilością miejsca na dysku:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimalna wielkość wolnego miejsca na dysku:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "NIe uruchamiaj"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Zawsze pytaj"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Wymuś uruchomienie"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 oznacza bez limitu)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maksymalna szybkość pobierania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Całkowity limit połączeń:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Maksymalny czas wysyłania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maksymalna liczba połączeń na torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Liczba slotów wysyłania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Port UDP trackera:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maksymalny współczynnik udziału:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maksymalna szybkość wysyłania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/sek (0 oznacza bez limitu)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Godzin(y) (0 oznacza bez limitu)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Kontynuuj wysyłanie po zakończonym pobieraniu"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Uwaga"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Powyższe porty muszą być przekierowane, jeżeli jesteś za routerem. Wtyczka UPnP "
+"może zrobić to za ciebie."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Okno menedżera kolejki KTorrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Stan:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Współczynnik udziału:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Pozostało bajtów:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Kontrolowane przez"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Wy&syłanie"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Wysłano:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Przesuń w &górę"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Przesuń w &dół"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Przesuń na początek"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Przesuń na &koniec"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Sterowanie przez &menedżera kolejki"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Sterowanie przez &użytkownika"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Wklej URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Anuluj"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Utwórz torrenta"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Plik lub katalog, z którego chcesz utworzyć torrenta:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Musisz dodać przynajmniej jeden adres trackera lub węzeł (adres)."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opcje pliku"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Wielkość każdej części:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Rozpocznij wysyłanie torrenta"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "&Rozproszony (tylko DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Torrent prywatny (DHT niedozwolony)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Komentarze:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "Utwórz"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "A&nuluj"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackery"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Węzły DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Węzeł:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "Numer IP lub nazwa komputera"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"UWAGA: Kilka znanych, dobrych węzłów DHT jest już wstawionych. Jeśli zamierzasz "
+"wysyłać ten torrent, to możesz dodać również swój IP i port."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Zaawansowane ustawienia"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Algorytm KTorrent:</b> Domyślny algorytm stosujący kombinację innych "
+"algorytmów w oparciu o nasze testy."
+"<br>\n"
+"<b>Algorytm aktualnej szybkości:</b> najprostszy algorytm - pozostało "
+"bajtów/aktualna szybkość"
+"<br>\n"
+"<b>Algorytm całkowitej średniej szybkości:</b> pozostało bajtów/średnia "
+"szybkość"
+"<br>\n"
+"<b>Algorytm okna o wielkości X:</b> pozostały czas obliczony na podstawie X "
+"próbek szybkości"
+"<br>\n"
+"<b>Algorytm średniej ruchomej:</b> średnia ruchoma szybkości obliczona na "
+"podstawie X próbek szybkości"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Aktualna szybkość"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Całkowita średnia szybkość"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Okno o rozmiarze X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Średnia ruchoma"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(wymagane ponowne uruchomienie)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "&Wyłącz przydzielanie miejsca na dysku"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Od razu przydzielaj miejsce na dysk&u (zapobiega fragmentacji)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Podstawowy (wolny)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "W zależności od systemu plików"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Wydajność"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Wykorzystanie pamięci: "
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Niskie"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Średnie"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Wysokie"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Odświeżanie GUI co:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 sek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 sek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 sek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Szybki procesor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Wolny procesor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Sprawdzanie danych"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "W trybie wysyła&nia nie sprawdzaj części większych niż"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Sprawdź &poprawność danych po wykryciu"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "uszkodzonych części"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Sieć"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maksymalna liczba połączeń na torrent (0 = bez limitu)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+"Nie używaj serwera pośredniczącego (pro&xy) KDE dla połączeń HTTP trackera"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Serwer pośredniczący (proxy) HTTP trackera:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Skanowanie danych"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Skanowanie danych torrenta:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Liczba znalezionych części:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Liczba części błędnych/niepobranych:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maksymalna liczba pobrań (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maksymalna liczba wysyłań (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Pobierać z małą ilością miejsca na dysku?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maksymalna liczba połączeń na torrent (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Maksymalna liczba połączeń wszystkich torrentów (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maksymalna szybkość wysyłania w KB/sek (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maksymalna szybkość pobierania w KB/sek (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maksymalny współczynnik udziału (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maksymalny czas wysyłania w godzinach (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Pokaż ikonę w tacce systemowej"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Pokazuj pasek szybkości w tacce systemowej"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Pobieranie (kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Wysyłanie (kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Pokazuj komunikat o zakończeniu pobierania."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Kontynuuj wysyłanie po zakończonym pobieraniu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Katalog do przechowywania plików tymczasowych"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Czy zapisywać automatycznie do domyślnego katalogu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Katalog do przechowywania pobranych plików"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Czy automatycznie przenosić zakończone pobrania do domyślnego katalogu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Katalog do przenoszenia zakończonych pobrań"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Czy automatycznie kopiować pliki .torrent do domyślnego katalogu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Katalog do kopiowania plików .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Czy przesyłać własny numer IP do trackera"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Katalog ostatnio używany do zapisywania"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "Numer IP do przekazania do trackera"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Wykorzystanie pamięci"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Odświeżanie GUI co"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Wsparcie dla DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Port DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Liczba slotów wysyłania"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Widoczne kolumny"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algorytm szacowania czasu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Torrent zostanie zatrzymany, jeśli na dysku jest nie ma wolnego miejsca, oraz "
+"jeśli ilość wolnego miejsca jest mniejsza niż wymagana."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Menadżer wtyczek"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Włącz"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Wy&łącz"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Włącz wszystkie"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Wyłącz wszystkie"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Domyślne urządzenie UPnP do użycia"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Wykryte urządzenia:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Urządzenie"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Porty przekierowane"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Połączenie WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Prze&kieruj porty"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Cofnij przekierowanie"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Skanuj ponownie"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Skanować katalog 1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Skanować katalog 2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Skanować katalog 3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Ścieżka do katalogu 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Ścieżka do katalogu 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Ścieżka do katalogu 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Czy otwierać torrent bez potwierdzania."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Zaznaczono czynność usunięcia."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Zaznaczono czynność przeniesienia."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Ustawienia przeszukiwania katalogów"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Przeszukaj katalog &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Przeszukaj katalog &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Przeszukaj katalog &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Przenieś do katalogu \"wczytanych\" po wczytaniu"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Przenieś torrent do katalogu \"wczytanych\" po wczytaniu"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Otwieraj torrent&y bez potwierdzania"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Nie pokazuj okna 'Wybierz pliki do pobrania'"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Usuń po wczytaniu"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Usuwa torrenta po wczytaniu"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Katalogi do przeszukania"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Katalog 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Katalog 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Katalog 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Ustawienia wyszukiwania"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Serwer WWW"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Przekieruj port"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Czas życia sesji (w sek):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Wybierz motyw graficzny interfejsu:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Nazwa użytkownika:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Zmień hasło ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Ścieżka do programu wykonywalnego PHP:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Numer portu"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Przekieruj port"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Czas życia sesji"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Motyw graficzny interfejsu"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Ścieżka do pliku wykonywalnego PHP"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "nazwa użytkownika"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "hasło"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Części"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Ogółem:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Aktualnie pobierane:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Pobrano:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Odrzucono:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Pozostało:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Rozmiar:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Część"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Postęp"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Partner"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Przyporządkowani partnerzy"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Rozsiewający:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Pijawki:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Średnia szybkość pobierania:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Średnia szybkość wysyłania:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Następne uaktualnienie za:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Stan trackera:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Pobrane części torrenta:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Dostępne części torrenta:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Współdzielenie"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Wysyłanie zostanie zatrzymane po osiągnięciu tego limitu. Zero oznacza brak "
+"limitu."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Wysyłanie zostanie zatrzymane po podanej liczbie godzin."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Godzin(y)"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Limit współczynnika:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Limit działa tylko w trybie wysyłania"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Limit czasu:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Uaktualnij tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minimalny przedział aktualizacji - 60 sek."
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Dodaj trac&ker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Usuń tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "&Zmień tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Przywróć domyślne"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Pokaż zakładkę partnerów w głównym oknie"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Pokaż zakładkę pobierania części w głównym oknie"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Pokaż zakładkę trackerów w głównym oknie"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Pokaż listę partnerów"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Pokaż listę aktualnie pobieran&ych części"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Pokaż listę trackerów"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Ustawienia blokowania adresów IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Wybierz plik filtra PeerGuardian"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Użyć filtru PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Plik filtru numerów IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Pobierz/Ko&nwertuj"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Pobierz filtr PeerGuardian z bluetack.co.uk lub blocklist.org.\n"
+"UWAGA: Plik ZIP z bluetack.co.uk jest obsługiwany."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL filtru level1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Użyć filtru level1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Konwertowanie..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Kliknij przycisk 'konwertuj', aby rozpocząć konwersję pliku antip2p. UWAGA: To "
+"może chwilę potrwać, nawet na szybkim komputerze i w tym czasie nie będzie "
+"można korzystać z KTorrenta."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Uaktualnienia"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Uaktualniaj wykresy co"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "odświeżanie GUI"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Pobieraj dane co"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisekund"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maksimum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Tryb skali maksymalnej szybkości:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Dokładny"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Zobacz 'Co to jest?' aby uzyskać więcej informacji"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Ustaw maksymalną wartość na osi OY jako:\n"
+"- Górna: Całkowita maksymalna osiągnięta szybkość\n"
+"- Dokładna: Maksymalna osiągnięta szybkość widoczna na wykresie"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Szybkość partnerów"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Szybkość partnerów:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "uaktualniaj co"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "uaktualnienia wykresów danych"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Pobieranie danych o wielu połączonych partnerach stanowi duże obciążenie dla "
+"procesora."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Połączenia partnerów"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Duże wartości mogą zniekształcić wykresy przyłączonych partnerów"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Pokazuj zbiorczo rozsiewających"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Pokazuj zbiorczo pijawki"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Liczba pomiarów"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Wysyłanie"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Połączenia"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Partnerzy"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Przełącz wykresy szybkości partnerów"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Przedział czasowy pobierania danych o szybkości partnerów"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Przełącz zbiorcze rysowanie pijawek"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Przełącz zbiorcze rysowanie rozsiewających"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Liczba pomiarów pobierania"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Liczba pomiarów partnerów"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Liczba pomiarów wysyłania"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Liczba pomiarów połączeń"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Liczba pomiarów DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Tryb maksimum osi OY"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importuj istniejące pobieranie"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Dane:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Proszę wskazać torrenta i dane już pobrane dla tego torrenta."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "Impo&rtuj"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "domyślny"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Kanały RSS"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Kanały"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Usuń"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nowy"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artykuły"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Automatyczne o&dświeżanie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnoruj czas życia sesji"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Odśwież"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Tytuł"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Przechowuj artykuły (dni)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktywny"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtry"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Filtry akceptowanych"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Filtry odrzucanych"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Wyrażenia regularne"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Traktuj jako &serię"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Uruchom"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Kryteria serii"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Dopasowuj bez numeru odcinka"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Maksymalny numer odcinka"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Maksymalny numer sezonu"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Minimalny numer sezonu"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Minimalny numer odcinka"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Test te&kstu"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&st"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Dopasowania filtra"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Planowanie transferu"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Kategoria - lewy przycisk myszy"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kategoria 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "W&yłącz"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normalny"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategoria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategoria &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Kategoria - prawy przycisk myszy"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategoria &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "Kategoria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>Kategoria 1.</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>Kategoria 3.</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "pobieranie:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "wysyłanie:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>Kategoria 2.</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* zero oznacza bez limitu"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Zapisz do pliku"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "Wczytaj z p&liku"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Wyczyść planowanie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Strona ustawień planowania transferu"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Włączyć planowanie transferu?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Planowanie transferu"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Zastosuj kolory zamiast mapy bitowej"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Zalecane dla wolniejszych komputerów)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "&Zmień planowanie"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Włączyć planowanie transferu?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Zastosuj kolory zamiast mapy bitowej"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Zastosuj tekst formatowany w dzienniku"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Znacznik informacji ogólnych"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Znacznik komunikatów o połączeniach"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Znacznik komunikatów o DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Znacznik informacji trackera "
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Znacznik komunikatów o operacjach dyskowych"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki Filtr IP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki wyszukiwania"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki częściowych pobrań"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki Okno informacyjne"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki przeszukiwania katalogów"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki planowania transferu"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki kanały RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Znacznik komunikatów wtyczki interfejs WWW"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Ustawienia dziennika zdarzeń"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Wtyczki"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Wszystko"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Debugowanie"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Informacje"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Ważne"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Brak"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "Filtr IP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Wyszukiwanie:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Przeszukanie katalogów:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Planowanie transferu:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Import częściowo pobranych:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Okno informacyjne:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Kanały RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Interfejs WWW:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "System"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Ogólne:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Połączenia:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Operacje dyskowe:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Zastosuj tekst formatowany w dzienniku"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Zewnętrzna przeglądarka"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Wyszukuj w zewnętrznej przeglądarce"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Używaj domyślnej przeglądarki"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Ścieżka do przeglądarki użytkownika:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Wyszukiwarki"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Nazwa wyszukiwarki:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "Dod&aj"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Wyszukiwarki"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Usuń wszystko"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Dodaj domyś&lny"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Uaktualnij z Internetu"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Znajdź"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Wyszukiwarka:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Aktualna wyszukiwarka"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Użyj własnej przeglądarki"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Ścieżka do przeglądarki użytkownika"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dzień \n"
+"%n dni \n"
+"%n dni "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Tak, pierwszy"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Tak, ostatni"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Nie można otworzyć pliku dziennika %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Nie można zapisać do %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Nie można czytać z %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Nie można utworzyć katalogu %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Nie można stworzyć dowiązania symbolicznego %1 do %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Nie można przenieść %1 do %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Nie można skopiować %1 do %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Nie można usunąć %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Nie można utworzyć %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Nie można obliczyć rozmiaru pliku %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Nie można obliczyć rozmiaru pliku: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Nie można otworzyć %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Nie można powiększyć pliku %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Nie można powiększyć pliku"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Nie można zmienić pozycji w pliku: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Nie można zapisywać poza zakresem bufora mmap !"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Stan: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Wczytane"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Nie wczytane"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opcje wtyczek"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Nie można otworzyć pliku %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Katalog %1 nie istnieje"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Nieprawidłowy token: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Błąd dekodowania"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Niespodziewany koniec wejścia"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Nie można skonwertować %1 do liczby całkowitej"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent jest niekompletny!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Uszkodzony torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrent nie posiada pola adresu rozgłaszania lub węzłów"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Nie można otworzyć pliku torrenta %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Błąd przetwarzania"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Wystąpił błąd podczas wczytywania pliku torrenta. Najbardziej prawdopodobna "
+"przyczyna to, że plik jest uszkodzony, lub nie jest to plik torrenta.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Wystąpił błąd podczas wczytywania pliku torrenta. Najbardziej prawdopodobna "
+"przyczyna to, że plik jest uszkodzony, lub nie jest to plik torrenta."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Nie można utworzyć %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Pobierasz już torrent %1. Lista trackerów obu torrentów została połączona."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Torrent %1 jest już pobierany"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Nie można wykonać migracji %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Torrent %1 został rozpoczęty przez poprzednią wersję KTorrenta. Aby być "
+"pewnym, że torrent wciąż działa w tej wersji, zostanie wykonana jego migracja. "
+"Pojawi się pytanie o lokalizację do zapisu torrenta. Jeżeli naciśniesz Anuluj, "
+"wybrany zostanie Twój katalog domowy."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Wybierz katalog do zapisu"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Nie rozpoczęto"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Wysyłanie"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Pobieranie"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Wstrzymane"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Zatrzymane"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Błąd: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Przydzielanie powierzchni dysku"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Oczekujący"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Sprawdzanie danych"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Zatrzymano. Brak wolnego miejsca w urządzeniu."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Nie ma wystarczającej ilości miejsca na dysku dla pobierania torrenta. Czy na "
+"pewno chcesz kontynuować?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Na dysku jest za mało miejsca dla %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" osiągnął maksymalny współczynnik udziału. Zignorować ten limit i "
+"kontynuować wysyłanie?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Osiągnięto maksymalny współczynnik udziału."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Błąd przy zatrzymywaniu torrenta %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Błąd przy starcie torrenta %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Rozgłaszanie"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Nieznany klient"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 partner\n"
+"%n partnerów\n"
+"%n partnerów"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Nie można utworzyć pliku %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Nie można zapisać pierwszej części do pliku: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Nie można zapisać ostatniej części do pliku: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Nie można otworzyć %1 do zapisu : system plików tylko do odczytu"
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Nie można powiększyć pliku %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Nie można powiększyć pliku %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Nie można powiększyć pliku %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Błąd : Czytanie poza końcem pliku %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Błąd odczytu z %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Błąd zapisu do %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Błąd zapisu do %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Nie można przydzielić powierzchni dysku: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Nie można powiązać z portem UDP %1 lub z 10 następnymi portami."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Nieprawidłowa odpowiedź trackera"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Błędne dane z trackera"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Nieprawidłowy URL trackera"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Nie można otworzyć pliku %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Nie można utworzyć pliku indeksującego: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Nie można otworzyć pliku %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Stosuje UPnP do automatycznego przekierowania portów routera"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Nie można znaleźć usługi przekierowania portów w opisie urządzenia!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Urządzenia UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Automatycznie poszukuje plików torrenta w katalogach i wczytuje je."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Przeszukiwanie katalogów"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Przeszukiwanie katalogów"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opcje przeszukiwania katalogów"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "wczytane"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Przeszukiwanie katalogów - Katalog %1: niepoprawny URL, lub katalog nie "
+"istnieje. Wybierz poprawny katalog."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Interfejs WWW"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Opcje interfejsu WWW"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Plik wykonywalny PHP nie znajduje się na domyślnej ścieżce, proszę ustawić "
+"ścieżkę ręcznie"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Proszę podać nowe hasło dla interfejsu WWW."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 istnieje i jest wykonywalny"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 nie istnieje"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 nie jest wykonywalny"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 jest katalogiem"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 nie jest ścieżką do pliku wykonywalnego PHP"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Interfejs WWW"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Umożliwia obsługę KTorrenta przez przeglądarkę"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Pobieraj na początku"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Pobieraj normalnie"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Pobieraj na końcu"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Usuń plik(i)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Dostępny"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Oczekujący"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Utracisz wszystkie dane z tego pliku. Na pewno chcesz to zrobić?\n"
+"Utracisz wszystkie dane z tych plików. Na pewno chcesz to zrobić?\n"
+"Utracisz wszystkie dane z tych plików. Na pewno chcesz to zrobić?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Bez limitu"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Okno informacyjne"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Pokazuje dodatkowe informacje o pobieraniu. Np. które części zostały "
+"pobrane,ilu jest rozsiewających i ile pijawek ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Nie można dodać trackera do prywatnego torrenta"
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Nie można usunąć domyślnego trackera"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Nie można dodać trackerów do prywatnego torrenta"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Państwo"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klient"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Niedrożny"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Odrzucony"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Dostępność"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Punktacja"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Slot wysyłania"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Żądania"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Odrzuć partnera"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Zablokuj partnera"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Dostępne części"
+"<br><img src=\"unavailable_color\">&nbsp; - Niedostępne części"
+"<br><img src=\"excluded_color\">&nbsp; - Odrzucone części"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opcje wyświetlania Informacji"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Pobrane części"
+"<br><img src=\"unavailable_color\">&nbsp; - Części do pobrania"
+"<br><img src=\"excluded_color\">&nbsp; - Odrzucone części"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Konwertuj"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Wczytywanie pliku txt..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Proszę czekać..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Plik skonwertowany."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Nie można wczytać filtru:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Nieprawidłowy plik filtru. Może być uszkodzony lub posiada zły format."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtruje niepożądanych partnerów na podstawie ich adresów IP"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Filtr IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Stan: wczytany i uruchomiony."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Stan: Nie wczytany."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Stan: <font color=\"#ff0000\">Plik filtru nie został znaleziony.</font> "
+"Proszę pobrać i skonwertować plik filtru."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Wybrany plik już istnieje. Czy chcesz pobrać go ponownie?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Plik istnieje"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Plik filtru (level1.dat) już istnieje. Chcesz przekonwertować go ponownie?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtr blokowania IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opcje filtru blokowania IP"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statystyki"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Opcje statystyk"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Przyłączone pijawki"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Pijawki zbiorczo"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Przyłączeni rozsiewający"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Rozsiewający zbiorczo"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Średnia liczba przyłączonych pijawek na torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Średnia liczba przyłączonych rozsiewających na torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Średnia liczba przyłączonych pijawek na aktywny torrent"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Średnia liczba przyłączonych rozsiewających na aktywny torrent"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Węzły"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Zadania"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Pokazuje statystyki transferu"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Statystyki szybkości"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Statystyki połączeń"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Bieżące"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Średnie"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Limit"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Średnio od pijawki"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Średnio do pijawki"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Średnio od rozsiewającego"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Od pijawek"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Od rozsiewających"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Pliki torrenta"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Wszystkie pliki"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Nie można zweryfikować danych : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Nie można wczytać pliku torrenta: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importuje częściowo lub w pełni pobrane torrenty od innych klientów"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importuj istniejące pobieranie"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "Adres URL kanału"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Automatycznie przeszukuje kanały RSS w poszukiwaniu torrentów zawierających "
+"pasujące wyrażenia regularne i wczytuje je."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Kanały RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Tytuł"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Opis"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Odnośnik"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Sezon"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Odcinek"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Czas"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Planowanie transferu"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opcje planowania transferu"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "PON"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "WTO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "ŚRO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "CZW"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "PIĄ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SOB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "NIE"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Plan zapisany"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Nie znaleziono pliku."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Plan wczytany"
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr ""
+"Umożliwia ustawianie szybkości wysyłania/pobierania w różnych porach "
+"dnia/tygodnia"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Otwórz planowanie transferu"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Planowanie transferu jest wyłączone. Ustawienia ->Konfiguracja: Ktorrent -> "
+"Planowanie transferu, żeby je włączyć."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Wyświetlanie dziennika"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Wyświetlanie dziennika"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Wyświetla dziennik zdarzeń KTorrenta"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Użyj swojej przeglądarki internetowej, aby wyszukać tekst %1 (wielkimi "
+"literami) w wyszukiwarce, którą chcesz dodać. "
+"<br>Po zakończonym wyszukiwaniu przekopiuj URL z pola adresu i wklej go tutaj."
+"<br>"
+"<br>Rezultatem wyszukiwania %1 na przykład w Google będzie "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br>Jeżeli dodasz ten URL tutaj, wtedy KTorrent może wyszukiwać używając "
+"Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Użyj swojej przeglądarki internetowej, aby wyszukać tekst %1 (wielkimi "
+"literami) w wyszukiwarce, którą chcesz dodać. Znaleziony URL wstaw poniżej."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Musisz podać nazwę wyszukiwarki i URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Wyszukiwarka o tej nazwie już istnieje. Proszę użyć innej nazwy."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Nieprawidłowy URL. Wyszukaj słowo FOOBAR w przeglądarce internetowej, a potem "
+"kopiuj/wklej tutaj dokładny adres URL."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Wyszukiwanie"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opcje wyszukiwarki"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Szukanie %1 ..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "pliki torrenta"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Wyszukiwanie zakończone"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Wyszukiwarka: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Wyszukuje torrenty za pomocą wielu popularnych wyszukiwarek torrentów"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Chcesz pobierać, czy zapisać torrenta?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Pobierz torrenta"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Pobierz"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Znajduje partnerów Ktorrent-a w lokalnej sieci i współdzieli z nimi dane"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algorytm szacowanego zakończenia:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Nie można pobrać części: %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Trackery"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "Typ pola adresów IP"
diff --git a/translations/pt/Makefile.am b/translations/pt/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/pt/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/pt/messages/Makefile.am b/translations/pt/messages/Makefile.am
new file mode 100644
index 0000000..fd3494d
--- /dev/null
+++ b/translations/pt/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = pt
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/pt/messages/ktorrent.po b/translations/pt/messages/ktorrent.po
new file mode 100644
index 0000000..7e123e8
--- /dev/null
+++ b/translations/pt/messages/ktorrent.po
@@ -0,0 +1,4942 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-12-14 18:05+0000\n"
+"Last-Translator: José Nuno Coelho Pires <jncp@netcabo.pt>\n"
+"Language-Team: LANGUAGE <kde-i18n-doc@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POFile-IgnoreConsistency: Left:\n"
+"X-POFile-IgnoreConsistency: Alt+G\n"
+"X-POFile-IgnoreConsistency: Alt+B\n"
+"X-POFile-IgnoreConsistency: Alt+K\n"
+"X-POFile-IgnoreConsistency: Alt+S\n"
+"X-POFile-IgnoreConsistency: None\n"
+"X-POFile-IgnoreConsistency: Alt+Y\n"
+"X-POFile-IgnoreConsistency: Alt+Y\n"
+"X-POFile-SpellExtra: BitTorrent Torrent KTorrent GB torrent Veloc\n"
+"X-POFile-SpellExtra: IWFileTreeItem DL localizador chunkinfo Leechers bind\n"
+"X-POFile-SpellExtra: UL Localizadores NAT InfoWidgetBase router ChunkBar\n"
+"X-POFile-SpellExtra: FOOBAR ktorrent IPs dat level TXT Fi KTUPnPTest DHT\n"
+"X-POFile-IgnoreConsistency: Alt+C\n"
+"X-POFile-IgnoreConsistency: Alt+N\n"
+"X-POFile-IgnoreConsistency: Alt+Q\n"
+"X-POFile-IgnoreConsistency: Alt+A\n"
+"X-POFile-IgnoreConsistency: Medium\n"
+"X-POFile-IgnoreConsistency: Alt+L\n"
+"X-POFile-SpellExtra: InfoWidget Miniupnp UPnP SEG QUA SÁB SEX Zeroconf\n"
+"X-POFile-IgnoreConsistency: Scheduler\n"
+"X-POFile-IgnoreConsistency: Alt+U\n"
+"X-POFile-IgnoreConsistency: Do Not Download\n"
+"X-POFile-SpellExtra: php Coldmilk KDevelop XFS MaxMind GeoLite istributed\n"
+"X-POFile-SpellExtra: minDiskSpace textLabel ETA loaded Máx Mín able WAN\n"
+"X-POFile-SpellExtra: blocklist PeerGuardian torrentCopyDir IPFilter TTL OY\n"
+"X-POFile-SpellExtra: mmap ISPs PartFileImport GF ms KT KTorrentView org\n"
+"X-POFile-SpellExtra: DND ash antip encriptadas TrackerViewBase DSCP SHA\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Nenhumas ligações recebidas (talvez atrás de 'firewall')"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informação"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Dados transferidos durante a sessão actual"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Velocidade actual de todas as torrentes combinadas"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupos"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Começar"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Parar"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Iniciar Tudo"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Parar Tudo"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Colar o URL da Torrente..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Abrir o Gestor da Fila..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Pôr/Tirar da Fila"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Filtro de IPs"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Verificar a Integridade dos Dados"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Definir a taxa máxima de envio"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Definir a taxa máxima de obtenção"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Ficheiros Torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Todos os Ficheiros"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Abrir a Localização"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Velocidade recepção: %1 / envio: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Recebido: %1 / enviado: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 nós, %2 tarefas"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: desligado"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Todas as Torrentes"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Procurar:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Distinguir capitalização"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Mover para o bloco esquerdo"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Mover para o bloco direito"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Mover para o bloco do fundo"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Atribuir um Acelerador..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Limpar o Acelerador"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Mudar o Número do Botão"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Número do novo acelerador:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Deverá indicar um IP no formato 'XXX.XXX.XXX.XXX'. Poderá também usar "
+"caracteres especiais do tipo '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Escolha um ficheiro"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Escolha o ficheiro onde gravar"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL Inválido."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Recepções"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Envios"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"O porto indicado (%1) não está disponível ou está a ser utilizado por outra "
+"aplicação. O KTorrent está a utilizar o porto %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"O KTorrent não consegue aceitar ligações, porque os portos %1 a %2 já estão a "
+"ser usados por outro programa."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Não é possível criar a torrente: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Faltam vários ficheiros de dados da torrente \"%1\"; deseja criá-los de novo ou "
+"optar por não os transferir?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Criar de novo"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Sem Obtenção"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Não é possível criar de novo os ficheiros em falta: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Faltam ficheiros de dados"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Não é possível desmarcar os ficheiros em falta: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Falta o ficheiro onde estão guardados os dados da torrente \"%1\"; deseja "
+"criá-lo de novo?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Não Criar de Novo"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Não é possível criar de novo o ficheiro de dados: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Falta o ficheiro de dados"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "A Verificar a Integridade dos Dados"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "infinito"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Erro ao analisar os dados: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "A analisar os dados de <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Um programa de BitTorrent para o KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Modo de depuração"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "O documento a abrir"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "'Plugin' de RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "'Plugin' da Interface Web"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "'Plugin' de Estatísticas"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Ícone da aplicação e mais alguns"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "O ícone de transferências"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Ícone da aplicação 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Dica da ChunkBar e ordenação do IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Sistema de localização de países para o 'plugin' InfoWidget (Este produto "
+"inclui os dados do GeoLite que foram criados pela MaxMind, disponíveis em "
+"http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Bandeiras dos países"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Prioridade do ficheiro"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "O Miniupnp foi usado como exemplo para a própria implementação do UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Correcção da proporção máxima de partilha global"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Melhorias do Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Interface Web Coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Código do IDEAl do KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Melhoria de velocidade da conversão no 'plugin' do filtro de IPs"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Foram descobertas 2 vulnerabilidades de segurança (ambas corrigidas)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Correcção de carregamento silencioso com um local de gravação"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Correcções no código em PHP da interface Web"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Reserva do disco específica do XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Correcção para não mostrar velocidades muito baixas"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Correcção para mostrar o estado possível de protecção de 'firewall'"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Diversas correcções"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Modificação para esconder o menu"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Modificação para alterar as prioridades dos ficheiros na interface Web"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Diversas correcções na interface Web"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Modificação da barra do filtro"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Actualização da janela de ficheiros não-multitarefa"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Optimização na geração do código de dispersão SHA1"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Correcção do cálculo do espaço livre em disco no FreeBSD"
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Correcção de carregamento silencioso com um local de gravação"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Deve seleccionada um ficheiro ou uma pasta."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Não adicionou nenhum localizador; tem a certeza que deseja criar esta torrente "
+"?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Deve adicionar pelo menos um nó."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Ficheiros Torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Escolha o Ficheiro onde Gravar a Torrente"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "A criar %1 ..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Grupos Personalizados"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Novo Grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Editar o Nome"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Remover o Grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Abrir uma Página"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Indique por favor o nome do grupo."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "O grupo %1 já existe."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Indique por favor o nome do novo grupo."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Envios activos"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Envios em espera"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Recepções em espera"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Recepções do utilizador"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Envios do utilizador"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Torrentes inactivas"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Recepções inactivas"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Envios inactivos"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Torrentes activas"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Recepções activas"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Remover a Torrente"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Remover a Torrente e os Dados"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Adicionar Pontos"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Fontes de Pontos Adicionais"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Fontes de Pontos da Torrente:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Troca de Pontos"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Anúncio Manual"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Antevisão"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Abrir uma Pasta"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Pasta de Dados"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Pasta Temporária"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Definir a Localização de Transferência"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Remover do Grupo"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Adicionar ao Grupo"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Limites de Velocidade"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"A torrente não existe. Comunique este erro à equipa de desenvolvimento do "
+"KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Foi adicionado um ponto potencial."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "O endereço IP é inválido."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Preferências"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opções de Transferência"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+"O porto de DHT necessita de ser diferente do porto de UDP do localizador!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Geral"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opções Gerais"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Não foi possível procurar o %1: %2\n"
+"Indique por favor um endereço IP ou nome de máquina válido."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avançado"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Opções Avançadas"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Colunas visíveis"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Estado"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Obtido"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Tamanho"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Enviado"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Veloc. Recepção"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Veloc. Envio"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tempo Restante"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Fontes"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Receptores"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Completo"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Proporção de Partilha"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Tempo de Recepção"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Tempo Semeado"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Todas as Torrentes %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Não é possível iniciar mais de 1 transferência, \n"
+"Não é possível iniciar mais de %n transferências, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"e 1 fonte. \n"
+"e %n fontes. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Vá a Configuração -> Configurar o KTorrent, se quiser alterar os limites."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"A torrente %1 ainda não acabou de transferir; deseja remover também os dados "
+"incompletos?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Remover Transferência"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Apagar os Dados"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Manter os Dados"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Você irá perder todos os dados transferidos. Tem a certeza que quer fazer isto?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Já está a verificar os dados da torrente %1 !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Escolha a localização de transferência para o %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Você desmarcou os seguintes ficheiros existentes. Irá perder todos os dados "
+"destes ficheiros; tem a certeza que quer fazer isto ?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Sim, remover os ficheiros"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Não, manter os ficheiros"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " curto!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Utilizador"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Gestor de Fila"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Não (torrente privada)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Velocidade:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Recepção: <font color='#1c9a1c'>%1</font></td>"
+"<td>Envio: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transferências:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Recepção: <font color='#1c9a1c'>%3</font></td>"
+"<td>Envio: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> terminou a transferência."
+"<br>Velocidade média: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Transferência completa"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"O <b>%1</b> atingiu a sua taxa máxima de partilha, igual a %2, e foi "
+"interrompido."
+"<br>Foi enviado %3 a uma velocidade média de %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "O fornecimento de sementes está completo"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"O <b>%1</b> atingiu o tempo máximo como semeado de %2 horas e foi interrompido."
+"<br>Foi enviado %3 a uma velocidade média de %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "O <b>%1</b> foi parado pelo seguinte erro: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Foram encontrados dados corrompidos na torrente <b>%1</b>"
+"<br>Seria uma boa ideia fazer uma verificação da integridade dos dados da "
+"torrente."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"O <b>%1</b> atingiu a sua taxa máxima de partilha, igual a %2, e não pode ser "
+"colocado na fila de espera. Remova manualmente o limite se quiser continuar a "
+"semear."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"O <b>%1</b> atingiu o seu tempo máximo como semeado de %2 horas e não pode ser "
+"colocado na fila de espera. Remova manualmente o limite se quiser continuar a "
+"semear."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "A torrente não pode ser colocada na fila."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Não é possível iniciar o <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Não é possível semear mais de 1 torrente. "
+"<br>\n"
+"Não é possível semear mais de %n torrentes. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Não é possível transferir mais de 1 torrente."
+"<br>\n"
+"Não é possível transferir mais de %n torrentes."
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "A torrente não pode ser iniciada"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Não existe espaço em disco suficiente."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"O seu disco está a ficar sem espaço livre.<br />O <b>%1</b> "
+"está a ser transferido para '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "A torrente foi parada.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "O dispositivo está a ficar sem espaço"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Limite de velocidade em KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Sem Limite"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Limites de velocidade para o <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Uma Aplicação KPart do KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Não é possível abrir o ficheiro do índice %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "José Nuno Pires,Pedro Morais"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "jncp@netcabo.pt,morais@kde.org"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Seleccione Que Ficheiros Deseja Obter"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Obter para:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupo:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Controlado pelo &utilizador"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Iniciar a torrente"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Recepção"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Seleccion&ar Tudo"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Seleccionar &Nada"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Inverter a Selecção"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Espaço em disco"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Espaço em disco necessário:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Espaço livre em disco:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Após a transferência:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Encriptação"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Usar a encriptação do protocolo"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"A encriptação do protocolo é usada para evitar que os ISPs tornem mais lentas "
+"as ligações do BitTorrent."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Permitir ligações não-encriptadas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Se a opção estiver desligada, só se poderá ligar a clientes que suportem a "
+"encriptação."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Protocolo de <b>D</b>istributed <b>H</b>ash <b>T</b>"
+"able (Tabela de Dispersão Distribuída)."
+"<br>As máquinas descentralizadas trocam os dados do protocolo. Veja o manual "
+"para mais informações."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Usar o DHT para obter as máquinas adicionais"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Porto de UDP para a comunicação do DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP Personalizado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "E&nviar ao localizador um IP ou nome de máquina personalizado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "IP ou nome de máquina personalizado:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ícone da Bandeja do Sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Mostrar o ícone na bande&ja do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Mostrar a &barra de velocidade na bandeja do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Mostrar as mensagens na bandeja do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Largura de banda do envio (em KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Largura de banda da recepção (em KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Pastas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Pasta onde guardar ficheiros temporários:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Mover as transferências completas para:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Gravar &automaticamente os ficheiros obtidos em:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Copiar os ficheiros .torrent para:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barra de Transferências"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Definir os limites de velocidade da torrente"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Taxa máxima de envio:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Taxa máxima de recepção:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 é ilimitado)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Adicionar um ponto potencial"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP do ponto:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Porto:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Indique o IP e o porto do ponto."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Lista Negra do KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Nota: A lista negra aplica-se apenas à sessão actual. Use o gravar/abrir para "
+"gravar os seus itens ou use o 'plugin' do Filtro IP (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Pontos Banidos"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Endereço do IP do ponto"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Adicionar um ponto:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Adiciona um ponto à lista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Remove o ponto seleccionado da lista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Limpar"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Limpa esta lista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Gr&avar Como..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Grava esta lista negra para a usar no filtro de IPs do KTorrent"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Máximo de transferências:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Máximo de fontes:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Iniciar a transferência com pouco espaço :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Espaço mínimo em disco:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Não iniciar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Perguntar sempre"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Obrigar a iniciar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 significa ilimitado)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Taxa máxima de obtenção:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Limite global de ligações:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Tempo máximo como semeado:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Máximo de ligações por torrente:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Número de blocos de envio:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Porto UDP do localizador:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Proporção máxima de partilha:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Taxa máxima de envio:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/s (0 é ilimitado)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Horas (0 significa ilimitado)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Continuar o envio após a recepção ter terminado"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Atenção"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Os portos acima devem ser encaminhados se estiver por trás de um 'router'. O "
+"'plugin' de UPnP poderá fazer isso por si."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Janela da Fila do KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Estado:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Localizador:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Proporção de partilha:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "'Bytes' restantes:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrente"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Controlada por"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Envio&s"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Enviado:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "S&ubir"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "&Descer"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Para o topo"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Para o &fundo"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Controlado pelo &GF"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Controlado pelo &Utilizador"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Colar o URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "C&ancelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Criar Torrente"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "O ficheiro ou pasta do qual deseja criar uma torrente:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Deve adicionar pelo menos um localizador ou nó."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opções do Ficheiro"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Tamanho de cada pedaço:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Começar a espal&har sementes da torrente"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Descentrali&zado (apenas DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Torrente privada (não é permitido o DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Comentários:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Criar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Ca&ncelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Localizadores"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Nós DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Nó:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP ou nome de máquina"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Porto"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"NOTA: Já estão inseridos alguns nós DHT válidos e conhecidos. Deverá inserir "
+"provavelmente o seu próprio endereço IP e porto, se planear semear esta "
+"torrente."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Preferências Avançadas"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Algoritmo do KTorrent:</b> O algoritmo predefinido que usa uma combinação de "
+"outros algoritmos com base nos nossos "
+"<br>\n"
+"<b>Algoritmo de velocidade actual:</b> O algoritmo mais simples - Bytes "
+"Restantes/Velocidade Actual"
+"<br>\n"
+"<b>Algoritmo da velocidade média global:</b> Bytes Restantes/Velocidade Média"
+"<br>\n"
+"<b>Algoritmo em janela de X:</b> TE calculado em X amostras de velocidade"
+"<br>\n"
+"<b>Algoritmo de média em movimento:</b> A velocidade média em movimento é "
+"calculada a partir de X amostras"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Velocidade actual"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Velocidade média"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Janela de X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Média em movimento"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(fará efeito após reiniciar)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Desactivar a reserva &prévia do disco"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Pré-alocar por completo o espaço em dis&co (evita a fragmentação)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Básico (lento)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Específico do sistema de ficheiros"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Performance"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Utilização da memória:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Baixa"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Média"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Alta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Intervalo de actualização da interface:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "CPU Rápido"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "CPU Lento"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Verificação dos Dados"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Durante o envio, &não verificar de novo os blocos maiores que"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Verificar a &integridade dos dados após"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "blocos corrompidos"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Rede"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Número máximo de configurações das ligações:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP para os pacotes IP:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Não usar o 'pro&xy' do KDE para as ligações do localizador HTTP"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "'Proxy' de HTTP do localizador:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "A analisar os dados"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "A analisar os dados da torrente :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Número de blocos encontrados :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Número de blocos falhados / não obtidos :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Testar"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Número máximo de transferências (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Número máximo de fontes (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Iniciar as transferências com pouco espaço em disco?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Número máximo de ligações por torrente (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Número máximo de ligações para todas as torrentes (0 = sem limite) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Velocidade máxima de envio em KB/s (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Velocidade máxima de recepção em KB/s (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Taxa máxima de partilhas (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Tempo máximo como semeado em horas (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Mostrar um ícone na bandeja do sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Mostrar a barra de velocidade na bandeja do sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Largura de banda da recepção (em kB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Largura de banda do envio (em kB/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Mostra mensagens quando as torrentes terminam."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Continuar o envio após a recepção ter terminado"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Pasta onde guardar ficheiros temporários"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Se deve gravar automaticamente os ficheiros obtidos na pasta de gravação"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Pasta onde guardar ficheiros obtidos"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Se deve mover automaticamente as transferências completas para a pasta de "
+"completas"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "A pasta para onde gravar os ficheiros transferidos por completo"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Se deve copiar automaticamente os ficheiros .torrent para a torrentCopyDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Pasta para onde copiar os ficheiros .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Se deve usar um IP personalizado a passar ao localizador"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "A pasta que foi usada como última pasta de gravação"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP a passar ao localizador"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Utilização da memória"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Intervalo de actualização da interface"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Suporte para o DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Porto do DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Número de blocos de envio"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Colunas visíveis no KTorrentView"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algoritmo de TE"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Quando não houver espaço livre para terminar a transferência e o espaço livre "
+"for menor que o 'minDiskSpace', a torrente será interrompida."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Gestor de 'Plugins'"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Carregar"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Fe&char"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Carreg&ar Tudo"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Fechar &Tudo"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Dispositivo UPnP a usar"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Dispositivos detectados:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Dispositivo"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Portos Encaminhados"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Ligação WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Enc&aminhar os Portos"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Cancelar o Encaminhamento de Portos"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Pesquisar de Novo"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Activar a pesquisa da pasta1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Activar a pesquisa da pasta2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Activar a pesquisa da pasta3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Local da pasta 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Local da pasta 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Local da pasta 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Se deseja aceder à torrente de forma silenciosa ou não."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Foi assinalada a acção de remoção."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Foi assinalada a acção de movimentação."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Preferências da Pesquisa de Pastas"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Pesquisar a pasta &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Pesquisar a pasta &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Pesquisar a pasta &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Mover para a pasta \"loaded\" &após o carregamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Move a torrente para a pasta \"loaded\" após o carregamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Abrir silenc&iosamente as torrentes"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Não mostrar a janela 'Seleccionar os ficheiros a obter'"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Remover após o carre&gamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Remove a torrente após o carregamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Pastas a pesquisar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Pasta 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Pasta 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Pasta 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Preferências de Procura"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Servidor Web"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Porto de encaminhamento"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL da Sessão (em s):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Seleccionar a interface:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Utilizador:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Mudar a senha..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Local do executável 'php':"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Número do porto"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Porto de encaminhamento"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Tempo de vida da sessão"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "visual da interface"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Local do executável 'php'"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "utilizador"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "senha"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Blocos"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Total:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Actualmente a receber:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Obtido:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Excluído:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Falta:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Tamanho:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Bloco"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Evolução"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Ponto"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Pontos Atribuídos"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Origens:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Receptores:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Velocidade Média de Recepção:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Velocidade Média de Envio:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Próxima actualização em:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Estado do Localizador:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Partes da torrente que já foram transferidas:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Partes da torrente que já estão disponíveis:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Partilha"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"O seu envio irá parar quando a taxa de partilha atingir este valor. O zero "
+"significa sem limites."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"O seu envio irá parar quando tiver enviado durante este número de horas."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Horas"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Limite de proporções:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "O limite só funciona no modo de fonte"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Limite de tempo:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Act&ualizar o Localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Intervalo mínimo de actualização - 60 segundos"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Adiciona&r um Localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Remover o Localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "&Mudar o Localizador"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Repor as Predefinições"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Mostrar página de parceiros na janela principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Mostrar página de pedaços obtidos na janela principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Mostrar a página de localizadores na janela principal"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Mostrar lista de parceiros"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Mostrar a l&ista de pedaços actualmente a transferir"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Mostrar lista de localizadores"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Preferências do Bloqueio de IPs"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Seleccione o Ficheiro do Filtro do PeerGuardian "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Usar o filtro do PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Ficheiro de filtro de IPs:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Obter/Co&nverter"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Transfira o filtro PeerGuardian de bluetack.co.uk ou blocklist.org.\n"
+"NOTA: é suportado o ficheiro ZIP do bluetack.co.uk."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL do filtro de Nível 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Usar o filtro de nível 1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "A converter..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Carregue no botão 'converter' para começar a conversão do ficheiro 'antip2p'. "
+"NOTA: Este processo poderá levar algum tempo, mesmo em máquinas rápidas, e "
+"durante esse tempo não poderá usar o KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Actualizar"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Actualizar os gráficos a cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Actualizações da interface"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Recolher dados a cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisegundos"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Máximo"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Modo de escala da velocidade máxima:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Exacta"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Ver a ajuda 'O Que é Isto?' para saber mais"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Definir o valor máximo na escala OY como:\n"
+"- Topo: A velocidade máxima obtida a nível global\n"
+"- Exacta: A velocidade máxima obtida no gráfico"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Velocidade dos pontos"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Velocidade dos pontos:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "actualizar a cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "actualizações de dados do gráfico"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "A recolha de dados dos pontos ligados poderá consumir algum CPU."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Ligações dos pontos:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+"Os valores altos poderão tornar obscuros os gráficos dos pontos ligados"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Mostrar as sementes em enxames"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Mostrar os receptores em enxames"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Contagem de medidas"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Envio"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Ligações"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Pontos"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Comutar os gráficos de velocidade dos pontos"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Intervalo de obtenção dos dados de velocidade dos pontos"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Comutar o desenho dos receptores em enxames"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Comutar o desenho das sementes em enxames"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Contagem de medidas de recepção"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Número de medidas de velocidades dos pontos"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Contagem de medidas de envio"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Contagem de medidas das ligações"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Contagem de medidas de DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Modo dos máximos no eixo OY"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importa uma transferência existente"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrente:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Dados:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Indique por favor a torrente e os dados já transferidos para essa torrente."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importar"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "por omissão"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Fontes de RSS"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Fontes"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "Apa&gar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nova"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artigos"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Actualiza&r automaticamente"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnorar o TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Actualizar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Título"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Manter os Artigos (dias)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Activo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Aceitar os Filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Rejeitar os Filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Expressões Regulares"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Tratar como &Série"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Processo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Critério da Série"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Ocorrência sem Episódio"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Episódio Máx"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Série Máx"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Série Mín"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Episódio Mín"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Testa o te&xto"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&star"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Ocorrências do Filtro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Calendarização da largura de banda"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Categoria do botão esquerdo"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Categor&ia 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "&Desligar"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Categoria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Categoria &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Categoria do botão direito"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Categoria &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Categoria 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Categorias"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "recepção:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "envio:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* o zero significa ilimitado"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Gravar num ficheiro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Ler de um ficheiro"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Reiniciar o calendário"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&K"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Página de Preferências do 'Plugin' de Escalonamento"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Usar a calendarização da largura de &banda?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Calendarização da Largura de Banda"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Usar cores em ve&z de imagens?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Recomendado para os sistemas mais lentos)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Editar o &calendário"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Activar a calendarização da largura de banda?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Usar cores em vez de imagens?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Usar o texto formatado no registo"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Sinal de mensagens de informação geral"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Sinal de mensagens de ligações"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Sinal de mensagens DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Sinal de mensagens de informação do localizador"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Sinal de mensagens de informação da E/S do disco"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' do IPFilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' de pesquisa"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' InfoWidget"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' de UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' da Pesquisa de Pastas"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' de Escalonamento"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' de RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Sinal das mensagens do 'plugin' da Interface Web"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Opções do Visualizador do Registo"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "'Plugins'"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Tudo"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Depuração"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Aviso"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Importante"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Nada"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "Filtro de IPs:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Procurar:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Pesquisa de Pastas:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Calendarização:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "'Plugin' de RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "'Plugin' da Interface Web:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistema"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Geral:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Ligações:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "E/S Disco:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Usar te&xto formatado no registo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Navegador Externo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Abrir as pesquisas num navegador externo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Usar o navegador predefinido"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Localização do navegador personalizado:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Motores de Busca"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Nome do motor de busca:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Adicionar"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Motores"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "R&emover Tudo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Adicionar Prede&finição"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Actualizar da Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Procurar"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Motor de busca:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Motor de busca actual"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Usar um navegador personalizado"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Local do executável do navegador personalizado"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dia \n"
+"%n dias "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Sim, Primeiro"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Sim, Último"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Não é possível abrir o ficheiro de registo %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Não é possível escrever em %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Não é possível ler de %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Não é possível criar a pasta %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Não é possível criar uma ligação simbólica de %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Não é possível mover de %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Não é possível copiar de %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Não é possível remover %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Impossível criar o %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Não é possível calcular o tamanho do ficheiro %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Não é possível calcular o tamanho do ficheiro : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Não é possível aceder ao %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Não é possível expandir o ficheiro : %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Não é possível expandir o ficheiro"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Não é possível procurar no ficheiro : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Não é possível escrever para além do espaço do 'mmap'!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Estado: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Carregado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Não carregado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opções do 'Plugin'"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Não é possível aceder ao ficheiro %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "A pasta %1 não existe"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Item inválido: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Erro de descodificação"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Fim de dados inesperado"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Não é possível converter %1 para um inteiro"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "A torrente está incompleta!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrente corrompida!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "A torrente não tem um campo de anúncio ou de nós"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Não é possível aceder ao ficheiro de torrente %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Erro de Processamento"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Ocorreu um erro ao carregar a torrente. A torrente poderá estar corrompida, ou "
+"não ser sequer um ficheiro de torrente.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Ocorreu um erro ao carregar a torrente. A torrente poderá estar corrompida, ou "
+"não ser sequer um ficheiro de torrente."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Não é possível criar o %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Já está a transferir esta torrente %1, pelo que a lista de localizadores de "
+"ambas as torrentes foi reunida."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Já está a transferir a torrente %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Não é possível migrar o %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"A torrente %1 foi iniciada com uma versão anterior do KTorrent. Para garantir "
+"que esta torrente ainda funciona com esta versão do KTorrent, ela será migrada. "
+"Será pedida a localização para onde gravar a torrente. Se carregar em Cancelar, "
+"será seleccionada a sua pasta pessoal."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Seleccionar a Pasta Onde Gravar"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Não iniciado"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "A criar semente"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "A obter"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Parado"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Parado"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Erro: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "A reservar o espaço em disco"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Em espera"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "A verificar os dados"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Interrompido. Não existe espaço livre em disco."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Não tem espaço livre suficiente para transferir esta torrente. Tem a certeza "
+"que deseja continuar?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Espaço em disco insuficiente para o %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"A torrente \"%1\" atingiu a sua taxa de partilha máxima. Deseja ignorar o "
+"limite e começar a publicação da fonte à mesma?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "A taxa máxima de partilhas foi atingida."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Erro ao parar a torrente %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Erro ao gravar a torrente %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "A anunciar"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Cliente desconhecido"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 parceiro\n"
+"%n parceiros"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Impossível criar o ficheiro %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Não foi possível gravar o primeiro bloco no ficheiro DND : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Não foi possível gravar o último bloco no ficheiro DND : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Não é possível aceder ao %1 para escrita : sistema apenas para leitura"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Não é possível expandir o ficheiro %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Não é possível expandir o ficheiro %1 : gravação incompleta"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Não é possível expandir o ficheiro %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Erro : A ler após o fim do ficheiro %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Erro ao ler de %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Erro ao gravar para %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Erro ao gravar para %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Não é possível reservar previamente espaço em disco : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+"Não foi possível fazer 'bind' ao porto UDP %1 ou aos 10 portos seguintes."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Resposta inválida do localizador"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Dados inválidos do localizador"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "URL inválido do localizador"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Não é possível criar o ficheiro %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Não é possível criar o ficheiro de índice: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Não é possível aceder ao ficheiro : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Usa o UPnP para encaminhar automaticamente os portos no seu 'router'"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Não foi possível encontrar o serviço de encaminhamento na descrição do "
+"dispositivo!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Dispositivos UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Pesquisa automaticamente as pastas à procura de ficheiros de torrentes e "
+"carrega-os."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Pesquisa de Pastas"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Pesquisa de Pastas"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opções da Pesquisa de Pastas"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "carregado"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Pesquisa de Pastas - Pasta %1: O URL ou pasta inválido não existe. Por favor, "
+"escolha uma pasta válida."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Interface Web"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Opções da Interface Web"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"O executável 'php' não está num local predefinido; indique manualmente por "
+"favor o local"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Indique por favor uma senha nova para a interface Web."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 existe e é executável"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 não existe"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 não é executável"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 é uma pasta"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 não é um local do executável 'php'"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Interface Web"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Permitir controlar o KTorrent através de um navegador"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Obtenção dos Primeiros"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Obtenção Normal"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Obtenção dos Últimos"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Remover os Ficheiros"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Disponível"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Pendente"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Irá perder todos os dados deste ficheiro; tem a certeza que quer fazer isto ?\n"
+"Irá perder todos os dados destes ficheiros; tem a certeza que quer fazer isto ?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Sem limite"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Janela de Informação"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Mostra informações adicionais acerca de uma transferência, como os blocos já "
+"obtidos, quantos fornecedores e receptores ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Não é possível adicionar um localizador a uma torrente privada."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Não é possível remover o localizador predefinido."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Não é possível adicionar localizadores a uma torrente privada"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "País"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Cliente"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Entupido"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Ignorado"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Disponibilidade"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Pontuação"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Bloco de Envio"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Pedidos"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Expulsar o ponto"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Banir o ponto"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Pedaços Disponíveis"
+"<br><img src=\"unavailable_color\">&nbsp; - Pedaços Não Disponíveis"
+"<br><img src=\"excluded_color\">&nbsp; - Pedaços Excluídos"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opções da Janela de Informação"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Pedaços Transferidos"
+"<br><img src=\"unavailable_color\">&nbsp; - Pedaços a Transferir"
+"<br><img src=\"excluded_color\">&nbsp; - Pedaços Excluídos"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Converter"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "A carregar o ficheiro TXT..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Aguarde por favor..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "O ficheiro foi convertido."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Não foi possível carregar o filtro:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"O ficheiro de filtro é inválido. Poderá estar corrompido ou ter um formato "
+"inválido."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtra os pontos indesejados com base no seu endereço IP"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "Filtro de IPs"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Estado: Carregado e em execução."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Estado: Não carregado."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Estado: <font color=\"#ff0000\">O ficheiro do filtro não foi encontrado.</font> "
+"Obtenha e converta o ficheiro do filtro."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "O ficheiro seleccionado já existe, deseja obtê-lo de novo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "O Ficheiro Existe"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"O ficheiro do filtro (level1.dat) já existe, deseja convertê-lo de novo?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtro de Bloqueio de IPs"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opções do Filtro de Bloqueio de IPs"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Estatísticas"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Opções de estatísticas"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Receptores ligados"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Receptores em grupos"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Fontes ligadas"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Fontes em grupos"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Média de receptores ligados por torrente"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Média de fontes ligadas por torrente"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Média de receptores ligados por cada torrente em execução"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Média de fontes ligadas por cada torrente em execução"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Nós"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Tarefas"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Mostrar as estatísticas de transferências"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Estatísticas de velocidade"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Estatísticas de ligação"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Actual"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Média"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Limite"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Média do receptor"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Média para o receptor"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Média da fonte"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Dos receptores"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Das fontes"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Ficheiros de torrente"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Todos os ficheiros"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Não é possível verificar os dados : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Não é possível carregar a torrente: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Importa torrentes parciais ou completas de outros clientes"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importar uma transferência existente"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL da fonte"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Analisa automaticamente as fontes de RSS à procura de expressões regulares "
+"correspondentes a torrentes e carrega-os."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Fontes RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Não foi possível encontrar e obter uma torrente válida para o %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Título"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Descrição"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Ligação"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Série"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episódio"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tempo"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Calendarização"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opções do 'plugin' de calendarização"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "SEG"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "TER"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "QUA"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "QUI"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "SEX"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SÁB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "DOM"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "O calendário foi gravado."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "O ficheiro não foi encontrado."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "O calendário foi lido."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "'Plugin' de calendarização da largura de banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Abrir a Calendarização da Largura de Banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"A calendarização da largura de banda está desactivada. Vá a Preferências->"
+"Calendarização para a activar."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Visualizador do Registo"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Visualizador do Registo"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Mostra o resultado do registo do KTorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Utilize o seu navegador Web para procurar pelo texto %1 (em maiúsculas) no "
+"motor de busca que deseja adicionar."
+"<br> Copie então o URL na barra de endereços após a procura terminar, e cole-a "
+"aqui."
+"<br>"
+"<br>Por exemplo, ao procurar por %1 no Google, resulta em "
+"http://www.google.com/search?q=XPTO&ie=UTF-8&oe=UTF-8."
+"<br>Se adicionar aqui este URL, o ktorrent pode procurar com o Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Use o seu navegador Web para procurar pelo texto %1 (letras maiúsculas) no "
+"motor de busca que deseja adicionar. Use o URL resultante abaixo."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Deve indicar o nome do motor de busca e a URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Já existe um motor de busca com o mesmo nome. Por favor utilize um nome "
+"diferente."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"URL inválido. Deve procurar por FOOBAR com o seu navegador Web e copiar e colar "
+"o URL exacto aqui."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Procura"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opções de Motor de Busca"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "À procura de %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "ficheiros de torrente"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Pesquisa terminada"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Motor: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+"Procura por torrentes em vários motores de busca de torrentes conhecidos"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Deseja transferir ou gravar a torrente?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Transferir Torrente"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Transferir"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Procura pontos a executar o KTorrent na rede local com quem partilhar torrentes"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algoritmo do ETA:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Não é possível carregar o bloco %1"
diff --git a/translations/pt_BR/Makefile.am b/translations/pt_BR/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/pt_BR/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/pt_BR/messages/Makefile.am b/translations/pt_BR/messages/Makefile.am
new file mode 100644
index 0000000..2046214
--- /dev/null
+++ b/translations/pt_BR/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = pt_BR
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/pt_BR/messages/ktorrent.po b/translations/pt_BR/messages/ktorrent.po
new file mode 100644
index 0000000..2eafd97
--- /dev/null
+++ b/translations/pt_BR/messages/ktorrent.po
@@ -0,0 +1,5055 @@
+# translation of ktorrent.po to Português do Brasil
+#
+# Waldemar Silva Júnior <wsjunior@kdemail.net>, 2005.
+# Waldemar Silva Junior <wsjunior@kdemail.net>, 2005.
+# doutor.zero <doutor.zero@gmail.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"Report-Msgid-Bugs-To: http://bugs.kde.org\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-08-10 20:52-0300\n"
+"Last-Translator: doutor.zero <doutor.zero@gmail.com>\n"
+"Language-Team: Português do Brasil <kde-i18n-pt_br@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: Portuguese\n"
+"X-Poedit-Country: BRAZIL\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Nenhuma conexão de entrada (possivelmente sob firewall)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Informações"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Dados transferidos durante a sessão atual"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Velocidade atual de todos os torrents combinados"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupos"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Iniciar"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Parar"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Iniciar Todos"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Parar Todos"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Colar URL do Torrent..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Abrir Gerenciador de Fila..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Adicionar/Remover da Fila"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "FiltroIP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Verificar Integridade dos Dados"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Definir taxa máx. de upload"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Definir taxa máx. de download"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Arquivos Torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Todos os Arquivos"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Abrir"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Velocidade down: %1 / up: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Transferidos down: %1 / up: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 nós, %2 tarefas"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: desligado"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Todos os Torrents"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Mover para o dock da esquerda"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Mover para o dock da direita"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Mover para o dock de baixo"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Especificar Acelerador..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Limpar Acelerador"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Alterar Número do Botão"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Novo número do acelerador:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Você precisa entrar com o IP no formato 'XXX.XXX.XXX.XXX'. Você também pode "
+"usar curingas para faixas como '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Escolha um arquivo"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Escolha um nome de arquivo para salvar como"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "URL mal formada."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Downloads"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Uploads"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"A porta especificada (%1) não está disponível ou está em uso por outro "
+"aplicativo. O KTorrent está usando agora a porta %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"O KTorrent não é capaz de aceitar conexões, porque as portas %1 a %2 já estão "
+"sendo usadas por outro programa."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Não foi possível criar o torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Vários arquivos de dados do torrent \"%1\" estão faltando. Você deseja "
+"recriá-los, ou deseja que eles não sejam baixados?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Recriar"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Não Baixar"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Não foi possível recriar os arquivos faltando: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Arquivos de dados estão faltando"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Não foi possível deselecionar os arquivos faltando: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"O arquivo onde os dados do torrent \"%1\" são salvos está faltando. Você deseja "
+"recriá-lo?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Recriar"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Não foi possível recriar o arquivo de dados: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Arquivo de dados está faltando"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Verificando a Integridade dos Dados"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "Infinito"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Erro ao escanear dados: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Escaneando dados de <b>%1></b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "A programa de BitTorrent para o KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Modo de depuração"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Documento para abrir"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Plugin RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Plugin Webinterface "
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Plugin de Estatísticas"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Ícone do aplicativo e um par de outros"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "O ícone de downloads"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Ícone do aplicativo 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Tooltip da ChunkBar e organização da IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Localizador de país para o plugin InfoWidget (Esse produto inclui dados GeoLite "
+"criados por MaxMind, disponíveis em http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Bandeiras dos países"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Priorização de arquivo"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "O miniupnp foi usado como exemplo para a nossa própria implementação"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Patch de proporção de compartilhamento máx."
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Melhorias no zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk webgui"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Código IDEAl do KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Melhoria na velocidade de conversão do plugin ipfilter"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Descobriu duas vulnerabilidades de segurança (ambas foram corrigidas)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Patch para carregar silenciosamente com uma localização para salvar"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Correções no código PHP do webinterface"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Pré-alocação de disco especifica do XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Patch para não mostrar velocidades muito baixas"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Patch para mostrar o status de potencialmente sob um firewall"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Vários patches"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Vários patches"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Filtrar Coincidências"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Patch para carregar silenciosamente com uma localização para salvar"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Você deve selecionar um arquivo ou um diretório."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Você não adicionou um tracker. Tem certeza que deseja criar esse torrent?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Você precisa adicionar pelo menos um node."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Arquivos Torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Escolha o Arquivo para Salvar o Torrent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Criando %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Grupos Personalizados"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Novo Grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Editar Nome"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Remover Grupo"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Abrir Aba"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Por favor digite o nome do grupo."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "O grupo %1 já existe."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Por favor digite o nome do novo grupo."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Uploads ativos"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Uploads na fila"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Downloads na fila"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Downloads do usuário"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Uploads do usuário"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Torrents inativos"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Downloads inativos"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Uploads inativos"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Torrents ativos"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Downloads ativos"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Remover Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Remover Torrent e Dados"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Adicionar Peers"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Fontes de Peers Adicionais"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Fontes de Peers do Torrent:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Troca de Peers"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Anúncio Manual"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Pré-Visualização"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Abrir Diretório"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Diretório de Dados"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Diretório Temporário"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Definir Localização do Download"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Remover Do Grupo"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Adicionar ao Grupo"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Limites de Velocidade"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"O torrent não existe. Reporte esse erro aos desenvolvedores do KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Peer potencial adicionado."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Endereço IP mal formado."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Preferências"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opções de Download"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "A porta do DHT precisa ser diferente da porta UDP do tracker!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Geral"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opções Gerais"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Não foi possível recuperar %1: %2\n"
+"Por favor forneça um endereço IP ou nome de máquina válido."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avançadas"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Opções Avançadas"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Colunas visíveis"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Baixados"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Tamanho"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Enviados"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Velocidade de Down"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Velocidade de Up"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tempo Restante"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Semeadores"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Leechers"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Concluído"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Proporção de Compartilhamento"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Tempo Baixando"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Tempo Semeando"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Todos os Torrents %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Não é possível iniciar mais que um download, \n"
+"Não é possível iniciar mais de %n downloads, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"e uma semente. \n"
+"e %n sementes. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Vá até Configurações -> Configurar KTorrent, se você deseja mudar os limites."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"O download do torrent %1 ainda não terminou. Você deseja apagar os dados "
+"incompletos, também?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Remover Download"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Apagar Dados"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Manter Dados"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Você perderá todos os dados baixados. Tem certeza que deseja fazer isso?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Você já está verificando os dados do torrent %1 !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Escolha a localização do download para %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Você deselecionou os seguintes arquivos existentes. Você perderá todos os dados "
+"destes arquivos. Você tem certeza que deseja fazer isso?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Sim, apagar os arquivos"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Não, manter os arquivos"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " curto!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Usuário"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Gerenciador de Fila"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Não (torrent privado)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Velocidade:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> concluiu o download.<br>Velocidade média: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Download concluído"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> atingiu sua proporção de compartilhamento máxima de %2, e foi parado."
+"<br>Enviados %3, a uma velocidade média de %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Semeamento concluído"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> atingiu seu tempo de semeamento máximo de %2 horas, e foi parado."
+"<br>Enviados %3, a uma velocidade média de %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> foi parado com o seguinte erro: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Dados corrompidos foram encontrados no torrent <b>%1</b>"
+"<br>Seria uma boa idéia verificar a integridade dos dados do torrent."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> atingiu sua proporção de compartilhamento máxima de %2, e não pode "
+"ser colocado na fila. Remova o limite manualmente se você deseja continuar "
+"semeando."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> atingiu seu tempo de semeamento máximo de %2 horas, e não pode ser "
+"colocado na fila. Remova o limite manualmente se você deseja continuar "
+"semeando."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "O torrent não pode ser colocado na fila."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Não foi possível iniciar <b>%1</br> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Não é possível semear mais que 1 torrent. "
+"<br>\n"
+"Não é possível semear mais que %1 torrents. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Não é possível baixar mais que 1 torrent. "
+"<br>\n"
+" Não é possível baixar mais que %1 torrents. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "O torrent não pôde ser iniciado"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Não existe espaço suficiente no disco."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Seu disco está ficando sem espaço.<br /><b>%1</b> está sendo baixado para '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "O torrent foi parado.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "O dispositivo está ficando sem espaço"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Limite da velocidade em KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Ilimitada"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Limites de velocidade para <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Um aplicativo KDE KPart"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Não foi possível abrir o arquivo de índice %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Waldemar Silva Júnior"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "wsjunior@kdemail.net"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Selecione quais arquivos você deseja baixar"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Baixar para:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupo:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Controlado pelo &usuário"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Iniciar torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Baixar"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Selecionar &Todos"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Selecionar &Nenhum"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Inverter Seleção"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Espaço em disco"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Espaço em disco necessário:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Espaço livre no disco:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Após o download:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Encriptação"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Usar encriptação de protocolo"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Encriptação de protocolo é usada para prevenir que ISPs diminuam a velocidade "
+"das conexões bittorrent."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Permitir conexões não encriptadas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Se não estiver selecionada, você somente será capaz de se conectar à clientes "
+"que suportem encriptação."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Protocolo <b>D</b>istributed <b>H</b>ash <b>T</b>able."
+"<br>Protocolo descentralizado de troca de peers. Veja o manual para mais "
+"informações."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Usar DHT para obter peers adicionais"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Porta UDP para a comunicação do DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "IP Personalizado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "E&nviar para o tracker um IP ou nome de máquina personalizado"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "IP ou nome de máquina personalizado:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ícone da Área de Notificação do Sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Mostrar ícone na área de notificação do s&istema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr ""
+"Mostrar &barra de velocidade no ícone da área de notiificação do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Mo&strar mensagens popup na área de notificação do sistema"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Largura da banda de upload (em KB/seg):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Largura da banda de download (em KB/seg):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Pastas"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Pasta para armazenar os arquivos temporários:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Mover downloads completados para:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Salvar downloads &automaticamente para:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Copiar arquivos .torrent para:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Barra de ferramentas de Download"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Definir os limites de velocidade para o torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Taxa máx. de upload:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Taxa máx. de download:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 é sem limite)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Adicionar peer potencial"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP do Peer:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Porta:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Digite o IP do peer e a porta."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Lista Negra do KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Atenção: a lista negra se aplica apenas à sessão atual. Use salvar/abrir para "
+"salvar suas entradas ou use o plugin IPFilter (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Peers Banidos"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Endereço IP do peer"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Adicionar peer:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Adiciona um peer à lista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Remove o peer selecionado da lista negra"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "&Limpar"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Limpa à lista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Salvar &Como..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Salvar esta lista negra para usá-la com o plugin IPFilter do KTorrent"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Máximo de downloads:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Máximo de sementes:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Iniciar o download no disco com pouco espaço :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Espaço mínimo no disco:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Não iniciar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Sempre perguntar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Forçar início"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 é sem limite)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Taxa máxima de download:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Limite global de conexões:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Tempo máx. para semear:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Conexões máximas por torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Número de espaços de upload:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Porta UDP do tracker:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Proporção de compartilhamento máx.:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Taxa máxima de upload:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/seg (0 corresponde à sem limite)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Horas (0 é sem limite)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Permanecer semeando após o download terminar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Atenção"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"As portas acima também precisam ser encaminhadas, caso você esteja conectado a "
+"um router. O plugin UPnP pode fazer isso para você."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Diálogo de Fila do KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Proporção de compartilhamento:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Bytes restando:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Controlado pelo"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Upload&s"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Enviados:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "M&over para cima"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Mover para &baixo"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Mover para o topo"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Mover para &baixo "
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Controlado pelo &GF"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Controlado pelo &Usuário"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Colar URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "C&ancelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Criar Torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "O arquivo ou diretório do qual você deseja criar um torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Você precisa adicionar pelo menos um tracker ou node."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opções de Arquivo"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Tamanho de cada bloco:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Começar a sem&ear o torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Descentrali&zado (somente DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Torrent privado (DHT não é permitido)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Comentários:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Criar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Ca&ncelar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackers"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Nodes DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Node:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP ou nome de máquina"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Porta"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Atenção: Alguns nodes DHT reconhecidamente bons já estão inseridos. Você "
+"deveria inserir seu próprio endereço IP e também a porta, se planeja semear "
+"esse torrent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Preferências Avançadas"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Algoritmo KTorrent:</b> Algoritmo padrão, usando uma combinação de outros "
+"algoritmos baseada nos nossos testes."
+"<br>\n"
+"<b>Algoritmo de velocidade atual:</b> O algoritmo mais simples - "
+"BytesRestando/VelocidadeAtual"
+"<br>\n"
+"<b>Algoritmo de velocidade média global:</b> BytesRestando/VelocidadeMédia"
+"<br>\n"
+"<b>Algoritmo de janela de X:</b> TE calculado de X amostras de velocidade"
+"<br>\n"
+"<b>Algoritmo de movimento médio:</b> Velocidade média de movimento, calculada "
+"de X amostras"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Velocidade atual"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Velocidade global média"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Janela de X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Movimento médio"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(só será aplicado após reiniciar)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "De&sabilitar pré-alocação de disco"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Pré-alocar &totalmente o espaço em disco (previne fragmentação)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Básico (lento)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Específico do sistema de arquivos"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Performance"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Uso da memória:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Baixo"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Médio"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Alto"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Intervalo de atualização da interface:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "CPU Rápida"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "CPU Lenta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Verificação dos Dados"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Durante o upload, &não rechecar blocos maiores que"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Executar uma checagem de &integridade dos dados depois"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "blocos corrompidos"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Networking"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Número máximo de conexões por torrent (0 = sem limite)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+"Não usar as configurações de pro&xy do KDE para conexões de tracker HTTP"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP tracker proxy:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Escaneando dados"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Escaneando dados do torrent :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Número de blocos encontrados:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Número de blocos com falhas / não baixados:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Testar"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "etiquetaTexto2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "etiquetaTexto3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Número máximo de downloads (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Número máximo de sementes (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Iniciar downloads com pouco espaço em disco?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Número máximo de conexões por torrent (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Número máximo de conexões para todos os torrents (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Velocidade máxima de upload em KB/seg (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Velocidade máxima de download em KB/seg (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Proporção de compartilhamento máxima (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Tempo máximo de semeamento em horas (0 = sem limite)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Mostrar um ícone na área de notificação do sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Mostrar barra de velocidade no ícone da área de notificação do sistema"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Largura da banda de download (em kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Largura da banda de upload (em kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Mostrar mensagens popup quando o torrent for concluído."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Permanecer semeando após o download terminar"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Pasta para armazenar os arquivos temporários"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Salvar downloads automaticamente para o saveDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Pasta para armazenar os arquivos baixados"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Mover automaticamente downloads completados para o completeDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Pasta para mover os arquivos baixados completados"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Copiar automaticamente os arquivos .torrent para o torrentCopyDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Pasta para copiar os arquivos .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Usar um IP personalizado, que será enviado ao tracker"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Diretório que foi usado como último local para salvar"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP para enviar ao tracker"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Uso da memória"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Intervalo de atualização da interface"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Suporte ao DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Porta DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Número de espaços de upload"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Colunas mostradas no KTorrentView"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algoritmo TE"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Quando não existir espaço sobrando para completar o download e o espaço livre "
+"no disco for menor que minDiskSpace, o torrent será parado."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Gerenciador de Plugins"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Carregar"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Descarregar"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Carregar &Todos"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Descarregar Todos"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Dispositivo UDP padrão para o uso"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Dispositivos detectados:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Dispositivo"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Portas Encaminhadas"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Conexão WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Encaminh&ar Portas"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Desfazer Encaminhamento de Portas"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Re-escanear"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Habilitar escaneamento da pasta1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Habilitar escaneamento da pasta2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Habilitar escaneamento da pasta3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Caminho da pasta1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Caminho da pasta2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Caminho da pasta3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Abrir o torrent silenciosamente ou não."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Ação de apagar verificada."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Ação de mover verificada."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Preferências de Escanear Pasta"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Escanear pasta &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Escanear pasta &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Escanear pasta &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Mover para o diretório de \"carregados\" &após o carregamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Mover torrent para o diretório de \"carregados\" após carregá-lo"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Abrir torrents silenc&iosamente"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Não mostrar o diálogo 'Selecionar arquivos para baixar'"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Apagar após carre&gar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Apaga o torrent após o carregamento"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Pastas para escanear"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Pasta 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Pasta 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Pasta 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Preferências de Busca"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Servidor Web"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Encaminhar porta"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL da Sessão (em seg.):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Selecionar interface:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Nome de usuário:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Alterar senha..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Caminho do executável do php:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Número da porta"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "encaminhar Porta"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Tempo para manter a sessão ativa"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Skin de interface"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Caminho do executável do php"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "nomedousuário"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "senha"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Blocos"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Total:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Atualmente baixando:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Baixados:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Excluídos:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Restando:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Tamanho:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Bloco"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Progresso"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Peer"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Peers Designados"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Semeadores:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Leechers:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Velocidade Média de Down:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Velocidade Média de Up:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Próxima atualização em:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Status do Tracker:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Partes do torrent que já foram baixadas:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Partes do torrent que estão disponíveis:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Compartilhando"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Seu upload irá parar quando a proporção de compartilhamento atingir esse valor. "
+"Zero significa sem limite."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Seu upload irá parar quando você tiver enviado por esse número de horas."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Horas"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Limite de taxa:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "O limite somente funciona ao semear"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Limite de tempo:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "At&ualizar Tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Intervalo de atualização mínimo - 60 segundos"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Adicionar Trac&ker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Remover Tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "&Alterar Tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Restaurar Padrões"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Mostrar indicação de peer na janela principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Mostrar indicação de baixa de bloco na janela principal"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Mostrar aba de visualização de trackers na janela principal"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Mostrar lista de peers"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Mostrar lista dos blocos que estão &sendo baixados"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Mostrar lista dos trackers"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Preferências do IPBlocking"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Selecionar o Arquivo de Filtro PeerGuardian "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Usar filtro PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Arquivo do filtro de IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Bai&xar/Converter"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Baixar o filtro PeerGuardian de bluetack.co.uk ou blocklist.org.\n"
+"ATENÇÃO: arquivos ZIP de bluetack.co.uk são suportados."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Filtro de URL nível1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Usar filtro de URL nível1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Convertendo..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Clique no botão 'converter' para iniciar a conversão do arquivo antip2p. "
+"ATENÇÂO: esse processo pode demorar, mesmo em máquinas rápidas e, durante esse "
+"tempo, você não será capaz de usar o KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Atualizar"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Atualizar gráficos a cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Atualizações da interface"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Coletar dados a cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisegundos"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Máxima"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Modo de escala da velocidade máxima:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Exato"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Veja 'O que é isso' para mais ajuda"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Definir o valor máximo na escala OY como:\n"
+"-Topo: Velocidade global máxima alcançada\n"
+"-Exato: Velocidade máxima alcançada, visível no gráfico"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Velocidade dos peers"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Velocidade dos peers:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "atualizar a cada"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "atualizações dos dados do gráfico"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Coletar dados sobre muitos peers conectados pode consumir bastante CPU."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Conexões dos peers"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Valores altos podem ocultar os gráficos de peers conectados"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Mostrar semeadores em swarms"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Mostrar leechers em swarms"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Medidas de contagem"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Upload"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Conexões"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Mostrar gráficos de velocidade"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Intervalo entre a obtenção dos dados sobre a velocidade dos peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Mostrar leechers em swarms"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Mostrar semeadores em swarms"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Medidas de contagem de download"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Medidas de contagem da velocidade dos peers"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Medidas de contagem do upload"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Medidas de contagem de conexões"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Medidas de contagem do DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Modo máx. do eixo OY"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importar um download existente"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Dados:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Por favor especifique o torrent e os dados que já foram baixados para este "
+"torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importar"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "padrão"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Feeds Rss"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Feeds"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "Apa&gar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Novo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artigos"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Atualização a&utomática"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnorar TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Atualizar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Título"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Manter Artigos (dias)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Ativo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Aceitar Filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Rejeitar Filtros"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Expressões Comuns"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Tratar como %Séries"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Processo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Critério das Séries"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Coincidir Sem Episódio"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Episódio Máx."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Temporada Máx."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Temporada Mín."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Episódio Mín."
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Testar te&xto"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&star"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtrar Coincidências"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Agendador de largura de banda"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Categoria do clique esquerdo"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Categor&ia 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "Des&ligar"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Categoria &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Categoria &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Categoria do clique direito"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Categoria &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Categoria 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Categorias"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "baixar:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "enviar:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Categoria</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* zero corresponde à sem limite"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Salvar para arquivo"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Carregar do arquivo"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Resetar agendamento"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&k"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Página de Preferências do Plugin de Agendamento"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Usar agendador de largura de &banda?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Agendador de Largura de Banda"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Usar cores ao invés de mapas de pí&xels?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Recomendado para sistemas mais lentos)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Editar &agendamento"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Habilitar agendador de largura de banda?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Usar cores ao invés de mapas de píxels?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Usar texto formatado para o log"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Sinal geral das mensagens com informações"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Sinal das mensagens de conexões"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Sinal das mensagens do DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Sinal das mensagens de informações do tracker"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Sinal das informações de IO de disco"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Sinal das mensagens do plugin IPFilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Sinal das mensagens do plugin de busca"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Sinal das mensagens do plugin PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Sinal das mensagens do plugin InfoWidget"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Sinal das mensagens do plugin UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Sinal das mensagens do plugin Escanear Pasta"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Sinal das mensagens do plugin de Agendamento"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Sinal das mensagens do plugin RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Sinal das mensagens do plugin WebInterface"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Opções do LogViewer"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Plugins"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Todas"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Depuração"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Notificações"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Importantes"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Nenhuma"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "FiltroIP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Busca:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "EscanearPasta:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Agendamento:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Plugin RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Plugin Webinterface: "
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistema"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Geral:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Conexões:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "I/O de Disco:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Usar te&xto formatado para o log"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Navegador Externo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Abrir resultados da busca no navegador externo"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Usar navegador padrão"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Caminho do navegador personlizado:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Mecanismos de Busca:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Nome do mecanismo de busca:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Adicionar"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Mecanismos"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "R&emover Todos"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Adicionar Pad&rão"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Atualizar da Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Buscar"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Mecanismo de busca:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Mecanismo de busca atual"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Usar navegador personalizado"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Caminho do executável do navegador personalizado"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dia\n"
+"%n dias "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Sim, Primeiro"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Sim, Por Último"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Não foi possível abrir o arquivo de log %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Não foi possível gravar para %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Não foi possível ler de %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Não foi possível criar o diretório %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Não foi possível criar o link simbólico de %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Não foi possível mover %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Não foi possível copiar %1 para %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Não foi possível deletar %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Não foi possível criar %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Não foi possível calcular o tamanho do arquivo %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Não foi possível calcular o tamanho do arquivo: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Não foi possível abrir %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Não foi possível expandir o arquivo: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Não foi possível expandir o arquivo"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Não foi possível procurar no arquivo: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Não é possível gravar além do fim do buffer mmap!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Status: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Carregado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Não carregado"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opções do Plugin"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Não foi possível abrir o arquivo %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "O diretório %1 não existe"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Sinal Ilegal: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Erro de decodificação"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Fim de entrada inesperado"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Não foi possível converter %1 para um inteiro"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "O torrent está incompleto!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Torrent Corrompido!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "O torrent não possui os campos anúncio ou nós"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Não foi possível abrir o arquivo do torrent %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Erro de Análise"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Um erro ocorreu enquanto o torrent estava sendo carregado. Provavelmente o "
+"torrent está corrompido ou não é um arquivo torrent.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Um erro ocorreu enquanto o torrent estava sendo carregado. Provavelmente o "
+"torrent está corrompido ou não é um arquivo torrent."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Não foi possível criar %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Você já está baixando este torrent %1. A lista dos trackers de ambos os "
+"torrents foi combinada."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Você já está baixando o torrent %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Não foi possível migrar %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"O torrent %1 foi iniciado com uma versão anterior do KTorrent. Para garantir "
+"que esse torrent continue funcionando com esta versão do KTorrent, nós iremos "
+"migrar esse torrent. Você será perguntado por um local onde o torrent deverá "
+"ser salvo. Se você pressionar cancelar, nós iremos selecionar seu diretório de "
+"usuário (home)."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Selecione o Diretório Para Salvar"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Não iniciado"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Semeando"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Baixando"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Parado"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Parado"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Erro: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Alocando espaço em disco"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Na Fila"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Verificando dados"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Parado. Nenhum espaço restando no dispositivo."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Você não possui espaço suficiente no disco para baixar este torrent. Tem "
+"certeza que deseja continuar?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Espaço em disco insuficiente para %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"O torrent \"%1\" atingiu sua proporção de compartilhamento máxima. Ignorar o "
+"limite e começar a semear assim mesmo?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Limite máximo da proporção de compartilhamento atingido."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Erro ao parar o torrent %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Erro ao iniciar o torrent %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Anunciando"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Cliente desconhecido"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"1 peer\n"
+"%n peers"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Não foi possível criar o arquivo %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Falha ao gravar o primeiro bloco no arquivo DND: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Falha ao gravar o último bloco no arquivo DND: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Não foi possível abrir %1 para gravação : sistema somente leitura"
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Não foi possível expandir o arquivo: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Não foi possível expandir o arquivo %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Não foi possível expandir o arquivo %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Erro: a leitura ultrapassou o fim do arquivo %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Erro lendo de %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Erro gravando para %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Erro gravando para %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Não foi possível pré-alocar o espaço em disco: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Não foi possível atar à porta %1 ou às 10 portas seguintes."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Resposta inválida do tracker"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Dados inválidos do tracker"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "URL do tracker inválida"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Não foi possível abrir o arquivo %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Não foi possível criar o arquivo de índice: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Não foi possível abrir o arquivo %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Usa UPnP para encaminhar automaticamente portas no seu router"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Não foi possível encontrar o serviço de encaminhamento de porta na descrição do "
+"dispositivo!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Dispositivos UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Escanear diretórios por arquivos torrent e carregá-los automaticamente."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "ScanFolder"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "ScanFolder"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opções do ScanFolder"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "carregado"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Escanear Pasta - Pasta %1: URL inválida ou a pasta não existe. Por favor, "
+"escolha um diretório válido."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "WebInterface"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Opções do WebInterface"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+#, fuzzy
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"O executável php não está no caminho padrão, por favor digite o caminho "
+"manualmente"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Por favor digite uma nova senha para a interface web"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 existe e é um executável"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "%1 não existe"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+#, fuzzy
+msgid "%1 is not executable"
+msgstr "%1 não é um executável"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 é um diretório"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+#, fuzzy
+msgid "%1 is not php executable path"
+msgstr "%1 não é um caminho do executável php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "WebInterface"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Permitir o controle do ktorrent através do navegador"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Baixar Primeiro"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Baixar Normalmente"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Baixar por Último"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Apagar Arquivo(s)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Disponível"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Pendente"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Você perderá todos os dados neste arquivo. Tem certeza que deseja fazer isso?\n"
+"Você perderá todos os dados nestes arquivos. Tem certeza que deseja fazer isso?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Sem limite"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Widget de Informações"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Mostra informações adicionais sobre um download. Como os blocos que foram "
+"baixados, quantos semeadores e leechers existem..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Não é possível adicionar um tracker em um torrent privado."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Não foi possível remover o tracker padrão do torrent."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Você não pode adicionar trackers a um torrent privado"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "País"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Cliente"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Obstruído"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Repelido"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Disponibilidade"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Pontuação"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Espaço de Upload"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Requisições"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Chutar peer"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Banir peer"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Blocos Disponíveis"
+"<br><img src=\"unavailable_color\">&nbsp; - Blocos Indisponíveis"
+"<br><img src=\"excluded_color\">&nbsp; - Blocos Excluídos"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opções do Widget de Informações"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Blocos Baixados"
+"<br><img src=\"unavailable_color\">&nbsp; - Blocos para Baixar"
+"<br><img src=\"excluded_color\">&nbsp; - Blocos Excluídos"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Converter"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Carregando arquivo txt..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Por favor, aguarde..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Arquivo convertido."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Não foi possível carregar o filtro:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Arquivo de filtro ruim. Ele pode estar corrompido ou ter um formato errado."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtrar peers indesejados baseado no seu endereço IP"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "FiltroIP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: Carregado e executando."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: Não carregado."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Arquivo de filtro não encontrado.</font> "
+"Baixar e converter arquivo de filtro."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "O arquivo selecionado já existe. Você deseja baixá-lo novamente?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "O Arquivo Já Existe"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Arquivo de filtro (level1.dat) já existe. Você deseja convertê-lo novamente?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filtro IPBlocking"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opções do Filtro IPBlocking"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Estatísticas"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Opções das estatísticas"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Leechers conectados"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Leechers em swarms"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Semeadores conectados"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Semeadores em swarms"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Média de leechers conectados por torrent"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Média de semeadores conectados por torrent"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Média de leechers conectados por torrent em execução"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Média de semeadores conectados por torrent em execução"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Nodes"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Tarefas"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Mostra estatísticas de transferências"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Estatísticas de velocidade"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Estatísticas de conexão"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Atual"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Média"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Limite"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Média do leecher"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Média para o leecher"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Média do semeador"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Dos leechers"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Para os semeadores"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Arquivos torrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Todos os arquivos"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Não foi possível verificar os dados : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Não foi possível carregar o arquivo torrent : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Importa torrents baixados parcialmente ou completamente, em outros clientes"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importar download existente"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL do feed"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Escanear automaticamente os feeds RSS por torrents que igualem expressões "
+"regulares, e carregá-los."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Feeds RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Título"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Descrição"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Link"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Temporada"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episódio"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tempo"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Agendador"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opções do Plugin de Agendamento"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "SEG"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "TER"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "QUA"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "QUI"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "SEX"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SAB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "DOM"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Agendamento salvo."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Arquivo não encontrado."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Agendamento carregado."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Plugin de agendamento de largura de banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Abrir o Agendador de Largura de Banda"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"O agendador de largura de banda está desabilitado. Vá até Preferências -> "
+"Agendador para habilitá-lo."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "LogViewer"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Visualizador de Log"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Exibe o log de saída do ktorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Use o seu navegador para procurar pela seqüência %1 (letras maiúsculas) no "
+"mecanismo de busca que você quer adicionar. "
+"<br> Então copie a URL na barra de endereços, após a busca ser completada, e "
+"cole-a aqui."
+"<br>"
+"<br>Procurar por %2 no Google, por exemplo, retornará "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br>Se você adicionar essa URL aqui, o KTorrent pode buscar usando o Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Use seu navegador web para procurar pela seqüência %1 (letras maiúsculas) no "
+"mecanismo de busca que você deseja adicionar. Use a URL resultante abaixo."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Você deve digitar o nome do mecanismo de busca e a URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Um mecanismo de busca com o mesmo nome já existe. Por favor, use um nome "
+"diferente."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"URL ruim. Você deve pesquisar por FOOBAR com seu navegador de internet e "
+"copiar/colar a URL exata aqui."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Busca"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opções do Mecanismo de Busca"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Procurando por %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "arquivos torrent"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Busca concluída"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Mecanismo: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Procurar por torrents em diversos mecanismos de busca populares."
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Você deseja baixar ou salvar o torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Baixar Torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Baixar"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Encontra peers executando o ktorrent na rede local, para compartilhar torrents "
+"com eles."
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Algoritmo ETA:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Não foi possível carregar o bloco %1"
+
+#~ msgid "Alt+X"
+#~ msgstr "Alt+X"
+
+#~ msgid "TrackerViewBase"
+#~ msgstr "TrackerViewBase"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "Tipo do campo de serviço dos pacotes IP"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr "Localização de país para o plugin InfoWidget. As bandeiras são obtidas de http://flags.blogpotato.de/, então obrigado a eles também."
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "Você precisa adicionar pelo menos um tracker."
+
+#~ msgid "DownloadPref"
+#~ msgstr "DownloadPref"
+
+#~ msgid "Alt+K"
+#~ msgstr "Alt+K"
+
+#~ msgid "Alt+B"
+#~ msgstr "Alt+B"
+
+#~ msgid "Alt+U"
+#~ msgstr "Alt+U"
+
+#~ msgid "Alt+A"
+#~ msgstr "Alt+A"
+
+#~ msgid "Alt+L"
+#~ msgstr "Alt+L"
+
+#~ msgid "Max ratio:"
+#~ msgstr "Taxa máx.:"
+
+#~ msgid "Name"
+#~ msgstr "Nome"
+
+#~ msgid "Author"
+#~ msgstr "Autor"
+
+#~ msgid "IP filter plugin, filters out unwanted peers"
+#~ msgstr "Plugin de filtro IP. Filtra peers indesejados"
+
+#~ msgid "Shows logging output in a widget"
+#~ msgstr "Mostra a saída do log em um widget"
+
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Baixar \"Proper\" ReReleases"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "URL do Tracker:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "Status do tracker:"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "A porta udp especificada (%1) não está disponível ou está em uso por outro aplicativo. O KTorrent está usando agora a porta %2."
+
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Selecione a pasta para os dados de %1"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Downloads %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Uploads %1/%2"
+
+#~ msgid "Search Engine:"
+#~ msgstr "Mecanismo de Busca:"
+
+#~ msgid "Clear Search Histor&y"
+#~ msgstr "Limpar Histór&ico de Busca"
+
+#~ msgid "Torrents"
+#~ msgstr "Torrents"
+
+#~ msgid "Tracker"
+#~ msgstr "Tracker"
+
+#~ msgid "St&atus"
+#~ msgstr "St&atus"
+
+#~ msgid "You need to have default save directory selected to load torrents silently."
+#~ msgstr "É preciso que você selecione um diretório padrão, para que os torrents sejam carregados silenciosamente."
+
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+Y"
+
+#~ msgid "InfoWidgetBase"
+#~ msgstr "InfoWidgetBase"
+
+#~ msgid "New"
+#~ msgstr "Novo"
+
+#~ msgid "Show \"torrent finished\" popup messages"
+#~ msgstr "Mostrar mensagens popup de \"torrent concluído\""
+
+#~ msgid "Secure connection with other clients. May also help if your ISP is shaping your traffic."
+#~ msgstr "Conexão segura com outros clientes. Também pode ser útil caso seu ISP esteja controlando sua banda (traffic shaping)."
+
+#~ msgid "Tracker request timed out"
+#~ msgstr "Timeout na requisição do tracker"
+
+#~ msgid "Alt+G"
+#~ msgstr "Alt+G"
+
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+Z"
+
+#~ msgid "finished"
+#~ msgstr "concluído"
+
+#~ msgid "Cannot bind to port %1 or the 10 following ports."
+#~ msgstr "Não foi possível associar à porta %1 ou às 10 portas seguintes."
+
+#~ msgid "You will lose all data in the deselected file(s), are you sure you want to do this ?"
+#~ msgstr "Você perderá todos os dados nos arquivos deselecionados. Tem certeza que deseja fazer isso?"
+
+#~ msgid "Search engines"
+#~ msgstr "Mecanismos de busca"
diff --git a/translations/ru/Makefile.am b/translations/ru/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/ru/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/ru/messages/Makefile.am b/translations/ru/messages/Makefile.am
new file mode 100644
index 0000000..1c418b6
--- /dev/null
+++ b/translations/ru/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = ru
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/ru/messages/ktorrent.po b/translations/ru/messages/ktorrent.po
new file mode 100644
index 0000000..f983a25
--- /dev/null
+++ b/translations/ru/messages/ktorrent.po
@@ -0,0 +1,5003 @@
+# translation of ktorrent.po into Russian
+#
+# Nick Shaforostoff <shafff@ukr.net>, 2005-2007.
+# Gregory Mokhin <mok@kde.ru>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-07-25 02:25+0300\n"
+"Last-Translator: Nick Shaforostoff\n"
+"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KAider 0.1\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Нет входящих соединений (возможно их блокирует брандмауэр)."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Сведения"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Данные, переданные за текущий сеанс"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Текущая общая скорость"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Группы"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Запустить"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Остановить"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Запустить все"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Остановить все"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Вставить URL торрента..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Открыть менеджер очереди..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "В очередь/Из очереди"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Фильтр IP"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Проверить целостность данных"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Ограничить скорость отдачи"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Ограничить скорость приёма"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Файлы Torrent"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Все файлы"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Открыть расположение"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Отдача: %1 / Приём: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Отдано: %1 / Принято: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 узлов, %2 задач"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: выкл"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Все торренты"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Передвинуть к левому краю"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Передвинуть к правому краю"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Передвинуть к верхнему краю"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Назначить комбинацию клавиш..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Удалить комбинацию клавиш"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Сменить номер кнопки"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Новый номер акселератора:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"IP должен иметь формат \"XXX.XXX.XXX.XXX\". Можно также использовать * для "
+"диапазонов вида \"127.0.0*\"."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Выберите файл"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "Выберите имя сохраняемого файла"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Неправильный URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Загрузки"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Раздачи"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+#, fuzzy
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Указанный порт (%1) недоступен или используется другим приложением. KTorrent "
+"переключается на порт %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"Не удалось получить в использование порты с %1 по %2 так как они уже заняты."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, fuzzy, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Не удалось создать торрент %1: %2"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Некоторые файлы из торрента \"%1\" отсутствуют. Создать их или запретить их "
+"загрузку?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Пересоздать"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Не загружать"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Не удаётся пересоздать недостающие файлы: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Файлы данных отсутствуют"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Не удаётся отменить загрузку недостающих файлов: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr "Файл хранящий данные торрента \"%1\" отсутствует. Пересоздать его?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Пересоздать"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Не удаётся пересоздать файл данных: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Отсутствует файл данных"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Проверка целостности данных"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "бесконечно"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Ошибка при сканировании данных: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Сканирование данных <b>%1</b>:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Клиент BitTorrent для KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Режим отладки"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Открыть файл"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Модуль RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Модуль Веб-интерфейса"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Модуль статистики"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Значок приложения и не только"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Значок загрузки"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Значок для 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+"Визуальное представление загруженных частей и отображение загружаемых файлов в "
+"виде древовидной структуры."
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "Страна"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Приоритеты файлов"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp использовался как пример для нашей реализации UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Возможность ограничения глобального коэффициента отдачи"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Дополнения Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Веб-интерфейс Coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAI код из KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Увеличение скорости в модуле IPFilter"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Обнаружены 2 уязвимости (обе исправлены)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Патч для загрузки в стандартное место сохранения."
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Исправление PHP кода Веб-интерфейса."
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Резервирование дискового пространства в XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Патч, исправляющий отображение очень низких скоростей"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Патч для обнаружения включенного брандмауэра."
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Несколько патчей."
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Несколько патчей."
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Путь Folder1"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Патч для загрузки в стандартное место сохранения."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Выберите файл или папку."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "Вы не указали трекер. Создать торрент без трекера?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "Добавьте хотя бы один трекер."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Файлы Torrent (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Выберите имя файла"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Создание %1 ..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "Свои Группы"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Создать группу"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Изменить имя"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Удалить группу"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Открыть вкладку"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Введите имя группы."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Группа \"%1\" уже существует."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Введите новое имя группы."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Текущие раздачи"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Раздачи в очереди"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Загрузки в очереди"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Ваши загрузки"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Ваши раздачи"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Неактивные торренты"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Неактивные загрузки"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Неактивные раздачи"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Активные торренты"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Активные загрузки"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Удалить торрент"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Удалить торрент и данные"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Добавить адреса источников..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Дополнительные источники"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+#, fuzzy
+msgid "Torrent Peer Sources:"
+msgstr "Торрентов на источники:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Обмен источниками"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Принудительное объявление"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Просмотр"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "Открыть папку..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Папка с данными"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Временная папка"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Каталог загрузки..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Удалить из группы"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Добавить в группу"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Ограничение скорости"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Торрент не существует. Сообщите об ошибке разработчикам KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Потенциальный источник добавлен."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Неверный IP-адрес."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Параметры"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Параметры загрузки"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "Порт DHT должен отличаться от порта UDP."
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Общие"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Общие параметры"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Не удалось связаться с %1: %2\n"
+"Введите действительный IP-адрес или имя хоста."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Дополнительно"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Дополнительные настройки"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Видимые столбцы"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Статус"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Получено"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Размер"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Передано"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Скорость приёма"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Скорость передачи"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Осталось"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Полные источники"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Загружающие"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% выполнено"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Коэффициент отдачи"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Время загрузки"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Время отдачи"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Все торренты %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Не удалось запустить больше %n загрузки, \n"
+"Не удалось запустить больше %n загрузок, \n"
+"Не удалось запустить больше %n загрузок, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"и %n полный источник\n"
+"и %n полных источника\n"
+"и %n полных источников"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "Изменить ограничения: Настройки -> Настроить KTorrent "
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr "Торрент %1 не был загружен. Удалить также неполные данные?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Удалить загрузку"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Удалить данные"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Оставить данные"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Вы потеряете ВСЕ загруженные данные. Вы уверены?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Данные торрента %1 уже проверяются."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Выберите путь для сохранения %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Вы сняли отметки с существующих файлов. Это пиведёт к потере всех данных в этих "
+"файлах. Продолжить?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Да, удалить файлы"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Нет, оставить файлы"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Пользователь"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Управление очередью"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Нет (частный торрент)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Скорость:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Загружено: <font color='#1c9a1c'>%1</font></td>"
+"<td>Отдано: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Загрузка:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Загружено: <font color='#1c9a1c'>%3</font></td>"
+"<td>Отдано: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>Загрузка %1 завершена.</b><br>Средняя скорость: %2 В. / %3 Исх."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Загрузка завершена"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"Коэффициент отдачи <b>%1</b> достиг максимального уровня %2 и отдача былы "
+"остановлена."
+"<br>Средняя скорость загрузки %3: %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Сидирование завершено"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> достиг максимального времени сидирования в %2 часа(ов) и был "
+"остановлен."
+"<br>%3 раздавался на средней скорости в %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>Загрузка %1</b> был остановлена, ошибка: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Были найдены повреждённые данные <b>%1</b>"
+"<br>Следует проверить целостность данных."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"Коэффициент отдачи <b>%1</b> достиг максимального уровня %2 и добавление в "
+"очередь невозможно. Снимите ограничение для продолжения сидирования."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> достиг своего максимального времени сидирования в %2 час(а|ов) и не "
+"может быть поставлен в очередь. Удалите ограничение если хотите продолжить "
+"сидирование."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Торрент не может быть поставлен в очередь."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Не удалось запустить <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Невозможно раздавать больше %n торрента. "
+"<br>\n"
+"Невозможно раздавать больше %n торрентов. "
+"<br>\n"
+"Невозможно раздавать больше %n торрентов. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Невозможно загружать больше %n торрента. "
+"<br>\n"
+"Невозможно загружать больше %n торрентов. "
+"<br>\n"
+"Невозможно загружать больше %n торрентов. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Торрент не может быть запущен."
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Недостаточно места на диске."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "Не хватает места на жёстком диске.<br /><b>%1</b> загружается в '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent был остановлен.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "На устройстве заканчивается свободное место."
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Ограничение скорости, КБ/с"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Отсутствует"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Ограничение скорости для <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE KPart"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Не удалось открыть файл индекса %1: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Николай Шафоростов,Станислав Ланин"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "shafff@ukr.net,SSTL@inbox.ru"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Выберите файлы, которые вы хотите загрузить"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Загрузить в:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Группа:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "&Управляется пользователем"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Запустить торрент"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Загрузка"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Выбрать &все"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Очистить &выбор"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Обратить выбор"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Место на диске"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Необходимое место на диске:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Свободное место:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "После загрузки:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Шифрование"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Использовать шифрование протокола"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Шифрование протокола используется для защиты от замедления torrent-соединений "
+"провайдерами."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Разрешить нешифрованные соединения."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Если не отмечено, то вы сможете соединяться только с клиентами поддерживающими "
+"шифрование."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Протокол <b>D</b>istributed <b>H</b>ash <b>T</b>able."
+"<br>Протокол нецентрализированного обмена данными между участниками сети. См. "
+"руководство для подробностей"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Использовать DHT для получения дополнительных источников."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Порт UDP для DHT коммуникаций:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Указать IP вручную"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Посылать трекеру указанный вручную IP-адрес или имя хоста."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Особый IP или имя хоста:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Значок в системном лотке"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Значок в системном лотке"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Выводить &индикатор скорости в системном лотке"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Показвать всплывающие сообщения."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Скорость отдачи (в КБ/с):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Скорость загрузки (в КБ/с):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Папки"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Каталог для временных файлов:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Перемещать завершённые загрузки в:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Автоматически сохранять загрузки в:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Копировать файлы .torrent в:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Панель загрузок"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Ограничить скорость торрента"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Максимальная скорость передачи:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Максимальная скорость приема:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "КБ/с (0 - без ограничений)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Добавить потенциальный источник"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP источника:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Порт:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Введите IP адрес источника и порт."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Чёрный список Ktorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Заметка: Чёрный список применяется только к текущему сеансу. Используйте "
+"Сохранить/Открыть для сохранения или используйте модуль IPFilter."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Забаненные клиенты"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "IP-адрес клиента"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Добавить источник:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Добавить источники в чёрный список:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Удалить выбранные источники из чёрного списка"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Очистить"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Очистить список"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Сохранить как..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Сохранить этот список для использования в модуле IPFilter"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Максимальное количество загрузок:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Максимум полных источников:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Начинать загрузку при нехватке места:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Минимальный объём дискового пространства:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Не начинать"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Спрашивать"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Всегда начинать"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "МБ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 - без ограничений)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Ограничение скорости приёма:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Общее ограничение на число соединений:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Максимальное время раздачи:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Максимум соединений на один торрент:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Количество слотов отдачи:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Порт трекера UDP:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Максимальный коэффициент отдачи:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Ограничение скорости отдачи:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "КБ/с (0 - без ограничений)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "ч (0 - без ограничений)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Продолжать раздачу после завершения загрузки"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Внимание"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Ели вы работаете через маршрутизатор, указанные порты должны быть "
+"перенаправлены, .Это может выполнить автоматически модуль UPnP."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Диалог очереди KT"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Статус:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Трекер:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Коэффициент передачи:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Осталось байт:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Торрент"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Управляется"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "О&тдачи"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Отдано:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "&Вверх"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "В&низ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "В начало"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "В конец"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, fuzzy, no-c-format
+msgid "&QM Controlled"
+msgstr "&Управляется автоматически"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "&Управляется пользователем"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Вставить URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Отмена"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Создать торрент"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Файл или папка, для которой требуется создать торрент:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Добавьте хотя бы один трекер или узел."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Параметры файлов"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Размер части:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "КБ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Начать &сидирование"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Децентрализованно (только DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Частный торрент (DHT запрещён)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Комментарии:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "&Создать"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Отменить"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Трекеры"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Узлы DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Узел:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP или имя хоста:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Порт"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"ЗАМЕТКА: Некоторые хорошо известные узлы DHT уже добавлены. Вам необходимо "
+"ввести свой IP-адрес и порт, если вы хотите распространять этот торрент."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Дополнительные параметры"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, fuzzy, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Стандартный метод:</b> алгоритм по-умолчанию, использующий эмпирическую "
+"комбинацию нескольких методов"
+"<br>\n"
+"<b>Вычисление по текущей скорости:</b> отношение оставшегося размера и текущей "
+"скорости. "
+"<br>\n"
+"<b>Вычисление по общей средней скорости:</b> отношение оставшегося размера и "
+"средней скорости. "
+"<br>\n"
+"<b>Window of X алгоритм:</b> ET вычисленный из X образцов скорости. "
+"<br>\n"
+"<b>Усредненная скорость перемещения:</b> Вычисленная усредненная скорость из X "
+"образцов."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "По текущей скорости"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "По общей средней скорости"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(вступает в силу при следующем запуске)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Отключить резервирование пространства"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Полностью резервировать пространство (для избежания фрагментирования)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Стандартное (медленно)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Конкретный для каждой файловой системы"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Производительность"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Использование памяти:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Низкое"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Среднее"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Высокое"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Интервал обновления графиков:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 мс"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Быстрый процессор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Медленный процессор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Проверка данных"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Во время раздачи не проверять части больше чем"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Выполнять проверку данных после"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "повреждённых частей"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Сеть"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr ""
+"Максимальное количество соединений на один торрент (0 - без ограничений)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+"Не использовать параметры прокси-сервера KDE для HTTP-соединений с трекером"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Прокси для HTTP трекера:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Сканирование данных"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Сканирование данных торрента:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Количество найденных частей:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Количество испорченных/незагруженных частей:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Проверка"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Максимальное количество загрузок (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Максимальное количество полных источников (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Начинать загрузку при нехватке пространства на диске?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr ""
+"Максимальное количество соединений на один торрент (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Максимальное общее количество соединений (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Максимальная скорость отдачи, КБ/с (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Максимальная скорость приёма, КБ/с (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Максимальное количество полных источников (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Максимальное количество полных источников (0 - без ограничений)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Значок в системном лотке"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Показывать индикатор скорости в системном лотке"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Пропускная способность канала (загрузка) в КБ/с"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Пропускная способность канала (отдача) в КБ/с"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Показывать всплывающие сообщения когда загрузка торрента завершена."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Продолжать передачу после получения всех частей"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Каталог для временных файлов"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Сохранять ли автоматически загрузки в указанный каталог"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Каталог для загруженных файлов"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Автоматически перемещать завершённые в соответствующий каталог."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Каталог для перемещения загруженных файлов"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Автоматически копировать файлы .torrent в специальный каталог."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Каталог для копирования файлов .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Использовать указанный IP для доступа к трекеру?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Каталог, использованный последним для сохранения"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP, передаваемый трекеру"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Использование памяти"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Частота обновления графика"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Поддержка DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Порт DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Число слотов для отдачи"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Столбцы в KTorrentView"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Метод вычисления оставшегося времени"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Когда нет места на диске или места меньше минимума, торрент будет остановлен."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Управление модулями"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Включить"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, fuzzy, no-c-format
+msgid "U&nload"
+msgstr "&Отключить"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Включить все"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Отключить все"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Устройство UPnP по умолчанию"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Обнаруженные устройства:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Устройство"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Перенаправленные порты"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN соединение"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Перенаправить порты"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Отменить перенаправление порта"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Пересканировать"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Сканировать folder1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Сканировать folder2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Сканировать folder3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Путь Folder1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Путь Folder2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Путь Folder3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Предлагать ли выборочную загрузку открываемых торрентов"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Выбрано удаление"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Предлагать перемещение по умолчанию"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Параметры сканирования папок"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Сканировать папку &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Сканировать папку &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Сканировать папку &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Переместить в папку \"загруженные\" после загрузки"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Переместить торрент в папку \"загруженные\" после его загрузки."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "&Не предлагать выборочную загрузку открываемых торрентов"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Не показывать диалог выбора файлов в торренте для загрузки"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Удалить после загрузки"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Удалить торрент-файлы после загрузки"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Сканируемые папки"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Папка 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Папка 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Папка 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Параметры поиска"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Веб-сервер"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "Перенаправление портов"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "TTL на сеанс (в секундах):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Выберите интерфейс:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Имя пользователя:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Изменить пароль ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Путь к PHP:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Номер порта:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "Перенаправление портов"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Время жизни сеанса"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Общие параметры"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "путь к PHP"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "имя пользователя"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "пароль"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Части"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Общее:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Загружается:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Загружено:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Исключено:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Осталось:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Размер:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Часть"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Выполнение"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Клиент"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Подключенные клиенты"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Полные источники:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Загружающие:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Средняя скорость загрузки:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Средняя скорость отдачи:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Следующее обновление:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Взаимодействие с трекером"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Полученные части:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Доступные части:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Передача"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Отдача торрента будет остановлена по достижении указанного коэффициента "
+"передачи. 0 = не останавливать передачу."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Отдача будет остановлена после того как вы раздавали файлы достаточно долго."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "ч"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, fuzzy, no-c-format
+msgid "Ratio limit:"
+msgstr "Общее ограничение на число соединений"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Ограничение действует только в режиме сидирования"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Ограничение по времени:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "Связаться с трекером"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Минимальный интервал обновления - 60 секунд"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Добавить трекер"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Удалить трекер"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Изменить URL трекера"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Сбросить"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Показать панель просмотра участников в главном окне"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Показать панель загрузки частей в главном окне"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Показать панель трекеров в главном окне"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Показать список участников"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Показать загружа&емые части"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Показать список трекеров"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Параметры блокирования по IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Выберите файл PeerGuardian"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Использовать фильтр PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Файл фильтров IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "За&грузить/Преобразовать"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Загрузите файл PeerGuardian c bluetack.co.uk или с blocklist.org.\n"
+"ЗАМЕТКА: поддерживается ZIP-файл с bluetack.co.uk"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL фильтра первого уровня"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Использовать фильтр первого уровня?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Преобразование..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Нажмите на кнопку \"Преобразовать\", чтобы начать преобразование antip2p файл. "
+"ЗАМЕТКА: Процесс может занять некоторое время даже на быстрых компьютерах и в "
+"это время вы не сможете пользоваться KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Обновить"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Обновлять таблицы каждые"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Частота обновления интерфейса"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Собирать данные каждые"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "мс"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Максимум"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Максимум шкалы скорости:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Точно"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "См. \"Что это?\""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Установить максимальное значение шкалы OY в:\n"
+"- Пик: Максимально достигнутая скорость за всё время\n"
+"- Точно: Максимально достигнутая скорость за интервал отражаемый на графике"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Скорость у участников"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Скорость у участников:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "обновлять каждые"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "обновления графиков"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Сбор информации про участников при большом их количестве может сказаться на "
+"производительности."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Соединения с участниками:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, fuzzy, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Большие значения могут заслонять колонки с соединенными клиентами"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Показывать сидов в списке"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, fuzzy, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Показывать скачивающих в списке"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Числовые значения"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Отдача"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Соединения"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Участники"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, fuzzy, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Переключение таблиц скоростей клиентов"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Интервал между получением данных о скорости у участников"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, fuzzy, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Переключение прорисовки скачивающих в списке"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, fuzzy, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Переключение прорисовки сидов в списке"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Расчет значения загрузки"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, fuzzy, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Расчет значения скорости клиентов"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, fuzzy, no-c-format
+msgid "Upload mesurments count"
+msgstr "Расчет значения отдачи"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, fuzzy, no-c-format
+msgid "Connections mesurments count"
+msgstr "Расчет значения соединений"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, fuzzy, no-c-format
+msgid "DHT mesurments count"
+msgstr "Расчет значений DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Максимум оси OY"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Импорт существующей загрузки"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Торрент:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Данные:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+"Укажите торрент и файл или папку, в которую записывались загруженные данные для "
+"этого торрента."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Импортировать"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "по-умолчанию"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Ленты RSS"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Ленты"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "Удалить"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, fuzzy, no-c-format
+msgid "&New"
+msgstr "Добавить"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Статьи"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Автообновление"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "Игнорировать TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Обновить"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "Заголовок"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Хранить статьи (дни)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "Активно"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Фильтры"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "Принимать фильтры"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, fuzzy, no-c-format
+msgid "Reject Filters"
+msgstr "Отклонять фильтры"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Регулярные выражения"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Рассматривать как серию"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Выполнение"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "Коэффициент передачи:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "Путь Folder1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Планирование использования канала"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Категор&ия 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "В&ыключить"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Норма"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Категория &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Категория &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Категория &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Категория 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Категории"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Категория</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Категория</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "загрузка:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "отдача:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "КБ/с *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Категория</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 - без ограничений"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Сохранить в файл"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Загрузить из файла"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, fuzzy, no-c-format
+msgid "Reset schedule"
+msgstr "Сбросить задание"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&k"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, fuzzy, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Страница параметров модуля задач"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Включить &планирование использования канала"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Планирование использования канала"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Использовать цвета вместо изображений?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(рекомендуется для медленных компьютеров)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, fuzzy, no-c-format
+msgid "Edit s&chedule"
+msgstr "Изменить задание"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Включить планирование использования канала?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Использовать цвета вместо изображений?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Общие параметры"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Модули"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Все"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Отладка"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Уведомление"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Важное"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Нет"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-фильтр:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Поиск:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Сканировать каталог:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Планирование:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Загрузка неполных файлов:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Модуль RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Модуль Веб-интерфейса"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, fuzzy, no-c-format
+msgid "System"
+msgstr "Система"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Общие:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Соединения:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Работа с жёстким диском:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Использовать rtf для протокола"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Внешний браузер"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Открывать поисковые запросы во внешнем браузере"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Использовать стандартный браузер"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Указать путь к браузеру:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Поисковики"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Имя поисковика:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Добавить"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Поисковики"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Удалит&ь все"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "&Добавить основной"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Обновить из Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Поиск"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Поисковик:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Текущий поисковик"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Использовать указанный браузер"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Путь к браузеру"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 Гб"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 Мб"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 КБ"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 Б"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 КБ/с"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"%n день\n"
+"%n дня\n"
+"%n дней"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Да, первый"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Да, последний"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Не удалось открыть протокол %1: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Не удалось записать в %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Не удалось прочитать из %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Не удаётся создать каталог %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Не удаётся создать символическую ссылку %2 для %1: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Не удаётся переместить %1 в %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Не удаётся скопировать %1 в %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Не удаётся удалить %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Не удаётся создать %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Не удалось определить размер файла %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Не удалось определить размер файла: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Не удалось открыть %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Не удалось увеличить размер файла: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Не удалось увеличить размер файла"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Не удалось произвести перемещение по файлу: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Не удалось записать за пределами буферной памяти."
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Состояние: <b>%2</b><br>Автор: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Загружено"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Не загружено"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Параметры модулей"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Не удалось открыть файл %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Папка %1 не существует"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Недопустимая лексема: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Ошибка декодирования"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Неожиданный конец ввода"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Не удалось преобразовать %1 в целое"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Торрент не полный!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Торрент повреждён"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "У торрента нет поля объявления или поля узлов"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Не удаётся открыть торрент %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Ошибка анализа"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Ошибка при загрузке торрента. Вероятно, торрент повреждён, или вообще не "
+"является таковым.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Ошибка при загрузке торрента. Вероятно, торрент повреждён, или вообще не "
+"является таковым."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Не удалось создать %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr "%1 уже загружается, список трекеров из обоих торрентов был объединён."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "%1 уже загружается"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Не удалось перенести %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Загрузка торрента %1 была начата предыдущей версией KTorrent. Для продолжения "
+"этой версией KTorrent он будет перенесен. Укажите место для его сохранения. "
+"Если вы нажмёте Отмена, будет выбрана домашняя папку."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Выберите папку для сохранения"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Не запущено"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Сидирование"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Загрузка"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Нет передачи"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Остановлено"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Ошибка: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Выделение дискового пространства"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "В очереди"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Проверка данных"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Остановлено. Нет места на диске."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr "Не достаточно места для загрузки торрента. Продолжить?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Недостаточно дискового пространства для %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+#, fuzzy
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Торрент \"%1\" достиг своего максимума ратио. Игнорировать и продолжить "
+"сидирование?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+#, fuzzy
+msgid "Maximum share ratio limit reached."
+msgstr "Максимум ратио достигнут."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Ошибка при остановке торрента %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Ошибка при запуске торрента %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Обновление"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Неизвестный клиент"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"%n участник\n"
+"%n участника\n"
+"%n участников"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Не удалось создать файл %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Не удалось записать первую часть в файл DND: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Не удалось записать последнюю часть в файл DND: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Не удалось открыть %1 для записи: файловая система только для чтения."
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Не удалось увеличить размер файла: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Не удалось увеличить размер файла %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Не удалось увеличить размер файла %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Ошибка: Чтение после конца файла %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Ошибка чтения из %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Ошибка записи в %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Ошибка записи в %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Не удалось выделить дисковое пространство: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+"Не удалось закрепить за собой порт udp %1 или 10 следующих за ним портов."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Недопустимый ответ от трекера"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Недопустимые данные от трекера"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Неправильный URL торрента"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Не удаётся открыть файл %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Не удаётся создать файл индекса %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Не удаётся открыть файл %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+"Использует UPnP для автоматической трансляции портов на маршрутизаторе."
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Не удалось найти сервис транслирования в описании устройства."
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Устройства UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Автоматически сканирует каталоги в поисках торрентов и загружает их."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Сканнер каталогов"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Сканнер каталогов"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Параметры сканнера каталогов"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "загружено"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Сканнер каталогов - Папка %1: Неправильная ссылка или каталог не существует. "
+"Укажите правильную папку."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Параметры Web-интерфейса"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+#, fuzzy
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "Нестандартный путь к PHP. Введите путь вручную."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Введите новый пароль для Веб-интерфейса."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 существует и является исполняемым"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "%1 не существует"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+#, fuzzy
+msgid "%1 is not executable"
+msgstr "%1 не является исполняемым"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 - каталог"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+#, fuzzy
+msgid "%1 is not php executable path"
+msgstr "%1 не исполняемый файл PHP"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Модуль Веб-интерфейса"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Позволять контролировать KTorrent из браузера"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Загрузить с высоким приоритетом"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Загрузить с обычными приоритетом"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Загрузить позже"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Удалить файлы"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Доступно"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Ожидание"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "&Включить ограничение?"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Сведения"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "Не удаётся создать каталог %1: %2"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Страна"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Клиент"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Остановлено"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Зависло"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Доступно"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Счёт"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Слот на отдачу"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Запросы"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Блокировать участника"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Преобразование"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Загрузка текстового файла..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Ждите..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Файл преобразован."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Не удалось загрузить фильтр:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Недопустимый файл фильтра. Он может быть повреждён или иметь неверный формат."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Фильтр IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Состояние: Загружен и выполняется."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Состояние: Не загружен."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Состояние: <font color=\"#ff0000\">Файл фильтра не найден.</font> "
+"Загрузите и преобразуйте файл фильтра."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Выбранный файл уже существует, загрузить его заново?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Файл существует"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "Файл фильтра (level1.dat) уже существует, преобразовать его заново?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-фильтр"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Параметры IP-фильтра"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Статус"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Соединения:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Выводить &значок в системном лотке"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Соединения:"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Выводить &значок в системном лотке"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Максимум соединений на один торрент:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Максимум соединений на один торрент:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Папки"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Трекеры"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+#, fuzzy
+msgid "Speed statistics"
+msgstr "Ограничение скорости, кб/с"
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "Соединения:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Торрент"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "&Включить ограничение?"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Средняя скорость загрузки:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Средняя скорость загрузки:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Средняя скорость загрузки:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Загружающие:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Папки"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Файлы .torrent"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Все файлы"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "Не удалось проверить данные %1: %2"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Не удалось загрузить торрент: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+#, fuzzy
+msgid "Import existing download"
+msgstr "Импортировать существующую закачку"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Описание"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "Коэффициент передачи:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "Осталось"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Планирование"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Параметры планирования"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "ПН"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "ВТ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "СР"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "ЧТ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "ПТ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "СБ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "ВСК"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Модуль планирования использования канала"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Открыть окно Планирование использования канала"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Планирование использования канала отключено. Перейдите в Параметры->"
+"Планирование использования канала для его включения."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Просмотр протоколов"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "Просмотр протоколов"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"В браузере запустите поиск строки %1 (заглавными буквами) в поисковике, который "
+"вы хотите добавить. Затем, когда поиск завершится, скопируйте URL из адресной "
+"строки и вставьте его сюда. "
+"<br>Поиск %2 в Google, например, даст результат в виде "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. Если вы вставите сюда "
+"этот URL, KTorrent будет искать через Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Введите имя поисковика и URL"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Поисковик с таким именем уже существует. Задайте другое имя."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Недопустимый URL. Найдите FOOBAR через браузер и вставьте точный URL сюда."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Поиск"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Параметры поиска"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Поиск %1 ..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Файлы .torrent"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Поиск окончен"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Поисковики"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Загрузить или сохранить торрент?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Загрузить Torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Загрузить"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Метод вычисления оставшегося времени"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Не удалось загрузить часть %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Трекеры"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "Поле TOS для пакетов IP (для определения приоритета)"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "Добавьте хотя бы один трекер."
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "Получено"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+U"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+A"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+1"
+
+#~ msgid "Max ratio:"
+#~ msgstr "Коэффициент передачи:"
+
+#~ msgid "Name"
+#~ msgstr "Модуль"
+
+#~ msgid "Author"
+#~ msgstr "Автор"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Загрузка завершена"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "URL трекера:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "Состояние трекера:"
+
+#, fuzzy
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "Заданный порт udp (%1) недоступен или используется другим приложением. KTorrent переключается на порт %2."
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Выберите папку для сохранения"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Загрузки %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Раздачи %1/%2"
diff --git a/translations/rw/Makefile.am b/translations/rw/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/rw/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/rw/messages/Makefile.am b/translations/rw/messages/Makefile.am
new file mode 100644
index 0000000..8d437bc
--- /dev/null
+++ b/translations/rw/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = rw
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/rw/messages/ktorrent.po b/translations/rw/messages/ktorrent.po
new file mode 100644
index 0000000..c976c6f
--- /dev/null
+++ b/translations/rw/messages/ktorrent.po
@@ -0,0 +1,5188 @@
+# translation of ktorrent to Kinyarwanda.
+# Copyright (C)
+# This file is distributed under the same license as the ktorrent package.
+# Steve Murphy <murf@e-tools.com>, 2005.
+# Steve performed initial rough translation from compendium built from translations provided by the following translators:
+# Philibert Ndandali <ndandali@yahoo.fr>, 2005.
+# Viateur MUGENZI <muvia1@yahoo.fr>, 2005.
+# Noëlla Mupole <s24211045@tuks.co.za>, 2005.
+# Carole Karema <karemacarole@hotmail.com>, 2005.
+# JEAN BAPTISTE NGENDAHAYO <ngenda_denis@yahoo.co.uk>, 2005.
+# Augustin KIBERWA <akiberwa@yahoo.co.uk>, 2005.
+# Donatien NSENGIYUMVA <ndonatienuk@yahoo.co.uk>, 2005.
+# Antoine Bigirimana <antoine@e-tools.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent 3.4\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2005-05-25 18:43-0600\n"
+"Last-Translator: Steve Murphy <murf@e-tools.com>\n"
+"Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Ibisobanuro"
+
+#: apps/ktorrent/ktorrent.cpp:185
+#, fuzzy
+msgid "Data transferred during the current session"
+msgstr "i KIGEZWEHO Umukoro "
+
+#: apps/ktorrent/ktorrent.cpp:186
+#, fuzzy
+msgid "Current speed of all torrents combined"
+msgstr "Umuvuduko Bya Byose "
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "Ibyahisemo"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:571
+#, fuzzy
+msgid "Set max upload rate"
+msgstr "Gushyiraho Igipimo : "
+
+#: apps/ktorrent/ktorrent.cpp:574
+#, fuzzy
+msgid "Set max download rate"
+msgstr "Iyimura Igipimo : "
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "Torrent Files"
+msgstr "Amadosiye y'inyandiko"
+
+#: apps/ktorrent/ktorrent.cpp:626
+#, fuzzy
+msgid "All Files"
+msgstr "amadosiye yose"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Gufungura Umwanya"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Hejuru : %1 /Hasi : %2 "
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "Hejuru : %1 /Hasi : %2 "
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Ikinyakoreya"
+
+#: apps/ktorrent/filterbar.cpp:52
+#, fuzzy
+msgid "Find:"
+msgstr "Byarangiye"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+#, fuzzy
+msgid "Choose a filename to save under"
+msgstr "Idosiye Kuri Kubika "
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+#, fuzzy
+msgid "Malformed URL."
+msgstr "URL Ikoze nabi"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Iyimura"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+#, fuzzy
+msgid "Uploads"
+msgstr "Gushyiraho"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, fuzzy, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Kurema : %1 "
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Recreate"
+msgstr "Kurema"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+#, fuzzy
+msgid "Do Not Download"
+msgstr "Iyimura"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Kurema"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+#, fuzzy
+msgid "infinity"
+msgstr "Bidashira"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: apps/ktorrent/main.cpp:76
+#, fuzzy
+msgid "A BitTorrent program for KDE"
+msgstr "A Porogaramu ya: MukusanyaKDE "
+
+#: apps/ktorrent/main.cpp:108
+#, fuzzy
+msgid "Debug mode"
+msgstr "Ubwoko "
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Inyandiko igomba gufungurwa"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, fuzzy, no-c-format
+msgid "KTorrent"
+msgstr "Ikinyakoreya"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Amahitamo Rusange"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+#, fuzzy
+msgid "Application icon and a couple of others"
+msgstr "1."
+
+#: apps/ktorrent/main.cpp:131
+#, fuzzy
+msgid "The downloads icon"
+msgstr "Iyimura Agashushondanga "
+
+#: apps/ktorrent/main.cpp:134
+#, fuzzy
+msgid "1.0 application icon"
+msgstr "1."
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:145
+#, fuzzy
+msgid "File prioritization"
+msgstr "Idosiye "
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "amadosiye yose"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "amadosiye yose"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "amadosiye yose"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+#, fuzzy
+msgid "You must select a file or a folder."
+msgstr "Guhitamo A Idosiye Cyangwa A Ububiko . "
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "&Ongera Ku Rimwe . "
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr ""
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+#, fuzzy
+msgid "Choose File to Save Torrent"
+msgstr "Idosiye Kuri Kubika "
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+#, fuzzy
+msgid "Creating %1..."
+msgstr "Kurema"
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "Izina:"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "Mucapurirakure"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Gushyiraho"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr ""
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "Iyimura Agashushondanga "
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "Iyimura"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Gushyiraho"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Gukora inyandiko"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "Iyimura"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Gushyiraho"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Ikinyakoreya"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "Iyimura"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Kubika ? "
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Kubika ? "
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Kugena ibizakorwa"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+#, fuzzy
+msgid "Manual Announce"
+msgstr "Ibahasha y'Intoki"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Igaragazambere"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Iyimura Agashushondanga "
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "URL Ikoze nabi"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Ibyahisemo"
+
+#: apps/ktorrent/pref.cpp:147
+#, fuzzy
+msgid "Download Options"
+msgstr "Iyimura y'inkoranyamagambo"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Rusange"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Amahitamo Rusange"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Idosiye "
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Imimerere"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Yimuwe"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Ingano"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+#, fuzzy
+msgid "Uploaded"
+msgstr "Gushyiraho"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, fuzzy, no-c-format
+msgid "Down Speed"
+msgstr "Ntu kohereze"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+#, fuzzy
+msgid "Up Speed"
+msgstr "Umuvuduko"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Igihe gisigaye:"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "Uwohereza"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "Ibaruwa:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+#, fuzzy
+msgid "% Complete"
+msgstr "%1 Yarangiye"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "Ikigero cy'Ingano:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Yimuwe"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "Igihe gisigaye:"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Ikinyakoreya"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "1 %n "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+#, fuzzy
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr "Byose Ibyatanzwe Yimuwe ya: iyi , NIBA iyi . Kuri iyi ? "
+
+#: apps/ktorrent/ktorrentview.cpp:378
+#, fuzzy
+msgid "Remove Download"
+msgstr "Iyimura"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Kuri Iyimura i ? "
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "Iyimura Agashushondanga "
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr ""
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+#, fuzzy
+msgid "No (private torrent)"
+msgstr "Gukora inyandiko"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:147
+#, fuzzy
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b> %1 </b> Byarangiye Iyimura . <br> Umuvuduko : %2 /%3 . "
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+#, fuzzy
+msgid "Download completed"
+msgstr "Byarangiye "
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Byarangiye "
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+#, fuzzy
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b> %1 </b> Kyahagariswe ku i Ikosa : <br> %2 "
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr ""
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr ""
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr ""
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+#, fuzzy
+msgid "Cannot open index file %1 : %2"
+msgstr "Gufungura Ubwihisho Idosiye : %1 "
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+"Viateur MUGENZI, JEAN BAPTISTE NGENDAHAYO, Augustin KIBERWA, Donatien "
+"NSENGIYUMVA"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"muvia1@yahoo.fr, ngenda_denis@yahoo.co.uk, akiberwa@yahoo.co.uk, "
+"ndonatienuk@yahoo.co.uk"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Kuri "
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Iyimura"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "Iyimura"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Gutangira i "
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Iyimura"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Hitamo byose"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, fuzzy, no-c-format
+msgid "Select &None"
+msgstr "Guhitamo Umanuka"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, fuzzy, no-c-format
+msgid "Invert Selection"
+msgstr "Gucurika Itoranya"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "Iyimura"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, fuzzy, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Folders"
+msgstr "amadosiye yose"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Kuri By'igihe gito Idosiye : "
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Iyimura"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, fuzzy, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Kubika Iyimura Kuri : "
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Amadosiye y'inyandiko"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, fuzzy, no-c-format
+msgid "Download Toolbar"
+msgstr "Iyimura y'ububiko"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Gutangira i "
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "Gushyiraho Igipimo : "
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Iyimura Igipimo : "
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "/Sec. ( 0 %S ni Oya ) "
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "Peru"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Impagikiro:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Amadosiye y'inyandiko"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, fuzzy, no-c-format
+msgid "Banned Peers"
+msgstr "Kugena ibizakorwa"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, fuzzy, no-c-format
+msgid "Maximum downloads:"
+msgstr "Iyimura : "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, fuzzy, no-c-format
+msgid "Maximum seeds:"
+msgstr "Iyimura : "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "Itatangiye"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "Itatangiye"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, fuzzy, no-c-format
+msgid "(0 is no limit)"
+msgstr "( 0 %S ni Oya ) "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Maximum download rate:"
+msgstr "Iyimura Igipimo : "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "Ikigero cy'Ingano:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, fuzzy, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Ukwihuza Iyimura : "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "UDP tracker port:"
+msgstr "Umuyoboro: : "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "Ikigero cy'Ingano:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Gushyiraho Igipimo : "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, fuzzy, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "/Sec. ( 0 %S ni Oya ) "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "( 0 %S ni Oya ) "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, fuzzy, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "Nyuma Iyimura ni Byarangiye "
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, fuzzy, no-c-format
+msgid "Attention"
+msgstr "icya/ibyahindutse"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Imimerere:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, fuzzy, no-c-format
+msgid "Tracker:"
+msgstr "Mucapurirakure"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, fuzzy, no-c-format
+msgid "Share ratio:"
+msgstr "Ikigero cy'Ingano:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, fuzzy, no-c-format
+msgid "Torrent"
+msgstr "Ikinyakoreya"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, fuzzy, no-c-format
+msgid "Upload&s"
+msgstr "Gushyiraho"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, fuzzy, no-c-format
+msgid "Uploaded:"
+msgstr "Gushyiraho"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, fuzzy, no-c-format
+msgid "O&K"
+msgstr "YEGO"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, fuzzy, no-c-format
+msgid "C&ancel"
+msgstr "Kureka"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, fuzzy, no-c-format
+msgid "Create Torrent"
+msgstr "Gukora inyandiko"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, fuzzy, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Idosiye Cyangwa Ububiko Bya Kuri Kurema A : "
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "&Ongera Ku Rimwe . "
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, fuzzy, no-c-format
+msgid "File Options"
+msgstr "Idosiye "
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, fuzzy, no-c-format
+msgid "Size of each chunk:"
+msgstr "Bya : "
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, fuzzy, no-c-format
+msgid "128"
+msgstr "1,28"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, fuzzy, no-c-format
+msgid "256"
+msgstr "25"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, fuzzy, no-c-format
+msgid "512"
+msgstr "12"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, fuzzy, no-c-format
+msgid "1024"
+msgstr "0,24"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, fuzzy, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Gutangira i "
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Ibisobanuro:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "Kurema"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, fuzzy, no-c-format
+msgid "Ca&ncel"
+msgstr "Kureka"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, fuzzy, no-c-format
+msgid "Trackers"
+msgstr "Udusodeko"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Izina:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Umuyoboro"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Ibyahiswemo by'Umutekano"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "Shakisha "
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Ibyahisemo"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, fuzzy, no-c-format
+msgid "GUI update interval:"
+msgstr "Ihuzagihe in : "
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Umubare Bya Ukwihuza Iyimura ( 0 %S = Oya ) "
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Umuyoboro: : "
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, fuzzy, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Umubare Bya Iyimura ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, fuzzy, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Umubare Bya Iyimura ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, fuzzy, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Umubare Bya Ukwihuza Iyimura ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, fuzzy, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Umubare Bya Ukwihuza Iyimura ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, fuzzy, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Gushyiraho Umuvuduko in /Sec. ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, fuzzy, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Umuvuduko in /Sec. ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Umubare Bya Iyimura ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Umubare Bya Iyimura ( 0 %S = Oya ) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, fuzzy, no-c-format
+msgid "Show a system tray icon"
+msgstr "A Sisitemu Agasanduku Agashushondanga "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, fuzzy, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Nyuma Iyimura Byarangiye "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, fuzzy, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Kuri By'igihe gito Idosiye "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, fuzzy, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Kubika Iyimura Kuri : "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, fuzzy, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Kuri Yimuwe Idosiye "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Kubika Iyimura Kuri : "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Kuri Yimuwe Idosiye "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Kubika Iyimura Kuri : "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Kuri By'igihe gito Idosiye "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, fuzzy, no-c-format
+msgid "GUI update interval"
+msgstr "Ihuzagihe in : "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, fuzzy, no-c-format
+msgid "U&nload"
+msgstr "Iyimura"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Iyimura"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, fuzzy, no-c-format
+msgid "Device"
+msgstr "Igaragazambere"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, fuzzy, no-c-format
+msgid "Ports Forwarded"
+msgstr "Yimuwe"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr ""
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, fuzzy, no-c-format
+msgid "Folder1 path"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, fuzzy, no-c-format
+msgid "Folder2 path"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, fuzzy, no-c-format
+msgid "Folder3 path"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, fuzzy, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, fuzzy, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Ibyahiswemo by'Umutekano"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, fuzzy, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Amadosiye y'inyandiko"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, fuzzy, no-c-format
+msgid "Folders to scan"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, fuzzy, no-c-format
+msgid "Folder 1:"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, fuzzy, no-c-format
+msgid "Folder 2:"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, fuzzy, no-c-format
+msgid "Folder 3:"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, fuzzy, no-c-format
+msgid "Search Preferences"
+msgstr "Ibyahiswemo by'Umutekano"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "Guhitamo Umanuka"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Amahitamo Rusange"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, fuzzy, no-c-format
+msgid "Chunks"
+msgstr "Inkingi"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, fuzzy, no-c-format
+msgid "Total:"
+msgstr "Igiteranyo:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, fuzzy, no-c-format
+msgid "Currently downloading:"
+msgstr "Iyimura : "
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, fuzzy, no-c-format
+msgid "Downloaded:"
+msgstr "Yimuwe"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, fuzzy, no-c-format
+msgid "Excluded:"
+msgstr "Gukuramo igice: "
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, fuzzy, no-c-format
+msgid "Size:"
+msgstr "Ingano"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, fuzzy, no-c-format
+msgid "Chunk"
+msgstr "Umwanda"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Aho bigeze"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, fuzzy, no-c-format
+msgid "Peer"
+msgstr "Peru"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, fuzzy, no-c-format
+msgid "Assigned Peers"
+msgstr "Kugena ibizakorwa"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, fuzzy, no-c-format
+msgid "Seeders:"
+msgstr "Uwohereza"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, fuzzy, no-c-format
+msgid "Leechers:"
+msgstr "Ibaruwa:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, fuzzy, no-c-format
+msgid "Average Down Speed:"
+msgstr "Umuvuduko "
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, fuzzy, no-c-format
+msgid "Average Up Speed:"
+msgstr "Umuvuduko "
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, fuzzy, no-c-format
+msgid "Next update in:"
+msgstr "Ihuzagihe in : "
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, fuzzy, no-c-format
+msgid "Tracker Status:"
+msgstr "Udusodeko"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Bya i Idosiye Yimuwe : "
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, fuzzy, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Bya i Idosiye Bihari : "
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "Mucapurirakure"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Mucapurirakure"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Mucapurirakure"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Mucapurirakure"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, fuzzy, no-c-format
+msgid "Restore Defaults"
+msgstr "Mburabuzi "
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, fuzzy, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Iyimura : "
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, fuzzy, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Ibyahisemo"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Amadosiye y'inyandiko"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Amadosiye y'inyandiko"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, fuzzy, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Iyimura Byinshi..."
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, fuzzy, no-c-format
+msgid "Converting..."
+msgstr "Kurema"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "Ihuzagihe in : "
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Iyimura : "
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Iyimura : "
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "N'aho mukanya"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "Peru"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Gushyiraho"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr ""
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, fuzzy, no-c-format
+msgid "Peers"
+msgstr "N'aho mukanya"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Iyimura Byinshi..."
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, fuzzy, no-c-format
+msgid "Torrent:"
+msgstr "Ikinyakoreya"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "Mburabuzi "
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "Uwohereza"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Ibyahisemo"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Aho bigeze"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "Ikigero cy'Ingano:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, fuzzy, no-c-format
+msgid "download:"
+msgstr "Iyimura"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, fuzzy, no-c-format
+msgid "upload:"
+msgstr "Gushyiraho"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, fuzzy, no-c-format
+msgid "* zero means no limit"
+msgstr "( 0 %S ni Oya ) "
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, fuzzy, no-c-format
+msgid "O&k"
+msgstr "YEGO"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr ""
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, fuzzy, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Idosiye "
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, fuzzy, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Idosiye "
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, fuzzy, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Idosiye "
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Idosiye "
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Idosiye "
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, fuzzy, no-c-format
+msgid "LogViewer Options"
+msgstr "Idosiye "
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, fuzzy, no-c-format
+msgid "Debug"
+msgstr "Ubwoko "
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, fuzzy, no-c-format
+msgid "IPFilter:"
+msgstr "Ibyahisemo"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, fuzzy, no-c-format
+msgid "Search:"
+msgstr "Gushaka"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, fuzzy, no-c-format
+msgid "ScanFolder:"
+msgstr "amadosiye yose"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, fuzzy, no-c-format
+msgid "Scheduler:"
+msgstr "Uwohereza"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Amahitamo Rusange"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, fuzzy, no-c-format
+msgid "General:"
+msgstr "Rusange"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, fuzzy, no-c-format
+msgid "Search Engines"
+msgstr "Shakisha ama moteri"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, fuzzy, no-c-format
+msgid "Search engine name:"
+msgstr "Izina: : "
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Ongera"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, fuzzy, no-c-format
+msgid "Engines"
+msgstr "Ama moteri yose"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, fuzzy, no-c-format
+msgid "R&emove All"
+msgstr "Gukuraho Byose"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, fuzzy, no-c-format
+msgid "Add Defau&lt"
+msgstr "Mburabuzi "
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "Ihuzagihe in : "
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Gushaka"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, fuzzy, no-c-format
+msgid "Search engine:"
+msgstr "Shakisha Imoteri"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, fuzzy, no-c-format
+msgid "Current search engine"
+msgstr "Shakisha "
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+#, fuzzy
+msgid "%1 KB/s"
+msgstr "%1 /Sec. "
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr ""
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr ""
+
+#: libktorrent/util/log.cpp:103
+#, fuzzy
+msgid "Cannot open log file %1 : %2"
+msgstr "Gufungura LOG Idosiye %1 "
+
+#: libktorrent/util/file.cpp:87
+#, fuzzy
+msgid "Cannot write to %1 : %2"
+msgstr "Kurema : %1 "
+
+#: libktorrent/util/file.cpp:101
+#, fuzzy, c-format
+msgid "Cannot read from %1"
+msgstr "Kurema : %1 "
+
+#: libktorrent/util/fileops.cpp:78
+#, fuzzy
+msgid "Cannot create directory %1: %2"
+msgstr "Kurema Ububiko %1 : %2 "
+
+#: libktorrent/util/fileops.cpp:92
+#, fuzzy
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "%1 Kuri %2 : %3 "
+
+#: libktorrent/util/fileops.cpp:108
+#, fuzzy
+msgid "Cannot move %1 to %2: %3"
+msgstr "Himura %1 Kuri %2 : %3 "
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+#, fuzzy
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Gukoporora %1 Kuri %2 : %3 "
+
+#: libktorrent/util/fileops.cpp:232
+#, fuzzy
+msgid "Cannot delete %1: %2"
+msgstr "Gusiba %1 : %2 "
+
+#: libktorrent/util/fileops.cpp:251
+#, fuzzy
+msgid "Cannot create %1: %2"
+msgstr "Kurema %1 : %2 "
+
+#: libktorrent/util/fileops.cpp:272
+#, fuzzy
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/util/fileops.cpp:289
+#, fuzzy, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+#, fuzzy
+msgid "Cannot open %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, fuzzy, c-format
+msgid "Cannot expand file : %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/util/fileops.cpp:426
+#, fuzzy, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Loaded"
+msgstr "Gushyiraho"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+#, fuzzy
+msgid "Not loaded"
+msgstr "Yimuwe"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+#, fuzzy
+msgid "Plugin Options"
+msgstr "Idosiye "
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+#, fuzzy
+msgid "Cannot open file %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr ""
+
+#: libktorrent/torrent/bdecoder.cpp:83
+#, fuzzy
+msgid "Decode error"
+msgstr "Ikosa "
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+#, fuzzy
+msgid "Unexpected end of input"
+msgstr "Impera Bya Iyinjiza "
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+#, fuzzy
+msgid "Cannot convert %1 to an int"
+msgstr "GUHINDURA %1 Kuri INT "
+
+#: libktorrent/torrent/bdecoder.cpp:203
+#, fuzzy
+msgid "Torrent is incomplete!"
+msgstr "Amadosiye y'inyandiko"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr ""
+
+#: libktorrent/torrent/torrent.cpp:103
+#, fuzzy
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+#, fuzzy
+msgid "Parse Error"
+msgstr "Ikosa "
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Ikosa Ifungura i Idosiye . ni i Idosiye ni , Cyangwa ni OYA A Idosiye Ku Byose "
+". "
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+#, fuzzy
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Ikosa Ifungura i Idosiye . ni i Idosiye ni , Cyangwa ni OYA A Idosiye Ku Byose "
+". "
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Kuri Iyimura i ? "
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+#, fuzzy
+msgid "Cannot migrate %1 : %2"
+msgstr "Kurema %1 : %2 "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+#, fuzzy
+msgid "Select Folder to Save To"
+msgstr "Kuri Kubika "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+#, fuzzy
+msgid "Not started"
+msgstr "Itatangiye"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+#, fuzzy
+msgid "Seeding"
+msgstr "Kugenzura"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Iyimura"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Byatindijwe"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Kyahagariswe"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Ikosa"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+#, fuzzy
+msgid "Error stopping torrent %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/queuemanager.cpp:742
+#, fuzzy
+msgid "Error starting torrent %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+#, fuzzy
+msgid "Unknown client"
+msgstr "Umukiriya "
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, fuzzy, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "1 %n "
+
+#: libktorrent/torrent/dndfile.cpp:108
+#, fuzzy
+msgid "Cannot create file %1 : %2"
+msgstr "Kurema %1 : %2 "
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, fuzzy, c-format
+msgid "Cannot expand file %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, fuzzy, c-format
+msgid "Error reading from %1"
+msgstr "Kurema : %1 "
+
+#: libktorrent/torrent/cachefile.cpp:403
+#, fuzzy
+msgid "Error writing to %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, fuzzy, c-format
+msgid "Error writing to %1"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, fuzzy, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr ", Inyibutsa "
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr ", Inyibutsa "
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr ", Inyibutsa "
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+#, fuzzy
+msgid "Cannot open file %1: %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, fuzzy, c-format
+msgid "Cannot create index file: %1"
+msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+#, fuzzy
+msgid "Cannot open file : %1 : %2"
+msgstr "Gufungura Idosiye %1 : %2 "
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "amadosiye yose"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder"
+msgstr "amadosiye yose"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+#, fuzzy
+msgid "ScanFolder Options"
+msgstr "Idosiye "
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+#, fuzzy
+msgid "loaded"
+msgstr "Gushyiraho"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Amahitamo Rusange"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Amahitamo Rusange"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+#, fuzzy
+msgid "Download First"
+msgstr "Iyimura"
+
+#: plugins/infowidget/fileview.cpp:58
+#, fuzzy
+msgid "Download Normally"
+msgstr "Byarangiye "
+
+#: plugins/infowidget/fileview.cpp:59
+#, fuzzy
+msgid "Download Last"
+msgstr "Iyimura"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "amadosiye yose"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Bihari"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+#, fuzzy
+msgid "Pending"
+msgstr "Imisobekere"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "( 0 %S ni Oya ) "
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr ""
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr ""
+
+#: plugins/infowidget/trackerview.cpp:96
+#, fuzzy
+msgid "Cannot remove torrent default tracker."
+msgstr "Kurema : %1 "
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:213
+#, fuzzy
+msgid "IP"
+msgstr "ZIPU"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Umukiriya"
+
+#: plugins/infowidget/peerview.cpp:218
+#, fuzzy
+msgid "Choked"
+msgstr "Ivivuwe"
+
+#: plugins/infowidget/peerview.cpp:219
+#, fuzzy
+msgid "Snubbed"
+msgstr "yanditswe/byemewe"
+
+#: plugins/infowidget/peerview.cpp:220
+#, fuzzy
+msgid "Availability"
+msgstr "Bihari"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:223
+#, fuzzy
+msgid "Upload Slot"
+msgstr "Gushyiraho"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr ""
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr ""
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr ""
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Ibyahisemo"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+#, fuzzy
+msgid "Status: Not loaded."
+msgstr "Yimuwe"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+#, fuzzy
+msgid "File Exists"
+msgstr "Idosiye "
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter"
+msgstr "Ibyahisemo"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+#, fuzzy
+msgid "IPBlocking Filter Options"
+msgstr "Idosiye "
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Imimerere"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Ibaruwa:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Byarangiye "
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Kwerekana agashushondanga k'igitwara sisitemu"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Ukwihuza Iyimura : "
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Ukwihuza Iyimura : "
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Izina:"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Udusodeko"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Ikinyakoreya"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "( 0 %S ni Oya ) "
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Umuvuduko "
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Umuvuduko "
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Umuvuduko "
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Ibaruwa:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "amadosiye yose"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "Torrent files"
+msgstr "Amadosiye y'inyandiko"
+
+#: plugins/partfileimport/importdialog.cpp:50
+#, fuzzy
+msgid "All files"
+msgstr "amadosiye yose"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, fuzzy, c-format
+msgid "Cannot verify data : %1"
+msgstr "Kurema %1 : %2 "
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, fuzzy, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Kurema : %1 "
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr ""
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "Ikigero cy'Ingano:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "Igihe gisigaye:"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+#, fuzzy
+msgid "Scheduler plugin options"
+msgstr "Idosiye "
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr ""
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr ""
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+#, fuzzy
+msgid "Bandwidth scheduling plugin"
+msgstr "Shakisha "
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr ""
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr ""
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "Idosiye "
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"( ) ku i Shakisha Kuri &Ongera . Gukoporora i in i Nyuma i Shakisha ni "
+"Byarangiye , na Komeka . "
+"<br> ya: "
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+#, fuzzy
+msgid "You must enter the search engine's name and URL"
+msgstr "Injiza Izina: na "
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:146
+#, fuzzy
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+". Shakisha ya: Na: Interineti Mucukumbuzi na Gukoporora /Komeka NYACYO . "
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:247
+#, fuzzy
+msgid "Search Engine Options"
+msgstr "Shakisha ama moteri"
+
+#: plugins/search/searchwidget.cpp:178
+#, fuzzy
+msgid "Searching for %1..."
+msgstr "ya: %1 ... "
+
+#: plugins/search/searchwidget.cpp:209
+#, fuzzy
+msgid "torrent files"
+msgstr "Amadosiye y'inyandiko"
+
+#: plugins/search/searchwidget.cpp:267
+#, fuzzy
+msgid "Search finished"
+msgstr "Byarangiye "
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Ama moteri yose"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr ""
+
+#: plugins/search/htmlpart.cpp:165
+#, fuzzy
+msgid "Do you want to download or save the torrent?"
+msgstr "Kuri Iyimura i ? "
+
+#: plugins/search/htmlpart.cpp:166
+#, fuzzy
+msgid "Download Torrent"
+msgstr "Iyimura Byinshi..."
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Kurema : %1 "
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Udusodeko"
+
+#, fuzzy
+#~ msgid "You must add at least one tracker."
+#~ msgstr "&Ongera Ku Rimwe . "
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "Yimuwe"
+
+#, fuzzy
+#~ msgid "Max ratio:"
+#~ msgstr "Ikigero cy'Ingano:"
+
+#, fuzzy
+#~ msgid "Name"
+#~ msgstr "Izina:"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Byarangiye "
+
+#, fuzzy
+#~ msgid "Tracker URL:"
+#~ msgstr "Mucapurirakure"
+
+#, fuzzy
+#~ msgid "Tracker status:"
+#~ msgstr "Udusodeko"
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Kuri Kubika "
+
+#, fuzzy
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Iyimura"
+
+#, fuzzy
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Gushyiraho"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "Shakisha ama moteri"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "Ikinyakoreya"
+
+#, fuzzy
+#~ msgid "Tracker"
+#~ msgstr "Mucapurirakure"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "Imimerere"
+
+#, fuzzy
+#~ msgid "Tracker request timed out"
+#~ msgstr "Udusodeko"
+
+#, fuzzy
+#~ msgid "finished"
+#~ msgstr "Byarangiye"
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "Shakisha ama moteri"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "Byarangiye "
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "Byarangiye "
+
+#~ msgid "Completed"
+#~ msgstr "Byarangiye"
+
+#, fuzzy
+#~ msgid "Invalid response"
+#~ msgstr "IntegoItemewe"
+
+#, fuzzy
+#~ msgid "Unreachable"
+#~ msgstr "Kurema imbonerahamwe"
+
+#, fuzzy
+#~ msgid "Parse error"
+#~ msgstr "Ikosa "
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "Gushaka"
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Tangira &vendorShortName; Birenzeho 1 Iyimura . Kuri - > , NIBA Kuri Guhindura... i . \n"
+#~ "Tangira &vendorShortName; Birenzeho %n Iyimura . Kuri - > , NIBA Kuri Guhindura... i . "
+
+#, fuzzy
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Tangira &vendorShortName; Birenzeho 1 Iyimura . Kuri - > , NIBA Kuri Guhindura... i . \n"
+#~ "Tangira &vendorShortName; Birenzeho %n Iyimura . Kuri - > , NIBA Kuri Guhindura... i . "
+
+#, fuzzy
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "Amadosiye y'inyandiko"
+
+#, fuzzy
+#~ msgid "You must fill in the name field."
+#~ msgstr "Kuzuza in i Izina: Umwanya . "
+
+#, fuzzy
+#~ msgid "Available trackers:"
+#~ msgstr "Bihari"
+
+#, fuzzy
+#~ msgid "Down:"
+#~ msgstr "Hasi"
+
+#, fuzzy
+#~ msgid "Up:"
+#~ msgstr "Hejuru"
+
+#, fuzzy
+#~ msgid "Fi&les"
+#~ msgstr "amadosiye yose"
+
+#, fuzzy
+#~ msgid "KTorrent's UPnP plugin"
+#~ msgstr "Shakisha "
+
+#, fuzzy
+#~ msgid "KTorrent's IP filter plugin"
+#~ msgstr "Shakisha "
+
+#, fuzzy
+#~ msgid "KTorrent's log viewer plugin"
+#~ msgstr "Shakisha "
+
+#, fuzzy
+#~ msgid "KTorrent's search plugin"
+#~ msgstr "Shakisha "
+
+#, fuzzy
+#~ msgid "Re&store default."
+#~ msgstr "Mburabuzi "
+
+#, fuzzy
+#~ msgid "Downlo&ad"
+#~ msgstr "Iyimura"
+
+#, fuzzy
+#~ msgid "&Seed"
+#~ msgstr "Kugenzura"
+
+#~ msgid "yes"
+#~ msgstr "Yego"
+
+#, fuzzy
+#~ msgid "no"
+#~ msgstr "Oya"
+
+#, fuzzy
+#~ msgid "Cannot preallocate diskspace : %s"
+#~ msgstr "Kurema Umubarendanga Idosiye : %1 "
+
+#, fuzzy
+#~ msgid "&Status"
+#~ msgstr "Imimerere"
+
+#, fuzzy
+#~ msgid "Unable to open cache file: %1"
+#~ msgstr "Gufungura Ubwihisho Idosiye : %1 "
+
+#, fuzzy
+#~ msgid "You must add a least one tracker."
+#~ msgstr "&Ongera A Rimwe . "
+
+#, fuzzy
+#~ msgid ""
+#~ "If you are behind a NAT-enabled router, it is important that you forward \n"
+#~ "the above ports. You should consult your router's manual if you \n"
+#~ "do not know how to do this."
+#~ msgstr ""
+#~ "A - Bikora , ni By'ingirakamaro Imbere \n"
+#~ "i hejuru . Bikorwa NIBA \n"
+#~ "OYA Kuri iyi . "
+
+#, fuzzy
+#~ msgid "Can't open index file"
+#~ msgstr "Gufungura Umubarendanga Idosiye "
+
+#, fuzzy
+#~ msgid "Can't save chunk_info file : %1"
+#~ msgstr "Kubika Idosiye : %1 "
+
+#, fuzzy
+#~ msgid "The download %1 has finished. Do you want to save it now?"
+#~ msgstr "Iyimura %1 Byarangiye . Kuri Kubika NONEAHA ? "
+
+#~ msgid "Do Not Save"
+#~ msgstr "Ntubike"
+
+#, fuzzy
+#~ msgid "The tracker %1 sent the following error : %2"
+#~ msgstr "Yoherejwe: Inyuma i Ikosa : %1 "
+
+#, fuzzy
+#~ msgid "Tracker error : %1"
+#~ msgstr "Ikosa "
+
+#, fuzzy
+#~ msgid "The tracker %1 is down."
+#~ msgstr "%1 ni Hasi . "
+
+#, fuzzy
+#~ msgid "The tracker is down."
+#~ msgstr "ni Hasi . "
+
+#, fuzzy
+#~ msgid "Unreachable, trying backup"
+#~ msgstr ", Inyibutsa "
+
+#, fuzzy
+#~ msgid "The tracker %1 did not send a proper response"
+#~ msgstr "%1 OYA Kohereza A NYACYO "
+
+#, fuzzy
+#~ msgid "The UDP Tracker Port and Port cannot have the same value !"
+#~ msgstr "na i Agaciro: ! "
+
+#~ msgid "Start"
+#~ msgstr "Gutangira"
+
+#, fuzzy
+#~ msgid "Are you sure?"
+#~ msgstr "Ni byo koko"
+
+#, fuzzy
+#~ msgid "Use your web browser to search for the string "
+#~ msgstr "Urubuga Mucukumbuzi Kuri Shakisha ya: i Ikurikiranyanyuguti "
+
+#, fuzzy
+#~ msgid " on google for example, will result in http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8 . If you add this URL here, ktorrent can search using google."
+#~ msgstr "google. comsearch."
+
+#~ msgid "ID"
+#~ msgstr "ID"
diff --git a/translations/sk/Makefile.am b/translations/sk/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/sk/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/sk/messages/Makefile.am b/translations/sk/messages/Makefile.am
new file mode 100644
index 0000000..1e1bb19
--- /dev/null
+++ b/translations/sk/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = sk
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/sk/messages/ktorrent.po b/translations/sk/messages/ktorrent.po
new file mode 100644
index 0000000..647dbfc
--- /dev/null
+++ b/translations/sk/messages/ktorrent.po
@@ -0,0 +1,5140 @@
+# translation of ktorrent.po to Slovak
+# Eugen Tarabčák <flashmann@szm.sk>, 2006.
+# Jozef Riha <jose1711@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2006-08-30 19:00+0200\n"
+"Last-Translator: Jozef Riha <jose1711@gmail.com>\n"
+"Language-Team: Slovak <sk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Poedit-Language: Slovak\n"
+"X-Poedit-Country: SLOVAKIA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Info"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Dáta prenesené počas aktuálneho sedenia"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Súčasná rýchlosť všetkých torrentov spolu"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Spustiť"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Zastaviť"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Spustiť všetky"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Zastaviť všetky"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Vložiť URL torrentu..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Manažér Frontu..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Pridaj do frontu/Odober z frontu"
+
+#: apps/ktorrent/ktorrent.cpp:553
+#, fuzzy
+msgid "IPFilter"
+msgstr "IPFilter:"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Skontroluj integritu dát"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Nastav MAX rýchlosť uploadu"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Nastav MAX rýchlosť downloadu"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent súbory"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Všetky súbory"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Otvor lokáciu"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "Rýchlosť od vás: %1 / k vám: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "Prenesené od vás: %1 / k vám: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 uzlov, %2 úlohy"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: vypnuté"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "Po&suň hore:"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "Po&suň hore:"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "Po&suň hore:"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Vyberte súbor"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Vyberte meno súboru uloženia"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Nesprávna URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Downloady"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Uploady"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+#, fuzzy
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Špecifikovaný port (%1) je nedostupný alebo ho používa iná aplikácia. KTorrent "
+"je viazaný na port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Nepodarilo sa vytvoriť torrent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+#, fuzzy
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Niektoré dátové súbory torrentu \"%1\" chýbajú, prajete si ich opäť vytvoriť "
+"alebo ich vôbec nestiahnuť?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Opäť vytvoriť"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Nesťahovať"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Nepodarilo sa opäť vytvoriť súbory: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Chýbajú dátové súbory"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Nie je možné odznačiť chýbajúce súbory: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+#, fuzzy
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Súbor, do ktorého sa ukladajú dáta torrentu \"%1\" chýba, prajete si ho opäť "
+"vytvoriť?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Opäť vytvoriť"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Nepodarilo sa opäť vytvoriť dátový súbor: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Chýba dátový súbor"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Kontrolujem integritu dát"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "nekonečno"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "Chyba pri prehľadávaní dát: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Prehľadávanie dát ohľadom dielov"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "BitTorrent klient pre KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "BitTorrent klient pre KDE"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokument na otvorenie"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "Moduly"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "Všeobecné - nastavenia"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Ikona aplikácie a zopár ďalších"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Ikona sťahovania"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 ikona aplikácie"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Rada karty kúskov a usporiadanie stromu súborov"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "Krajina"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Prioritizácia súborov"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp bol použitý ako príklad našej vlastnej implementácie UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "Cesta k priečinku1"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Cesta k priečinku1"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Cesta k priečinku1"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Určuje, či sa má torrent otvoriť potichu."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Prioritizácia súborov"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+#, fuzzy
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Odznačili ste nasledujúce už existujúce súbory. Týmto stratíte všetky dáta v "
+"týchto súboroch, ste si istý, že to chcete urobiť?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "Musíte pridať aspoň jeden tracker."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent súbory (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Vyberte Súbor pre Uloženie torrentu"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Vytváram %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "Vlastná IP"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "Meno"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "Odobrať tracker"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "Uploady"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+#, fuzzy
+msgid "Queued uploads"
+msgstr "Vo fronte"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "Ikona sťahovania"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "sťahovanie:"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "Uploady"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "Vytvoriť Torrent"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "sťahovanie:"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "Uploady"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "sťahovanie:"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "Vytvoriť Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "Vytvoriť Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Pridelený peerovia"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Manuálne ohlásenie"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Ukážka"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Ikona sťahovania"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+#, fuzzy
+msgid "Add to Group"
+msgstr "Vlastná IP"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, fuzzy, no-c-format
+msgid "Speed Limits"
+msgstr "Limit rýchlosti v kB/s"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "Nesprávna URL."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Nastavenia"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Download - nastavenia"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+#, fuzzy
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "Port pre DHT sa musí líšiť od UDP portu pre tracker !"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Všeobecné"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Všeobecné - nastavenia"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Nepodarilo sa nájsť %1: %2\n"
+"Uveďte, prosím, platnú IP adresu alebo hostiteľa."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Možnosti priečinku prehľadávania"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Stav"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Stiahnuté"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Veľkosť"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Odoslané"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Sťahovanie"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Odosielanie"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Zostáva:"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "Seederov:"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "Peerov:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% hotovo"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "Ratio sťahovania:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "Stiahnuté"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "Zostáva:"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Torrent"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"%n peer\n"
+"%n peerovia\n"
+"%n peerov"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Torrent %1 ešte úspešne nedokončil sťahovanie, prajete si vymazať tiež "
+"nedokončené dáta?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Odobrať sťahovanie"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+#, fuzzy
+msgid "Delete Data"
+msgstr "Zmazať po načí&taní"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+#, fuzzy
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Odznačili ste nasledujúce už existujúce súbory. Týmto stratíte všetky dáta v "
+"týchto súboroch, ste si istý, že to chcete urobiť?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Prajete si stiahnuť alebo uložiť torrent?"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "Ikona sťahovania"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Odznačili ste nasledujúce už existujúce súbory. Týmto stratíte všetky dáta v "
+"týchto súboroch, ste si istý, že to chcete urobiť?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Áno, vymazať súbory"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nie, ponechať súbory"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Užívateľ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Manažér frontu"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nie (súkromný torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+#, fuzzy
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<center><b>KTorrent</b></center><table cellpadding='2' cellspacing='2' "
+"align='center'>"
+"<tr>"
+"<td><b>Rýchlosť:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Sťahovanie: <font color='#1c9a1c'>%1</font></td>"
+"<td>Odosielanie: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Prenos:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Sťahovanie: <font color='#1c9a1c'>%3</font></td>"
+"<td>Odosielanie: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> bol úspešne stiahnutý.<br>Priemerná rýchlosť: %2 DL / %3 UL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Sťahovanie dokončené"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "Sťahovanie dokončené"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> bol zastavený s nasledujúcou chybou: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Prehľadávanie dát ohľadom dielov"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Limit rýchlosti v kB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Bez limitu"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+#, fuzzy
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Limit rýchlosti v kB/s"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Aplikácia KDE Kpart"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Nepodarilo sa otvoriť súbor s indexom %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Eugen Tarabčák"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "flashmann@szm.sk"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Vyberte, ktoré súbory si prajete stiahnuť"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "Stiahnuť"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "&Používateľom kontrolované"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "Začni &vysielať torrent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Stiahnuť"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Vyber &všetky"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Nevyber &nič"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Invertuj výber"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "sťahovanie:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Šifrovanie"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Použiť šifrovanie"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Povoliť nešifrované spojenia"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Ak voľbu odškrtnete, budete sa môcť pripojiť iba ku klientom podporujúcim "
+"šifrovanie."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protokol."
+"<br>Protokol komunikácie decentralizovaných peerov."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Použiť DHT pre získanie ďalších zdrojov"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP port pre komunikáciu s DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Vlastná IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Po&slať trackeru vlastnú IP alebo hostiteľa"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Vlastná IP alebo hostiteľ:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "Ukázať i&konu v tray paneli"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Ukázať i&konu v tray paneli"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Ukázať i&konu v tray paneli"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Ukázať i&konu v tray paneli"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Priečinky"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Priečinok pre uloženie dočasných súborov:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Nestiahnuť"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Automaticky uložiť sťahované súbory sem:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "torrent súbory"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Panel sťahovania"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Začni &vysielať torrent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "Maximálna rýchlosť odosielania:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "Maximálna rýchlosť sťahovania:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "kB/s (0 znamená bez limitu)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "Peer"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, fuzzy, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Torrent súbory"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, fuzzy, no-c-format
+msgid "Banned Peers"
+msgstr "Pridelený peerovia"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maximum sťahovaní:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maximum zdrojov:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, fuzzy, no-c-format
+msgid "Minimum disk space:"
+msgstr "Alokujem diskový priestor"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "Nespustené"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "Nespustené"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 znamená bez limitu)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maximálna rýchlosť sťahovania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Global connection limit:"
+msgstr "Globálny limit spojení"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "Ratio sťahovania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maximum spojení na jeden torrent:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Počet slotov pre odosielanie:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Port pre UDP tracker:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "Ratio sťahovania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maximálna rýchlosť odosielania:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "kB/s (0 znamená bez limitu)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(0 znamená bez limitu)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Pokračuj v odosielaní po ukončení sťahovania"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Upozornenie"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Tieto porty musia byť nasmerované k vám, ak používate router. Modul UPnP to "
+"môže urobiť za vás."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT dialóg frontu"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Stav:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Ratio sťahovania:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Zostáva bytov:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Kontrolované"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Uploa&dy"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Odoslané:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Po&suň hore:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Pos&uň dole:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "Po&suň hore:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&QM Kontrolované"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "&Používateľom kontrolované"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Vložiť URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&K"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Ukončiť"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Vytvoriť Torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Súbor alebo priečinok, z ktorého si prajete vytvoriť torrent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Musíte pridať aspoň jeden tracker."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Možnosti súboru"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Veľkosť dielu:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Začni &vysielať torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Súkromný torrent (DHT zákazané)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Komentáre:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "Vyt&voriť"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "Z&rušiť"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackery"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "Žiadne"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "Vlastná IP alebo hostiteľ:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "Možnosti vyhľadávania"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "Súčasný vyhľadávací stroj"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "Nastavenia"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Využitá pamäť:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Nízka"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Stredná"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Vysoká"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Interval obnovenia GUI:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, fuzzy, no-c-format
+msgid "Data Checking"
+msgstr "Kontrola dát"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maximálny počet spojení pre jeden torrent (0 = bez limitu)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Port pre UDP tracker:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Prehľadávanie dát"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, fuzzy, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Prehľadávanie dát ohľadom dielov"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Nájdený počet dielov:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Počet dielom, ktoré sa nepodarilo stiahnuť:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maximálny počet sťahovaní (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maximálny počet zdrojov (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maximálny počet spojení pre jeden torrent (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Maximálny počet spojení pre všetky torrenty (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maximálna rýchlosť odosielania v kB/s (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maximálna rýchlosť sťahovania v kB/s (0 = bez limitu)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Dosiahnuté maximálne ratio zdieľania."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Dosiahnuté maximálne ratio zdieľania."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Zapnúť ikonu v tray paneli"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Ukázať i&konu v tray paneli"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Ukázať bublinu pri dokončení sťahovania."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Umožniť ostatným sťahovať odo mňa po ukončení sťahovania"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Priečinok pre uloženie dočasných súborov"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr ""
+"Určuje, či sa májú sťahované súbory automaticky ukladať do cieľového adresára "
+"bez vyzvy"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Priečinok pre uloženie stiahnutých súborov"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Určuje, či sa májú sťahované súbory automaticky ukladať do cieľového adresára "
+"bez vyzvy"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Priečinok pre uloženie stiahnutých súborov"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Určuje, či sa májú sťahované súbory automaticky ukladať do cieľového adresára "
+"bez vyzvy"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Priečinok pre uloženie dočasných súborov"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Určuje, či sa má poslať trackeru vlastná IP."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP adresa poslaná na tracker"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Využitie pamäte"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Interval obnovenia GUI"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Podpora pre DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Počet slotov pre posielanie"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Manažér Modulov"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Spustiť"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Vy&pnúť"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "Spustiť všetky"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "Vypnúť všetky"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Hlavné zariadenie UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Nájdené zariadenia:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Zariadenie"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Nasmerované porty"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, fuzzy, no-c-format
+msgid "WAN Connection"
+msgstr "Spojenia:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, fuzzy, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Nasmeruj porty"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Vrátiť späť Nasmerovanie Portov"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Preskenuj"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Povoliť prehľadávanie priečinku1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Povoliť prehľadávanie priečinku2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Povoliť prehľadávanie priečinku3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Cesta k priečinku1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Cesta k priečinku2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Cesta k priečinku3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Určuje, či sa má torrent otvoriť potichu."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Vybratá akcia vymazania."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Vybratá akcia presunutia."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Nastavenia Priečinku vyhľadávania"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Prehľadať priečinok %1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Prehľadať priečinok %1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Prehľadať priečinok %1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Presunúť do adresára \"načítané\" po &načítaní"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Presunúť torrent do adresára \"načítané\" po &načítaní"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Otvoriť torrenty poti&chu"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Nezobrazovať dialóg 'Vyberanie súborov na stiahnutie'"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Zmazať po načí&taní"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Zmaže torrent po načítaní"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Priečinky na vyhľadávanie"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Priečinok 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Priečinok 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Priečinok 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Možnosti vyhľadávania"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "Nasmeruj porty"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "Nevyber &nič"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "Užívateľ"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "Nasmeruj porty"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "Všeobecné - nastavenia"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Diely"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Spolu:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Práve sa sťahuje:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Stiahnuté:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Vylúčené:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Veľkosť:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Kúsok"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Priebeh"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Peer"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Pridelený peerovia"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Seederov:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Peerov:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Priem. rýchl. sťahovania:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Priem. rýchl. odosielania:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Ďalšia obnova o:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Stav trackera:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Časti torrentu, ktoré už sú stiahnuté:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Časti torrentu, ktoré sú dostupné:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Zdieľanie"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Odosielanie od vás sa zastaví, keď ratio zdieľania dosiahne túto hodnotu. Nula "
+"znamená bez limitu."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, fuzzy, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Odosielanie od vás sa zastaví, keď ratio zdieľania dosiahne túto hodnotu. Nula "
+"znamená bez limitu."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, fuzzy, no-c-format
+msgid "Ratio limit:"
+msgstr "Globálny limit spojení"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Limit je funkčný iba v móde seed"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "P&oužiť limit?"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "Ob&nov tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Najmenší interval obnovenia je 60 sekúnd"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "Pridať &tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, fuzzy, no-c-format
+msgid "Remove Tracker"
+msgstr "Odobrať tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Z&meniť tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, fuzzy, no-c-format
+msgid "Restore Defaults"
+msgstr "Obnoviť pôvodné"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Zobraziť kartu s peermi v hlavnom okne"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Zobraziť kartu s kúskami v hlavnom okne"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Zobraziť kartu s trackermi v hlavnom okne"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Ukázať zoznam peerov"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Ukázať zoznam práve sťahovaných &kúskov"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Ukázať zoznam trackerov"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Nastavenie blokovania IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Použiť filter KTorrent?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Použiť filter KTorrent?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Súbor s IP filtrom:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Stiahnuť/&Konvertovať"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL na filter stupňa 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Použiť filter stupňa 1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Konvertujem..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Kliknite na tlačidlo 'konvertovať' pre začatie konverzie antip2p súboru. "
+"POZNÁMKA: Tento proces môže chvíľu trvať aj na rýchlych počítačoch a počas "
+"konverzie nie je možné používať KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "Interval obnovenia GUI"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "Maximum zdrojov:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Maximum zdrojov:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "Užívatelia"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "Peer"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "Spojenia:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Ukázať i&konu v tray paneli"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "Uploady"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "Spojenia:"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Užívatelia"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "Stiahnuť torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, fuzzy, no-c-format
+msgid "Connections mesurments count"
+msgstr "Príznak správ pripojení"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importovať existujúce sťahovanie"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Dáta:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Prosím zadajte torrent a už stiahnuté dáta pre tento torrent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importovať"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "Pridať pred&volený"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "Seederov:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "IPFilter:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "Všetky súbory"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "Priebeh"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "Max ratio:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, fuzzy, no-c-format
+msgid "Te&st"
+msgstr "Test"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "Cesta k priečinku1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Plánovač rýchlosti"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Kategória ľavého kliknutia"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kategó&ria 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "V&ypnúť"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normálna"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategória &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategória &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Kategória pravého kliknutia"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategória &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategória 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategórie"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Kategória</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Kategória</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "sťahovanie:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "odosielanie:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "kB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Kategória</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* nula znamená bez limitu"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Uložiť do súboru"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Načítať zo súboru"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Zrušiť plán"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&k"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Možnosti modulu Plánovač"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Použiť plánovač &priepustnosti linky?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Plánovač rýchlosti"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Použiť farby namiesto obrázkov?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(odporúčané pre pomalšie počítače)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Editovať časový &plán"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Povoliť plánovač rýchlosti?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Použiť farby namiesto obrázkov?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Použiť formátovaný text v zázname"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Príznak správ základných informácií"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Príznak správ pripojení"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Príznak správ DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Príznak správ informácií o trackeri"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Príznak správ V/V na disk"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Príznak správ modulu filtrovania IP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Príznak správ modulu vyhľadávania"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Príznak správ modulu PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Príznak správ modulu informácií"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Príznak správ modulu UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Príznak správ modulu Priečinok prehľadávania"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Príznak správ modulu plánovača"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Príznak správ modulu vyhľadávania"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Príznak správ modulu filtrovania IP"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Nastavenie Prehliadača záznamov"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Moduly"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Všetky"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Ladenie"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Poznámka"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Dôležité"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Žiadne"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IPFilter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Vyhľadávanie:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "PriečinokPrehľadávania:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Plánovač:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Všeobecné - nastavenia"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Systém"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Základné:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Spojenia:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Disk V/V:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Použiť formátovaný text pre protokol"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, fuzzy, no-c-format
+msgid "Custom browser path:"
+msgstr "Vlastná IP"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Vyhľadávacie stroje"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Meno vyhľadávacieho stroja:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Pridať"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Stroje"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "O&dobrať všetky"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Pridať pred&volený"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "Obnoviť z internetu"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Hľadať"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Vyhľadávací stroj:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Súčasný vyhľadávací stroj"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 kB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 kB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"%n deň\n"
+"%n dni\n"
+"%n dní"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Áno, prvý"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Áno, posledný"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Nepodarilo sa otvoriť súbor záznamu %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Nepodarilo sa zapisovať do %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Nepodarilo sa čítať z %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Nepodarilo sa vytvoriť adresár %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Nepodarilo sa symbolicky ukázať %1 na %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Nepodarilo sa presunúť %1 do %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Nepodarilo sa kopírovať %1 do %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Nepodarilo sa vymazať %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Nepodarilo sa vytvoriť %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Nepodarilo sa zistiť veľkosť %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Nepodarilo sa zistiť veľkosť : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Nepodarilo sa otvoriť %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Nepodarilo sa rozšíriť súbor: %1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "Nepodarilo sa rozšíriť súbor %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Nepodarilo sa prechádzať súborom: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Nie je možný zápis nad rámec mmap buffera!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Spustený"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Nespustený"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Nastavenia modulu"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Nepodarilo sa otvoriť súbor %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Adresár %1 neexistuje"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Neplatný symbol: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Chyba pri dekódovaní"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Neočakávaný koniec vstupu"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Nepodarilo sa skonvertovať %1 na celé číslo"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent je nekompletný!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Porušený torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrent nenesie informáciu o oznámení"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Nepodarilo sa otvoriť torrent súbor %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Chyba pri rozdeľovaní"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Nastala chyba počas načítania torrentu. Torrent je pravdepodobne poškodený "
+"alebo to nie je torrent súbor."
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Nastala chyba počas načítania torrentu. Torrent je pravdepodobne poškodený "
+"alebo to nie je torrent súbor."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "Nepodarilo sa otvoriť torrent súbor %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+#, fuzzy
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr "Tento torrent už sťahujete, doplnil sa len zoznam trackerov."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Prajete si stiahnuť alebo uložiť torrent?"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Nepodarilo sa premigrovať %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Torrent %1 bol spustený v predošlej verzii KTorrent. Pre zaistenie správnej "
+"funkčnosti v aktuálnej verzii je potrebné torrent premigrovať. Budete vyzvaný "
+"na zadanie miesta uloženia torrent súboru. Ak stlačíte Zrušiť, použije sa váš "
+"domovský adresár."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Vyber priečinok na uloženie:"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Nespustené"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Odosielanie"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Sťahovanie"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Čakanie"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Zastavené"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Chyba:"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Alokujem diskový priestor"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Vo fronte"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Kontrola dát"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Odznačili ste nasledujúce už existujúce súbory. Týmto stratíte všetky dáta v "
+"týchto súboroch, ste si istý, že to chcete urobiť?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Alokujem diskový priestor"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" dosiahol svoje maimálne ratio zdieľania. Ignorovať limit a "
+"napriek tomu začať odosielanie?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Dosiahnuté maximálne ratio zdieľania."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Chyba pri zastavení torrentu %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Chyba pri spúšťaní torrentu %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Neznámy klient"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"%n peer\n"
+"%n peerovia\n"
+"%n peerov"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Nepodarilo sa vytvoriť súbor %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Neúspešný zápis prvého kúsku do DND súboru: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Neúspešný zápis posledného kúsku do DND súboru: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Nepodarilo sa rozšíriť súbor: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Nepodarilo sa rozšíriť súbor %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Nepodarilo sa rozšíriť súbor %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Chyba: Čítanie nad rámec súboru %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Chyba pri čítaní z %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Chyba pri zápise do %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Chyba pri zápise do %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Nepodarilo sa alokovať diskový priestor: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Nepodarilo sa napojiť na UDP port %1 ani na 10 nasledujúcich portov."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "Neplatná odozva"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr ""
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "URL trackera:"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Nepodarilo sa otvoriť súbor %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Nepodarilo sa vytvoriť indexovací súbor: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Nepodarilo sa otvoriť súbor: %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Použije sa UPnP pre automatické napojenie portu na routeri"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Nepodarilo sa nájsť službu pre smerovanie portov v popise zariadenia!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Zariadenia UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Automaticky kontroluje adresáre pre výskyt torrent súborov a automaticky ich "
+"načíta."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Priečinok prehľadávania"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Priečinok prehľadávania"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Možnosti priečinku prehľadávania"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "načítané"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+#, fuzzy
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Priečinok prehľadávania - Priečinok %1: Neplatná URL alebo priečinok "
+"neexistuje. Vyberte, prosím, platný priečinok."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "Všeobecné - nastavenia"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "Adresár %1 neexistuje"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Všeobecné - nastavenia"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Stiahnuť ako prvé"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Stiahnuť normálne"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Stiahnuť ako posledné"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "Všetky súbory"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Dostupné"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Nasledujúci"
+
+#: plugins/infowidget/fileview.cpp:343
+#, fuzzy
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Odznačili ste nasledujúce už existujúce súbory. Týmto stratíte všetky dáta v "
+"týchto súboroch, ste si istý, že to chcete urobiť?"
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "P&oužiť limit?"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Info"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Ukázať prídavné informácie o sťahovaní. Napríklad, ktoré kúsky sú už stiahnuté, "
+"počet seederov a leecherov ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Nie je možné pridať tracker do súkromného torrentu."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Nie je možné odobrať hlavný tracker torrentu."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Nemôžete pridať tracker do súkromného torrentu"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Krajina"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klient"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Upchatý"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Otrasený"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Dostupnosť"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Skóre"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Slot pre odosielanie"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Žiadosti"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+#, fuzzy
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Zakázať Peera"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Dostupné kúsky"
+"<br><img src=\"unavailable_color\">&nbsp; - Nedostupné kúsky"
+"<br><img src=\"excluded_color\">&nbsp; - Vylúčené kúsky"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Možnosti Informácií"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Stiahnuté kúsky"
+"<br><img src=\"unavailable_color\">&nbsp; - Kúsky na stiahnutie"
+"<br><img src=\"excluded_color\">&nbsp; - Vylúčené kúsky"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Konverzia"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Načítam txt súbor..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Prosím počkajte..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Súbor skonvertovaný."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Nepodarilo sa použiť filter:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Zlý súbor s filtrom. Môže byť poškodený alebo v zlom formáte."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IPFilter:"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Stav: Spustený."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Stav: Nespustený."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Stav: <font color=\"#ff0000\">Súbor s filtrom nenájdený.</font> "
+"Stiahnite a skonvertujte súbor s filtrom."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Vybraný súbor už existuje, prajete si ho stiahnuť znovu?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Súbor už existuje"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Súbor s filtrom (level1.dat) už existuje, prajete si ho skonvertovať znovu?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filter Blokovanie IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Možnosti Filtra Blokovanie IP"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "Stav"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "Spojenia:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "Ukázať i&konu v tray paneli"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "Spojenia:"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "Ukázať i&konu v tray paneli"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "Maximum spojení na jeden torrent:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "Maximum spojení na jeden torrent:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "Žiadne"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "Trackery"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+#, fuzzy
+msgid "Speed statistics"
+msgstr "Limit rýchlosti v kB/s"
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "Spojenia:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Torrent"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "P&oužiť limit?"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "Priem. rýchl. sťahovania:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "Priem. rýchl. sťahovania:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "Priem. rýchl. sťahovania:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "Peerov:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "Priečinky"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent súbory"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Všetky súbory"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Nepodarilo sa overiť dáta: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Nepodarilo sa načítat torrent súbor: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Import čiastočne alebo úplne stiahnutých torrentov od iných klientov"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importovať existujúce sťahovanie"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+#, fuzzy
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Automaticky kontroluje adresáre pre výskyt torrent súborov a automaticky ich "
+"načíta."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Popis"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "Max ratio:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "Zostáva:"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Plánovač"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Možnosti modulu Plánovač"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "PON"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "UTO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "STR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "ŠTV"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "PIA"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SOB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "NED"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Časový plán uložený."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Súbor nenájdený."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Časový plán načítaný."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Modul plánovania rýchlosti"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Otvoriť Plánovač Rýchlosti"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Plánovač rýchosti je zakázaný. Obnoviť ho môžete cez Nastavenia->Plánovač."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Prehliadač Záznamov"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "Prehliadač Záznamov"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Použite váš obľúbený prehliadač na vyhľadanie reťazca %1 (veľké písmená) na "
+"vyhľadávacej stránke, ktorú si prajete pridať. Následne skopírujte URL adresu z "
+"adresného poľa po ukončení vyhľadávania a vložte ju sem."
+"<br>Napríklad vyhľadanie %2 cez Google vygeneruje adresu "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. Ak pridáte túto URL "
+"sem, ktorrent dokáže odteraz vyhľadávať cez Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Musíte zadať meno a URL vyhľadávacieho stroja"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Už existuje vyhľadávací stroj s rovnakým menom. Použite iné meno."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr "Nesprávna URL."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Hľadať"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Nastavenie vyhľadávacieho stroja"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Hľadám %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent súbory"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Vyhľadávanie skončené"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "Stroje"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Vyhľadávanie torrentov na populárnych stránkach s torrentami"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Prajete si stiahnuť alebo uložiť torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Stiahnuť torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Stiahnuť"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Nepodarilo sa načítať kúsok %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#~ msgid "TrackerViewBase"
+#~ msgstr "TrackerViewBase"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+N"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr "Vyhľadávač krajiny pre informačný modul. Vlajky krajín sú prevzaté z http://flags.blogpotato.de/, patrí im vďaka."
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "Musíte pridať aspoň jeden tracker."
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "Stiahnuté"
+
+#, fuzzy
+#~ msgid "Alt+K"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#~ msgid "Alt+U"
+#~ msgstr "Alt+U"
+
+#~ msgid "Alt+A"
+#~ msgstr "Alt+A"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+1"
+
+#~ msgid "Max ratio:"
+#~ msgstr "Max ratio:"
+
+#~ msgid "Name"
+#~ msgstr "Meno"
+
+#~ msgid "Author"
+#~ msgstr "Autor"
+
+#~ msgid "IP filter plugin, filters out unwanted peers"
+#~ msgstr "Modul filtrovania IP, odstráni nechcených peerov"
+
+#~ msgid "Shows logging output in a widget"
+#~ msgstr "Ukazuje záznamový výstup vo widgete"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "Sťahovanie dokončené"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "URL trackera:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "Stav trackera:"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "Zadaný UDP port (%1) je neprístupný alebo ho používa iná aplikácia. KTorrent je naviazaný na port %2."
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "Vyber priečinok na uloženie:"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "Downloady %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "Uploady %1/%2"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "Vyhľadávacie stroje"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "Torrent"
+
+#~ msgid "Tracker"
+#~ msgstr "Tracker"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "Stav"
+
+#~ msgid "You need to have default save directory selected to load torrents silently."
+#~ msgstr "Je nutné nastaviť predvolený adresár na uloženie, aby ste mohli nahrávať torrenty potichu."
+
+#, fuzzy
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+1"
+
+#~ msgid "InfoWidgetBase"
+#~ msgstr "InfoWidgetBase"
+
+#~ msgid "Show \"torrent finished\" popup messages"
+#~ msgstr "Zobrazovať bublinu \"torrent stiahnutý\""
+
+#~ msgid "Secure connection with other clients. May also help if your ISP is shaping your traffic."
+#~ msgstr "Bezpečné pripojenie s ostatnými klientami."
+
+#, fuzzy
+#~ msgid "Tracker request timed out"
+#~ msgstr "Stav trackera:"
+
+#, fuzzy
+#~ msgid "Alt+G"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+1"
+
+#~ msgid "finished"
+#~ msgstr "ukončené"
+
+#~ msgid "Cannot bind to port %1 or the 10 following ports."
+#~ msgstr "Nepodarilo sa napojiť na port %1 ani na 10 nasledujúcich portov."
+
+#, fuzzy
+#~ msgid "You will lose all data in the deselected file(s), are you sure you want to do this ?"
+#~ msgstr "Odznačili ste nasledujúce už existujúce súbory. Týmto stratíte všetky dáta v týchto súboroch, ste si istý, že to chcete urobiť?"
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "Vyhľadávacie stroje"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "Sťahovanie dokončené"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "Sťahovanie dokončené"
+
+#~ msgid "Completed"
+#~ msgstr "Hotovo"
+
+#, fuzzy
+#~ msgid "If you deselect a directory, you will lose all the data off all files in this directory. Are you sure you want to do this ?"
+#~ msgstr "Odznačili ste nasledujúce už existujúce súbory. Týmto stratíte všetky dáta v týchto súboroch, ste si istý, že to chcete urobiť?"
+
+#~ msgid "Torrent moved to download panel"
+#~ msgstr "Torrent presunutý do panela sťahovania"
+
+#~ msgid "<b>%1</b> torrent has been moved to download panel."
+#~ msgstr "Torrent <b>%1</b> bol presunutý do okna sťahovania."
+
+#~ msgid "You must fill in the name field."
+#~ msgstr "Musíte vyplniť pole s menom."
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Nie je možné spustiť viac ako %n sťahovanie súčasne. Je potrebné upraviť limit počtu sťahovaných torrentov.\n"
+#~ "Nie je možné spustiť viac ako %n sťahovania súčasne. Je potrebné upraviť limit počtu sťahovaných torrentov.\n"
+#~ "Nie je možné spustiť viac ako %n sťahovaní súčasne. Je potrebné upraviť limit počtu sťahovaných torrentov."
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr ""
+#~ "Nie je možné spustiť viac ako %n seed naraz. Je potrebné upraviť limit v nastaveniach.\n"
+#~ "Nie je možné spustiť viac ako %n seedy naraz. Je potrebné upraviť limit v nastaveniach.\n"
+#~ "Nie je možné spustiť viac ako %n seedov naraz. Je potrebné upraviť limit v nastaveniach."
+
+#~ msgid "Name:"
+#~ msgstr "Meno:"
+
+#~ msgid "Select Filter File with IP Ranges in KTorrent Format"
+#~ msgstr "Vybrať súbor s filtrom obsahujúci rozsahy IP vo formáte KTorrent"
+
+#~ msgid "Use &KTorrent filter?"
+#~ msgstr "Použiť &KTorrent filter?"
+
+#~ msgid "Select Level1 Filter File (from Bluetack.co.uk or Openmedia.info)"
+#~ msgstr "Vybrať súbor s filtrom stupňa 1 (Bluetack.co.uk alebo Openmedia.info)"
+
+#~ msgid "Use level&1 filter?"
+#~ msgstr "Použiť filter s&tupňa 1?"
+
+#~ msgid "Note: ZIP file from bluetack.co.uk is now supported."
+#~ msgstr "Poznámka: ZIP súbor zo stránky bluetack.co.uk je tiež podporovaný."
+
+#~ msgid "IP filter file"
+#~ msgstr "Súbor s IP filtrom"
+
+#~ msgid "Unreachable"
+#~ msgstr "Nedostupný"
+
+#~ msgid "Parse error"
+#~ msgstr "Chyba pri rozdeľovaní"
+
+#~ msgid "Alt+R"
+#~ msgstr "Alt+R"
diff --git a/translations/sr/Makefile.am b/translations/sr/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/sr/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/sr/messages/Makefile.am b/translations/sr/messages/Makefile.am
new file mode 100644
index 0000000..791c3c6
--- /dev/null
+++ b/translations/sr/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = sr
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/sr/messages/ktorrent.po b/translations/sr/messages/ktorrent.po
new file mode 100644
index 0000000..c641e05
--- /dev/null
+++ b/translations/sr/messages/ktorrent.po
@@ -0,0 +1,4892 @@
+# translation of ktorrent.po to Serbian
+# translation of ktorrent.po to
+#
+# Slobodan Simic <simicsl@verat.net>, 2005, 2007, 2008.
+# Slobodan Simic <slsimic@gmail.com>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-02-26 13:59+0100\n"
+"Last-Translator: Slobodan Simic <simicsl@verat.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Нема долазних веза (вероватно сте иза заштитног зида)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Инфо"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Подаци пренесени током тренутне сесије"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Тренутна брзина свих торента заједно"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Групе"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Покрени"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Заустави"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Покрени све"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Заустави све"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Пренеси URL торента..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Отвори управника редоследа..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Стави/Уклони из реда"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "ИП филтер"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Провери исправност података"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Највећа брзина слања"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Највећа брзина преузимања"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Торент фајлови"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Сви фајлови"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Отвори локацију"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Брзина преузимања: %1 / слања: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Преузето: %1 / Послато: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: веза %1, послова %2"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: искључен"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Сви торенти"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Нађи:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Разликуј мала и велика слова"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Помери на леви док"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Помери на десни док"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Помери на доњи док"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Додели убрзавач..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Очисти убрзавач"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Промени број дугмета"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Нови број убрзавача:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Морате унети IP у облику „XXX.XXX.XXX.XXX“. Такође, можете користити и џокере "
+"за опсеге, нпр „127.0.0.*“."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Изаберите фајл"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Изаберите име фајла под којим снимате"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Лоше формиран URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Преузимања"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Слања"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Наведени порт (%1) је недоступан или га користи други програм. КТорент сада "
+"користи порт %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"КТорент не може да прихвата везе јер су портови %1 до %2 већ употребљени од "
+"стране другог програма."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Не могу да направим торент: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Недостаје неколико фајлова „%1“ торента. Желите ли да их поново направите или "
+"да их не преузимате?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Направи"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Не преузимај"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Не могу да направим недостајуће фајлове: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Недостају фајлови са подацима"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Не могу да демаркирам недостајуће фајлове: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Недостаје фајл у који се снимају подаци „%1“ торента. Желите ли да га поново "
+"направите?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Не прави поново"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Не могу да направим фајл: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Недостаје фајл са подацима"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Провери податке"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "бесконачно"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Грешка при провери података: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Проверавам податке за <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "BitTorrent програм за KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Режим исправљања грешака"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr "Тихо сними торент дат у URL-у"
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Документ за отварање"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "КТорент"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS прикључак"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Прикључак веб интерфејса"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Прикључак статистике"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Икона програма и још понека"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Икона преузимања"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 Икона програма"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Савети траке парчића и разврставање ставки IW фајла"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Локатор земаља за InfoWidget прикључак (Овај производ укључује GeoLite податке "
+"које је направио MaxMind, доступне на http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Заставе земаља"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Приоритет фајла"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp је коришћен као пример за нашу UPnP примену"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Закрпа за глобални највећи однос дељења"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconf побољшања"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk веб интерфејс"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl код из KDevelop-а"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Побољшање конверзије брзине у прикључку ИП филтера"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Открио 2 сигурносна пропуста (оба су отклоњена)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Закрпа за тихо учитавање са сачуване локације"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Исправке у PHP коду веб интерфејса"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Резервисање простора на XFS диску"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Закрпа за не-приказивање веома малих брзина"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Закрпа за приказивање могућег стања иза заштитног зида"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Неколико закрпа"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Закрпа за скривање траке менија"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Закрпа за измену својства фајла кроз веб интерфејс"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Неколико закрпа веб интерфејса"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Закрпа за траку филтера"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Закрпа за не разгранато ажурирање приказа фајла"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Оптимизација за генерисање SHA1 хеша"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Закрпа за сређивање прорачуна слободног простора у FreeBSD-у"
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr "Закрпа за тихо учитавање торената из командне линије"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Морате изабрати фајл или фасциклу."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Нисте додали пратиоца. Јесте ли сигурни да хоћете да направите овај торент ?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Морате додати бар један чвор."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Торент фајлови (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Изаберите фајл да снимите торент"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Правим %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Посебне групе"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Нова група"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Уреди име"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Уклони групу"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Отвори језичак"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Унесите име групе."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Група %1 већ постоји."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Унесите име нове групе."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Активна слања"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Наредна слања"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Наредна преузимања"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Корисничка преузимања"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Корисничка слања"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Неактивни торенти"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Неактивна преузимања"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Неактивна слања"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Активни торенти"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Активна преузимања"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Уклони торент"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Уклони торент и податке"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Додај вршњаке"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Додатни извори вршњака"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Извори вршњака за торент:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Размена вршњака"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Ручно објављивање"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Преглед"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Отвори директоријум"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Директоријум података"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Привремени директоријум"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Одредите место за преузимање"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Уклони из групе"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Додај у групу"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Ограничења брзине"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Торент не постоји. Пријавите ову грешку програмерима КТорента."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Додат могући вршњак"
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Лоше формирана адреса."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Подешавања"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Опције преузимања"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT порт мора бити различит од UDP порта пратиоца!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Опште"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Опште опције"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Не могу да нађем %1: %2\n"
+"Наведите исправну IP адресу или име домаћина."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Напредно"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Напредне опције"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Видљиве колоне"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Стање"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Преузето"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Величина"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Послато"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Преузимање"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Слање"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Преостало време"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Сејачи"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Пијавице"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% завршено"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Однос дељења"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Време преузимања"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Време сејања"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Сви торенти %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Не могу да покренем више од %n преузимања, \n"
+"Не могу да покренем више од %n преузимања, \n"
+"Не могу да покренем више од %n преузимања, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"и %n сејање. \n"
+"и %n сејања. \n"
+"и %n сејања. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Идите у Подешавања -> Подеси КТорент, ако желите да промените ограничење."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Торент %1 није завршио преузимање. Желите ли такође да обришете и непотпуне "
+"податке ?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Уклони преузимање"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Обриши податке"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Задржи податке"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Изгубићете све преузете податке. Желите ли заиста ово да учините?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Већ проверавате податке торента %1 !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Изаберите место преузимања за %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Избацили сте следеће постојеће фајлове. Изгубићете све податке у овим "
+"фајловима. Да ли сте сигурни да желите ово да урадите?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Да, избриши фајлове"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Не, задржи фајлове"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " недостаје!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Корисник"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Управник редоследа"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Не (лични торент)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Брзина:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Преузимање: <font color='#1c9a1c'>%1</font></td>"
+"<td>Слање: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Пренос:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Преузимање: <font color='#1c9a1c'>%3</font></td>"
+"<td>Слање: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> је завршио преузимање.<br>Просечна брзина: %2 ПР / %3 СЛ."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Преузимање завршено"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> је достигао максимум односа дељења од %2 па је заустављен."
+"<br>Послато %3 при просечној брзини од %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Сејање завршено"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> је достигао максимум времена сејања од %2 ч. па је заустављен."
+"<br>Послато %3 при просечној брзини од %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> је заустављен са следећом грешком: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Нађени су оштећени подаци у торенту <b>%1</b>"
+"<br>Било би добро да проверите исправност података за торент."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> је достигао максимум односа дељења од %2 и не може се поново ставити "
+"у ред. Сами уклоните ограничење ако желите да наставите сејање."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> је достигао максимум времена сејања од %2 ч. и не може се поново "
+"ставити у ред. Сами уклоните ограничење ако желите да наставите сејање."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Торент се не може ставити у ред."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Не могу да покренем <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Не могу да сејем више од %n торента. "
+"<br>\n"
+"Не могу да сејем више од %n торента. "
+"<br>\n"
+"Не могу да сејем више од %n торената. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Не могу да преузимам више од %n торента. "
+"<br>\n"
+"Не могу да преузимам више од %n торента. "
+"<br>\n"
+"Не могу да преузимам више од %n торената. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Торент се не може покренути"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Нема довољно слободног простора."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "На диску вам понестаје простора.<br /><b>%1</b> се преузима у „%2“."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Торент је заустављен.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Уређају понестаје простора"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Ограничење у KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Неограничено"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Ограничења брзине за <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE-ов KPart програм"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Не могу да отворим фајл индекса %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Слободан Симић"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "slsimic@gmail.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Изаберите које фајлове желите да преузмете"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Преузми у:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Група:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Контролише ко&рисник"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Покрени торент"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Преузимање"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Изабери &све"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Без &избора"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Обрни избор"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Простор на диску"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Потребан простор:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Слободан простор:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Након преузимања:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Шифровање"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Користи шифровање протокола"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Шифровање протокола се користи да онемогући успоравање торент веза од стране "
+"вашег интернет провајдера."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Дозволи не-шифроване везе"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Ако није означено, моћи ћете да се повежете само са рачунарима који подржавају "
+"шифровање."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Протокол <b>Д</b>истрибуиране <b>Х</b>еш <b>Т</b>абеле."
+"<br>Децентрализовани протокол размене вршњака. Погледајте приручник за више "
+"детаља."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Користи DHT да добијеш више вршњака"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP порт за DHT комуникацију:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Посебан IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "&Пошаљи пратиоцу посебан ИП или име домаћина"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Посебан IP или име домаћина:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Икона системске касете"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Прикажи икону с&истемске касете"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Прикажи &брзиномер у икони"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Прикажи искачуће поруке системске касете"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Проток слања (у KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Проток преузимања (у KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Фасцикле"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Фасцикла за привремене фајлове:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Премести завршена преузимања у:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Аутоматски сними преузимања у:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Копирај .torrent фајлове у:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Трака преузимања"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Поставите ограничења брзине за торент"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Највећа брзина слања:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Највећа брзина преузимања:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 је без ограничења)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Додај могућег вршњака"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP вршњака:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Порт:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Унесите IP и порт вршњака."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "КТорентова црна листа"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Пажња: Црна листа се примењује само на текућу сесију. Користите сачувај/отвори "
+"да би сте сачували уносе или користите IPFilter прикључак (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Блокирани вршњаци"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "IP адреса вршњака"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Додај вршњака:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Додаје вршњака на црну листу"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Уклања изабраног вршњака са црне листе"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Оч&исти"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Чисти ову листу"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Сачувај к&ао..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Снима ову црну листу да се може користити са прикључком ИП филтер"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Највише преузимања:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Највише сејања:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Преузимање при малом простору на диску :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Минимум простора на диску:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Не покрећи"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Увек питај"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Форсирај"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 је без ограничења)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Највећа брзина преузимања:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Глобално ограничење веза:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Најдуже време сејања:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Највише веза по торенту:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Број веза слања:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP порт пратиоца:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Највећи однос дељења:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Највећа брзина слања:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/s (0 је без ограничења)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "часова (0 је без ограничења)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Настави сејање након завршеног преузимања"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Пажња"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Горе наведени портови морају бити прослеђени ако сте иза рутера. UPnP прикључак "
+"може то да учини за вас."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT прозор редоследа"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Стање:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Пратилац:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Однос:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Преостало:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Торент"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Контролише"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Слања"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Послато:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "П&омери горе"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Помери до&ле"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Помери на врх"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Помери на &дно"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&Контролише управник"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Контролише ко&рисник"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Пренеси URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "У &реду"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "Отк&ажи"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Направи торент"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Фајл или фасцикла за које хоћете да направите торент:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Морате додати бар једног пратиоца или чвор."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Опције фајла"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Величина сваког парчета:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Почни се&јање торента"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Децентрали&зовано (само DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Лични торент (DHT није дозвољен)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Коментари:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Направи"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "О&ткажи"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Пратиоци"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT чворишта"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Чвор:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP или име домаћина"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Порт"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Напомена: Нека позната добра DHT чворишта су већ убачена. Требало би да упишете "
+"и вашу IP адресу и порт ако намеравате да сејете овај торент."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Напредна подешавања"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr "Алгоритам процене преосталог времена:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>КТорент алгоритам:</b> Подразумевани алгоритам који користи комбинацију "
+"других алгоритама, на основу наших тестова."
+"<br>\n"
+"<b>Алгоритам тренутне брзине:</b> Најједноставнији алгоритам - "
+"Преостало/Тренутна брзина"
+"<br>\n"
+"<b>Алгоритам опште просечне брзине:</b> Преостало/Просечна брзина"
+"<br>\n"
+"<b>Алгоритам прозора од икс:</b> Процењено време се израчунава из X (икс) "
+"узорака брзине"
+"<br>\n"
+"<b>Алгоритам просека померања:</b> Просек померања се рачуна из X (икс) узорака"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Тренутна брзина"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Општа просечна брзина"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Прозор Икса"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Просек померања"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(делује након поновног покретања)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Искључи &резервисање простора"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "У потпуности ре&зервиши простор (избегава фрагментацију)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Основно (споро)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Својствено за фајл-систем"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Могућности"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Заузетост меморије:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Ниска"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Средња"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Висока"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Освежавање приказа:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Брз процесор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Спор процесор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Провера података"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Приликом слања &не проверавај поново парчиће веће од"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Провери &исправност података након"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "оштећених парчића"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Мрежа"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Највећи број подешавања везе:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP за IP пакете:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Не користи KDE-ов про&кси за везе HTTP пратиоца"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Прокси HTTP пратиоца:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Проверавам податке"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Проверавам податке торента :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Број нађених парчића :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Број лоших / непреузетих :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Тест"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Највећи број преузимања (0 = без ограничења)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Највећи број сејања (0 = без ограничења)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Да покрећем преузимања када је мало простора на диску?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Највећи број веза по торенту (0 = без ограничења)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Највећи број веза за све торенте (0 = без ограничења) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Највећа брзина слања у KB/s (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Највећа брзина преузимања у KB/s (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Максимум односа дељења(0 = без ограничења)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Максимално време сејања у часовима (0 = без ограничења)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Прикажи икону системске касете"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Прикажи брзиномер у икони"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Проток преузимања (у kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Проток слања (у kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Прикажи искачућу поруку када се торент заврши."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Настави сејање након завршеног преузимања"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Фасцикла за смештање привремених фајлова"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Да ли да се преузимање аутоматски сними у директоријум"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Фасцикла за смештање преузетих фајлова"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Да ли да се завршено преузимање аутоматски пребаци у одређени директоријум"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Фасцикла где се премештају завршени преузети фајлови"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Да ли да се .torrent фајлови аутоматски пребаце у назначени директоријум"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Фасцикла где се копирају .torrent фајлови"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Да ли да се користи посебан IP за прослеђивање пратиоцу"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Директоријум који је последњи коришћен за снимање"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP који се прослеђује пратиоцу"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Заузетост меморије"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Освежавање приказа"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Подршка за DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT порт"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Број веза слања"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Колоне приказане у КТорент прегледу"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "ET алгоритам"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Када нема довољно простора да би се завршило преузимање а слободни простор је "
+"мањи од minDiskSpace, торент ће бити заустављен."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Управљач прикључцима"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Учитај"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "И&збаци"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Учитај &све"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Избаци све"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Подразумеван UPnP уређај"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Нађени уређаји:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Уређај"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Портови прослеђени"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN везе"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Пр&оследи портове"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Врати прослеђивање портова"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Потражи"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Укључити прегледање фасцикле1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Укључити прегледање фасцикле2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Укључити прегледање фасцикле3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Путања фасцикле1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Путања фасцикле2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Путања фасцикле3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Да ли да се торент отвори без узнемиравања или не."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Радња брисања означена."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Радња премештања означена."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Подешавања прегледа фасцикле"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Прегледај фасциклу &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Прегледај фасциклу &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Прегледај фасциклу &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Премести у директоријум „учитано“ н&акон учитавања"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Премешта торент у директоријум „учитано“ након што га учита"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Отвори торенте ти&хо"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Не приказуј прозор „Изаберите фајлове за преузимање“"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Обриши након учита&вања"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Брише торенте након учитавања"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Фасцикле за преглед"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Фасцикла 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Фасцикла 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Фасцикла 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Подешавања претраге"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Веб сервер"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Проследи порт"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Трајање сесије (у секундама):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Изаберите интерфејс:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Корисничко име:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Измени лозинку ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Путања до програма за PHP:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Број порта"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "проследи порт"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Време трајања сесије"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "маска интерфејса"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Путања до програма за PHP"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "корисничко име"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "лозинка"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Парчићи"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Укупно:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Тренутно се преузима:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Преузето:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Изузето:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Преостало:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Величина:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Парче"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Напредак"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Вршњак"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Додељени вршњаци"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Сејачи:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Пијавице:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Просечна брзина преузимања:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Просечна брзина слања:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Освежавам за:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Стање пратиоца:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Делови торента који су преузети:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Делови торента који су доступни:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Дељење"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Ваше слање ће престати када однос дељења достигне ову вредност. Нула је без "
+"ограничења."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Ваше слање ће престати када протекне оволико часова у слању."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Часова"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Ограничење односа:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Ограничење ради само при сејању"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Временско &ограничење:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Освежи пратиоца"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Најмањи размак освежења - 60 секунди"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Додај п&ратиоца"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Уклони пратиоца"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Проме&ни пратиоца"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Врати подразумевано"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Прикажи језичак за приказ вршњака у главном прозору"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Прикажи језичак за приказ преузимања парчића у главном прозору"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Прикажи језичак за приказ пратилаца у главном прозору"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Прикажи листу вршњака"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Прикажи листу парчића који се трен&утно преузимају"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Прикажи листу пратилаца"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Подешавања IP блокирања"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Изаберите филтерски фајл PeerGuardian-а "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Користи PeerGuardian филтер?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Фајл IP филтера:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Преуз&ми/Претвори"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Преузима PeerGuardian-ов филтер са bluetack.co.uk или blocklist.org.\n"
+"Белешка: ZIP фајл са bluetack.co.uk је подржан."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL филтера Level1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Користи филтер level1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Претварам..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Кликните на дугме „Претвори“ да започнете претварање antip2p фајла. Пажња: Ово "
+"и на брзим машинама зна да потраје и током тог времена нећете моћи да користите "
+"КТорент."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Освежавање"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Освежи графикон сваких"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "освежавања приказа"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Прикупи податке сваких"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "милисекунди"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Максимум"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Режим размере највеће брзине:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Тачно"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Погледајте „Шта је ово“ за више помоћи"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Постави највећу вредност на OY скали као:\n"
+"- Врх: Глобално постигнута највећа брзина\n"
+"- Тачно: Највећа достигнута брзина се види на графикону"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Брзина вршњака"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Брзина вршњака:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "освежи сваких"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "освежавања графикона"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Прикупљање података о много повезаних вршњака може оптеретити процесор."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Везе вршњака"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Велике вредности могу загушити графикон повезаних вршњака"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Прикажи сејаче у ројевима"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Прикажи пијавице у ројевима"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Број мерења"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Слање"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Везе"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Вршњаци"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Укљ/искљ. графикон брзине вршњака"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Размак између узимања података о брзини вршњака"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Укљ/искљ. исцртавање пијавица у ројевима"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Укљ/искљ. исцртавање сејача у ројевима"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Број мерења преузимања"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Број мерења брзине вршњака"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Број мерења слања"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Број мерења веза"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Број мерења DHT-а"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Макс. режим OY осе"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Увези постојеће преузимање"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Торент:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Подаци:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Наведите торент и већ преузете податке за тај торент."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Увези"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "подразумевано"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS доводи"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Доводи"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "О&бриши"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Нов"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Чланци"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Ауто&освежавање"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "Зане&мари TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Освежи"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Наслов"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Чувај чланке (дана)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Активан"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Филтери"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Прихвати филтере"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Одбиј филтере"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Регуларни израз"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Третирај као &серије"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Процес"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Критеријум серије"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Поклапања без епизоде"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Макс. епизода"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Макс. сезона"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Мин. сезона"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Мин. епизода"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Тестирај те&кст"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Те&ст"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Филтрирај поклапања"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Распоређивач протока"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Категорија за леви клик"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Категор&ија 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "И&скључи"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Нормално"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Категорија &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Категорија &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Категорија за десни клик"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Категорија &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Категорија 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Категорије"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. категорија</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. категорија</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "преузимање:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "слање:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. категорија</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* нула је без ограничења"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Сними у фајл"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Учитај из фајла"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Ресетуј распоред"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "У &реду"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Страна за подешавање прикључка распоређивача"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Користи &распоређивач протока?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Распоређивач протока"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Користи боје уместо &сличица?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Препоручено за спорије системе)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Уреди р&аспоред"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Укључи распоређивач протока?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Користи боје уместо сличица?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Користи богати текст дневника"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Заставица општих информација"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Заставица порука о везама"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Заставица DHT порука"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Заставица информација о пратиоцу"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Заставица информација о диску"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Заставица за поруке IPFilter прикључка"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Заставица за поруке прикључка претраживања"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Заставица порука прикључка Увоз делимичних фајлова"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Заставица за поруке прикључка Додатне информације"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Заставица за поруке прикључка UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Заставица за поруке прикључка Преглед фасцикле"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Заставица за поруке прикључка распоређивача"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Заставица за поруке RSS прикључка"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Заставица за поруке прикључка веб интерфејса"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Опције прегледача дневника"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Прикључци"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Све"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Исправљање грешака"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Обавештења"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Важно"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Ништа"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP филтер:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Тражење:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Преглед фасцикле:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Распоређивач:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Увоз делимичних фајлова:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Инфо прозор:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS прикључак:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Прикључак веб интерфејса:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Систем"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Опште:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Везе:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Ул/Изл диска:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Користи обогаћени те&кст за дневник"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Спољни прегледач"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Отвори резултате претраге у спољном прегледачу"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Користи подразумевани"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Путања до прегледача:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Мотори претраге"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Име мотора тражења:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "Дод&ај"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Мотори"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Уклони св&е"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Додај под&разумевано"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Освежи са интернета"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Тражи"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Мотор тражења:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Тренутни мотор претраге"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Користи посебан прегледач"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Путања до програма посебног прегледача"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"%n дан\n"
+"%n дана\n"
+"%n дана"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Да, први"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Да, последњи"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Не могу да отворим фајл дневника %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Не могу да пишем у %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Не могу да читам из %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Не могу да направим директоријум %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Не могу да симболички повежем %1 на %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Не могу да померим %1 у %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Не могу да копирам %1 у %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Не могу да избришем %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Не могу да направим %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Не могу да прорачунам величину за %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Не могу да прорачунам величину : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Не могу да отворим %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Не могу да раширим фајл : %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Не могу да раширим фајл"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Не могу да тражим у фајлу : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Не могу да пишем преко краја mmap бафера!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Стање: <b>%2</b><br>Аутор: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Учитан"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Није учитан"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Опције прикључка"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Не могу да отворим фајл %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Директоријум %1 не постоји"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Недозвољено обележје: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Грешка декодовања"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Неочекиван крај улаза"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Не могу да претворим %1 у int"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Торент није завршен!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Оштећен торент!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Торент нема поље објаве или чворова"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Не могу да отворим торент фајл %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Грешка рашчлањивања"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Грешка се догодила при учитавању торента. Торент је вероватно оштећен или то "
+"уопште није торент фајл.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Грешка се догодила при учитавању торента. Торент је вероватно оштећен или то "
+"уопште није торент фајл."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Не могу да направим %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr "Торент %1 се већ преузима. Листе пратилаца оба торента су састављене."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Већ преузимате торент %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Не могу преселим %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Торент %1 је покренут са претходном верзијом КТорента. Да би били сигурни да ће "
+"радити и са овом верзијом КТорента, мораћемо да га преселимо. Бићете упитани за "
+"локацију снимања торента. Ако притиснете Откажи изабраће се ваш почетни "
+"директоријум."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Изаберите фасциклу у коју се снима"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Није покренут"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Сејем"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Преузимам"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Застој"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Заустављен"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Грешка: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Одвајам простор на диску"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "У реду"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Проверавам податке"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Заустављен. Нема слободног простора."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Немате довољно простора да би сте преузели овај торент. Желите ли заиста да "
+"наставите?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Недовољно простора за %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Торент „%1“ је достигао максимум односа дељења. Да занемарим ограничење и "
+"започнем сејање?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Максимум ограничења односа дељења је достигнут."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Грешка при заустављању торента %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Грешка при покретању торента %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Објављујем"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Непознат програм"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"%n вршњак\n"
+"%n вршњака\n"
+"%n вршњака"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Не могу да направим %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Не могу да упишем прво парче у DND фајл : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Не могу да упишем последње парче у DND фајл : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Не могу да отворим %1 ради уписа : фајл-систем само за читање"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Не могу да раширим фајл %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Не могу да раширим фајл %1 : некомплетан упис"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Не могу да раширим фајл %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Грешка : Читање је прошло завршетак фајла %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Грешка при читању из %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Грешка при упису у %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Грешка при упису у %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Не могу да одвојим простор на диску : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Не могу да се вежем на udp порт %1 или 10 следећих портова."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Неисправан одговор са пратиоца"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Неисправни подаци са пратиоца"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Неисправан URL пратиоца"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Не могу да отворим фајл %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Не могу да направим индексни фајл: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Не могу да отворим фајл : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Користи UPnP да аутоматски проследи портове на вашем рутеру"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Не могу да нађем услугу прослеђивања портова у опису уређаја!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP уређаји"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Аутоматски тражи торенте у директоријумима и учитава их."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Прегледај фасциклу"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Прегледај фасциклу"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Опције прегледа фасцикле"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "учитан"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Преглед фасцикле - Фасцикла %1: Неисправан URL или фасцикла не постоји. "
+"Изаберите исправан директоријум."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Веб интерфејс"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Опције веб интерфејса"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "Програм за PHP није на подразумеваној путањи, унесите путању ручно"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Унесите нову лозинку за веб интерфејс."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 постоји и извршан је"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 не постоји"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 није извршан"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 је директоријум"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 није путања до програма за php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Веб интерфејс"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Омогућава да контролишете КТорент кроз веб прегледач"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Преузми прво"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Преузми нормално"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Преузми последње"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Избриши фајл(ове)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Доступно"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Наступајуће"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Изгубићете све податке из овог фајла. Сигурни сте да желите ово да урадите?\n"
+"Изгубићете све податке из ових фајлова. Сигурни сте да желите ово да урадите?\n"
+"Изгубићете све податке из ових фајлова. Сигурни сте да желите ово да урадите?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Без ограничења"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Инфо прозор"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Приказује додатне информације о преузимању. Колико парчића је преузето, колико "
+"има сејача и пијавица ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Не могу да додам пратиоца у лични торент."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Не могу да уклоним подразумеваног пратиоца."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Не можете додати пратиоце у лични торент"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Земља"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Програм"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Загушено"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Квргаво"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Доступност"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Оцена"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Веза слања"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Захтеви"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Избаци вршњака"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Блокирај вршњака"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Доступни парчићи"
+"<br><img src=\"unavailable_color\">&nbsp; - Недоступни парчићи"
+"<br><img src=\"excluded_color\">&nbsp; - Изузети парчићи"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Опције Инфо прозора"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Преузети парчићи"
+"<br><img src=\"unavailable_color\">&nbsp; - Парчићи за преузимање"
+"<br><img src=\"excluded_color\">&nbsp; - Изузети парчићи"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Претвори"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Учитавам txt фајл..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Молим сачекајте..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Фајл претворен."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Не могу да учитам филтер:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Лош фајл филтера. Можда је оштећен или има лош формат."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Филтрира нежељене вршњаке на основу њихове ИП адресе"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP филтер"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Стање: Учитан и ради."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Стање: Није учитан."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Стање: <font color=\"#ff0000\">Филтер није нађен.</font> "
+"Преузмите и претворите фајл филтера."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Изабрани фајл већ постоји. Желите ли да га поново преузмете?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Фајл постоји"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Фајл филтера (level1.dat) већ постоји. Желите ли да га поново претворите?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Филтер IP блокирања"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Опције филтера IP блокирања"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Статистика"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Опције статистике"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Пијавица повезано"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Пијавица у ројевима"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Сејача повезано"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Сејача у ројевима"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Просечно повезаних пијавица по торенту"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Просечно повезаних сејача по торенту"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Просечно повезаних пијавица по покренутом торенту"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Просечно повезаних сејача по покренутом торенту"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Чворови"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Послови"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Приказује статистику преноса"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Статистика брзине"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Статистика везе"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Тренутно"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Просечно"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Ограничење"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Просечно од пијавице"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Просечно ка пијавици"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Просечно од сејача"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Од пијавица"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Од сејача"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Легенда"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Торент фајлови"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Сви фајлови"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Не могу да проверим податке : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Не могу да учитам торент : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Увози делимично или потпуно преузете торенте из других програма"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Увези постојеће преузимање"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL или довод"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Аутоматски претражује RSS доводе ради торента који се поклапају са задатим "
+"изразом и учитава их."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS доводи"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Нисам успео да нађем и учитам исправан торент за %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Наслов"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Опис"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Веза"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Сезона"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Епизода"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Време"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Распоређивач"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Опције прикључка распоређивача"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "ПОН"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "УТО"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "СРЕ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "ЧЕТ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "ПЕТ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "СУБ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "НЕД"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Распоред сачуван."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Фајл није нађен."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Распоред учитан."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Прикључак за распоређивање протока"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Отвори Распоређивач протока"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Распоређивач протока је искључен. Идите на Подешавања->"
+"Распоређивач да га укључите."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Преглед дневника"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Преглед дневника"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Приказује излаз дневника КТорента"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Употребите ваш веб прегледач да нађете %1 (велика слова) на мотору претраге "
+"који желите да додате. "
+"<br>Онда копирајте URL из траке адресе након што се претрага заврши и пренесите "
+"га овде."
+"<br>"
+"<br>На пример, тражење %1 на Google-у ће вратити "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. Ако додате тај URL "
+"овде, КТорент ће моћи да претражује уз помоћ Google-а."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Употребите ваш веб прегледач да нађете %1 (велика слова) на мотору претраге "
+"који желите да додате. Испод упишите URL који тако добијете."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Морате унети име и URL мотора претраживања"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Мотор претраживања са тим именом већ постоји. Изаберите друго име."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Лош URL. Треба да тражите FOOBAR помоћу интернет прегледача и копирате и "
+"пренесете овде тачан URL."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Претрага"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Опције мотора тражења"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Тражим %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Торент фајлови"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Тражење завршено"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Мотор: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Тражи торенте на неколико популарних претраживача торента"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Желите ли да преузмете или сачувате торент?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Преузми торент"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Преузми"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Налази вршњаке који користе КТорент на локалној мрежи са којима може да дели "
+"торенте"
diff --git a/translations/sr@Latn/Makefile.am b/translations/sr@Latn/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/sr@Latn/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/sr@Latn/messages/Makefile.am b/translations/sr@Latn/messages/Makefile.am
new file mode 100644
index 0000000..1347978
--- /dev/null
+++ b/translations/sr@Latn/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = sr@Latn
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/sr@Latn/messages/ktorrent.po b/translations/sr@Latn/messages/ktorrent.po
new file mode 100644
index 0000000..488a470
--- /dev/null
+++ b/translations/sr@Latn/messages/ktorrent.po
@@ -0,0 +1,4935 @@
+# translation of ktorrent.po to Serbian
+# translation of ktorrent.po to
+#
+# Slobodan Simic <simicsl@verat.net>, 2005, 2007.
+# Slobodan Simic <slsimic@gmail.com>, 2006, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-07-24 15:03+0200\n"
+"Last-Translator: Slobodan Simic <simicsl@verat.net>\n"
+"Language-Team: Serbian <kde-i18n-sr@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Nema dolaznih veza (verovatno ste iza zaštitnog zida)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Info"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Podaci preneseni tokom trenutne sesije"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Trenutna brzina svih torenta zajedno"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupe"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Pokreni"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Zaustavi"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Pokreni sve"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Zaustavi sve"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Prenesi URL torenta..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Otvori upravnika redosleda..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Stavi/Ukloni iz reda"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "Filter IP-a"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Proveri ispravnost podataka"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Najveća brzina slanja"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Najveća brzina preuzimanja"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torent fajlovi"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Svi fajlovi"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Otvori lokaciju"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Brzina preuzimanja: %1 / slanja: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Preuzeto: %1 / Poslato: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: veza %1, poslova %2"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: isključen"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Svi torenti"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Pomeri na levi dok"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Pomeri na desni dok"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Pomeri na donji dok"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Dodeli ubrzavač..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Očisti ubrzavač"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Promeni broj dugmeta"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Novi broj ubrzavača:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Morate uneti IP u obliku „XXX.XXX.XXX.XXX“. Takođe, možete koristiti i džokere "
+"za opsege, npr „127.0.0.*“."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Izaberite fajl"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Izaberite ime fajla pod kojim snimate"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Loše formiran URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Preuzimanja"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Slanja"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Navedeni port (%1) je nedostupan ili ga koristi drugi program. KTorrent sada "
+"koristi port %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent ne može da prihvata veze jer su portovi %1 do %2 već upotrebljeniod "
+"strane drugog programa."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Ne mogu da napravim torent: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Nedostaje nekoliko fajlova „%1“ torenta. Želite li da ih ponovo napravite ili "
+"da ih ne preuzimate?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Napravi"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Ne preuzimaj"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Ne mogu da napravim nedostajuće fajlove: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Nedostaju fajlovi sa podacima"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Ne mogu da demarkiram nedostajuće fajlove: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Nedostaje fajl u koji se snimaju podaci „%1“ torenta. Želite li da ga ponovo "
+"napravite?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Napravi"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Ne mogu da napravim fajl: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Nedostaje fajl sa podacima"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Proveri podatke"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "beskonačno"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Greška pri proveri podataka: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Proveravam podatke za <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "BitTorrent program za KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Režim ispravljanja grešaka"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokument za otvaranje"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS priključak"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Priključak veb interfejsa"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Priključak statistike"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Ikona programa i još poneka"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Ikona preuzimanja"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 Ikona programa"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Saveti trake parčića i razvrstavanje stavki IW fajla"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Lokator zemalja za InfoWidget priključak (Ovaj proizvod uključuje GeoLite "
+"podatke koje je napravio MaxMind, dostupne na http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Zastave zemalja"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Prioritet fajla"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp je korišćen kao primer za našu UPnP primenu"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Zakrpa za globalni najveći odnos deljenja"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconf poboljšanja"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk veb interejs"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEAl kod iz KDevelop-a"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Poboljšanje konverzije brzine u priključku IP filtera"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Otkrio 2 sigurnosna propusta (oba su otklonjena)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Zakrpa za tiho učitavanje sa sačuvane lokacije"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Ispravke u PHP kodu veb interfejsa"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Rezervisanje prostora na XFS disku"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Zakrpa za neprikazivanje veoma malih brzina"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Zakrpa za prikazivanje mogućeg stanja iza zaštitnog zida"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Nekoliko zakrpa"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Nekoliko zakrpa"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Filtriraj poklapanja"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Zakrpa za tiho učitavanje sa sačuvane lokacije"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Morate izabrati fajl ili fasciklu."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Niste dodali pratioca. Jeste li sigurni da hoćete da napravite ovaj torent ?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Morate dodati bar jedan čvor."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torent fajlovi (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Izaberite fajl da snimite torent"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Pravim %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Posebne grupe"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Nova grupa"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Uredi ime"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Ukloni grupu"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Otvori jezičak"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Unesite ime grupe."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Grupa %1 već postoji."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Unesite ime nove grupe."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktivna slanja"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Naredna slanja"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Naredna preuzimanja"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Korisnička preuzimanja"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Korisnička slanja"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Neaktivni torenti"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Neaktivna preuzimanja"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Neaktivna slanja"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktivni torenti"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktivna preuzimanja"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Ukloni torent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Ukloni torent i podatke"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "Dodaj vršnjake..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Dodatni izvori vršnjaka"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+#, fuzzy
+msgid "Torrent Peer Sources:"
+msgstr "Izvori vršnjaka torenta:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Razmena vršnjaka"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Ručno objavljivanje"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Pregled"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+#, fuzzy
+msgid "Open Directory"
+msgstr "Otvori direktorijum..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Direktorijum podataka"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Privremeni direktorijum"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "Odredite mesto za preuzimanje..."
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Ukloni iz grupe"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Dodaj u grupu"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Ograničenja brzine"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Torent ne postoji. Prijavite ovu greški programerima KTorrent-a."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Dodat mogući vršnjak"
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Loše formirana adresa."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Podešavanja"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Opcije preuzimanja"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT port mora biti različit od UDP porta pratioca!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Opšte"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Opšte opcije"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Ne mogu da naćem %1: %2\n"
+"Navedite ispravnu IP adresu ili ime domaćina."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Napredno"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Napredne opcije"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Vidljive kolone"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Stanje"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Preuzeto"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Veličina"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Poslato"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Preuzimanje"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Slanje"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Preostalo vreme"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Sejači"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Pijavice"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% završeno"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Odnos deljenja"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Vreme preuzimanja"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Vreme sejanja"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Svi torenti %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Ne mogu da pokrenem više od %n preuzimanja, \n"
+"Ne mogu da pokrenem više od %n preuzimanja, \n"
+"Ne mogu da pokrenem više od %n preuzimanja, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"i %n sejanje. \n"
+"i %n sejanja. \n"
+"i %n sejanja. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Idite u Podešavanja -> Podesi KTorrent, ako želite da promenite ograničenje."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Torent %1 nije završio preuzimanje. Želite li takođe da obrišete i nepotpune "
+"podatke ?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Ukloni preuzimanje"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Obriši podatke"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Zadrži podatke"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Izgubićete sve preuzete podatke. Želite li zaista ovo da učinite?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Već proveravate podatke torenta %1 !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Izaberite mesto preuzimanja za %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Izbacili ste sledeće postojeće fajlove. Izgubićete sve podatke u ovim "
+"fajlovima. Da li ste sigurni da želite ovo da uradite?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Da, izbriši fajlove"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Ne, zadrži fajlove"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " kratko!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Korisnik"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Upravnik redosleda"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Ne (lični torent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Brzina:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Preuzimanje: <font color='#1c9a1c'>%1</font></td>"
+"<td>Slanje: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Prenos:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Preuzimanje: <font color='#1c9a1c'>%3</font></td>"
+"<td>Slanje: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> je završio preuzimanje.<br>Prosečna brzina: %2 PR / %3 SL."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Preuzimanje završeno"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> je dostigao maksimum odnosa deljenja od %2 pa je zaustavljen."
+"<br>Poslato %3 pri prosečnoj brzini od %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Sejanje završeno"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> je dostigao maksimum vremena sejanja od %2 č. pa je zaustavljen."
+"<br>Poslato %3 pri prosečnoj brzini od %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> je zaustavljen sa sledećom greškom: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Nađeni su oštećeni podaci u torentu <b>%1</b>"
+"<br>Bilo bi dobro da proverite ispravnost podataka za torent."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> je dostigao maksimum odnosa deljenja od %2 i ne može se ponovo "
+"staviti u red. Sami uklonite ograničenje ako želite da nastavite sejanje."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> je dostigao maksimum vremena sejanja od %2 č. i ne može se ponovo "
+"staviti u red. Sami uklonite ograničenje ako želite da nastavite sejanje."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torent se ne može staviti u red."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Ne mogu da pokrenem <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Ne mogu da sejem više od %n torenta. "
+"<br>\n"
+"Ne mogu da sejem više od %n torenta. "
+"<br>\n"
+"Ne mogu da sejem više od %n torenata. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Ne mogu da preuzimam više od %n torenta. "
+"<br>\n"
+"Ne mogu da preuzimam više od %n torenta. "
+"<br>\n"
+"Ne mogu da preuzimam više od %n torenata. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Torent se ne može pokrenuti"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Nema dovoljno slobodnog prostora."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "Na disku vam ponestaje prostora.<br /><b>%1</b> se preuzima u „%2“."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torent je zaustavljen.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Uređaju ponestaje prostora"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Ograničenje u KB/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Neograničeno"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Ograničenja brzine za <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE-ov KPart program"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Ne mogu da otvorim fajl indeksa %1 : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Slobodan Simić"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "slsimic@gmail.com"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Izaberite koje fajlove želite da preuzmete"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Preuzimi u:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupa:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Kontroliše ko&risnik"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Pokreni torent"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Preuzimanje"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Izaberi &sve"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Bez &izbora"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Obrni izbor"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Prostor na disku"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Potreban prostor:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Slobodan prostor:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Nakon preuzimanja:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Šifrovanje"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Koristi šifrovanje protokola"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Šifrovanje protokola se koristi da onemogući usporavanje torent veza od strane "
+"vašeg internet provajdera."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Dozvoli nešifrovane veze"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Ako nije označeno, moći ćete da se povežete samo sa računarima koji podržavaju "
+"šifrovanje."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Protokol <b>D</b>istribuirane <b>H</b>eš <b>T</b>abele."
+"<br>Decentralizovani protokol razmene vršnjaka. Pogledajte priručnik za više "
+"detalja."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Koristi DHT da dobiješ više vršnjaka"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP port za DHT komunikaciju:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Poseban IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "&Pošalji pratiocu poseban IP ili ime domaćina"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Poseban IP ili ime domaćina:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ikona sistemske kasete"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Prikaži ikonu s&istemske kasete"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Prikaži &brzinomer u ikoni"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Prikaži iskačuće poruke sistemske kasete"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Protok slanja (u KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Protok preuzimanja (u KB/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Fascikle"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Fascikla za privremene fajlove:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Premesti završena preuzimanja u:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Automatski snimi preuzimanja u:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Kopiraj .torrent fajlove u:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Traka preuzimanja"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Postavite ograničenja brzine za torent"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Najveća brzina slanja:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Najveća brzina preuzimanja:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/s (0 je bez ograničenja)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Dodaj mogućeg vršnjaka"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP vršnjaka:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Unesite IP i port vršnjaka."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent-ova crna lista"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Pažnja: Crna lista se primenjuje samo na tekuću sesiju. Koristite "
+"sačuvaj/otvori da bi stesačuvali unose ili koristite IPFilter priključak "
+"(PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Blokirani vršnjaci"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "IP adresa vršnjaka"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Dodaj vršnjaka:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Dodaje vršnjaka na crnu listu"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Uklanja izabranog vršnjaka sa crne liste"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Oč&isti"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Čisti ovu listu"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Sačuvaj k&ao..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Snima ovu crnu listu da se može koristiti sa priključkom IP filter"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Najviše preuzimanja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Najviše sejanja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Preuzimanje pri malom prostoru na disku :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimum prostora na disku:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Ne pokreći"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Uvek pitaj"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Forsiraj"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 je bez ograničenja)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Najveća brzina preuzimanja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Globalno ograničenje veza:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Najduže vreme sejanja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Najviše veza po torentu:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Broj veza slanja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP port pratioca:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Najveći odnos deljenja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Najveća brzina slanja:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/s (0 je bez ograničenja)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "časova (0 je bez ograničenja)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Nastavi sejanje nakon završenog preuzimanja"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Pažnja"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Gore navedeni portovi moraju biti prosleđeni ako ste iza rutera. UPnP "
+"priključak može to da učini za vas."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT prozor redosleda"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Stanje:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Pratilac:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Odnos:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Preostalo:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Kontroliše"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Slanja"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Poslato:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "P&omeri gore"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Pomeri do&le"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Pomeri na vrh"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Pomeri na &dno"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&Kontroliše upravnik"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Kontroliše ko&risnik"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Prenesi URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "U &redu"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "Otk&aži"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Napravi torent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Fajl ili fascikla za koje hoćete da napravite torent:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Morate dodati bar jednog pratioca ili čvor."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Opcije fajla"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Veličina svakog parčeta:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Počni se&janje torenta"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Decentrali&zovano (samo DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Lični torent (DHT nije dozvoljen)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Komentari:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Napravi"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "O&tkaži"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Pratioci"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT čvorišta"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Čvor:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP ili ime domaćina"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Napomena: Neka poznata dobra DHT čvorišta su već ubačena. Trebalo bi da upišete "
+"i vašu IP adresu i port ako nameravate da sejete ovaj torent."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Napredna podešavanja"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>KTorrent algoritam:</b> Podrazumevani algoritam koji koristi kombinaciju "
+"drugih algoritama, na osnovu naših testova."
+"<br>\n"
+"<b>Algoritam trenutne brzine:</b> Najjednostavniji algoritam - "
+"Preostalo/Trenutna brzina"
+"<br>\n"
+"<b>Algoritam opšte prosečne brzine:</b> Preostalo/Prosečna brzina"
+"<br>\n"
+"<b>Algoritam prozora od iks:</b> Procenjeno vreme se izračunava iz X (iks) "
+"uzoraka brzine"
+"<br>\n"
+"<b>Algoritam proseka pomeranja:</b> Prosek pomeranja se računa iz X (iks) "
+"uzoraka"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Trenutna brzina"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Opšta prosečna brzina"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Prozor Iksa"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Prosek pomeranja"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(deluje nakon ponovnog pokretanja)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Isključi &rezervisanje prostora"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "U potpunosti re&zerviši prostor (izbegava fragmentaciju)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Osnovno (sporo)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Svojstveno za fajl-sistem"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Mogućnosti"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Zauzetost memorije:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Niska"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Srednja"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Visoka"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Osvežavanje prikaza:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Brz procesor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Spor procesor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Provera podataka"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Prilikom slanja &ne proveravaj ponovo parčiće veće od"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Proveri &ispravnost podataka nakon"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "oštećenih parčića"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Mreža"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Najveći broj veza po torentu (0 = bez ograničenja)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Ne koristi KDE-ov pro&ksi za veze HTTP pratioca"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Proksi HTTP pratioca:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Proveravam podatke"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Proveravam podatke torenta :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Broj nađenih parčića :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Broj loših / nepreuzetih :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Najveći broj preuzimanja (0 = bez ograničenja)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Najveći broj sejanja (0 = bez ograničenja)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Da pokrećem preuzimanja kada je malo prostora na disku?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Najveći broj veza po torentu (0 = bez ograničenja)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Najveći broj veza za sve torente (0 = bez ograničenja) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Najveća brzina slanja u KB/s (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Najveća brzina preuzimanja u KB/s (0 = no limit)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maksimum odnosa deljenja(0 = bez ograničenja)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maksimalno vreme sejanja u časovima (0 = bez ograničenja)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Prikaži ikonu sistemske kasete"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Prikaži brzinomer u ikoni"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Protok preuzimanja (u kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Protok slanja (u kb/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Prikaži iskačuću poruku kada se torent završi."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Nastavi sejanje nakon završenog preuzimanja"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Fascikla za smeštanje privremenih fajlova"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Da li da se preuzimanje automatski snimi u direktorijum"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Fascikla za smeštanje preuzetih fajlova"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr ""
+"Da li da se završeno preuzimanje automatski prebaci u određeni direktorijum"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Fascikla gde se premeštaju završeni preuzeti fajlovi"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Da li da se .torrent fajlovi automatski prebace u naznačeni direktorijum"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Fascikla gde se kopiraju .torrent fajlovi"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Da li da se koristi poseban IP za prosleđivanje pratiocu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Direktorijum koji je poslednji korišćen za snimanje"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP koji se prosleđuje pratiocu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Zauzetost memorije"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Osvežavanje prikaza"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Podrška za DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Broj veza slanja"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Kolone prikazane u KTorrent pregledu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "ET algoritam"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Kada nema dovoljno prostora da bi se završilo preuzimanje a slobodni prostor je "
+"manji od minDiskSpace, torent će biti zaustavljen."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Upravljač priključcima"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Učitaj"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "I&zbaci"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Učitaj &sve"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Izbaci sve"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Podrazumevan UPnP uređaj"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Nađeni uređaji:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Uređaj"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Portovi prosleđeni"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN veze"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Pr&osledi portove"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Vrati prosleđivanje portova"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Potraži"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Uključiti pregledanje fascikle1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Uključiti pregledanje fascikle2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Uključiti pregledanje fascikle3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Putanja fascikle1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Putanja fascikle2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Putanja fascikle3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Da li da se torent otvori bez uznemiravanja ili ne."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Radnja brisanja označena."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Radnja premeštanja označena."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Podešavanja pregleda fascikle"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Pregledaj fasciklu &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Pregledaj fasciklu &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Pregledaj fasciklu &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Premesti u direktorijum „učitano“ n&akon učitavanja"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Premešta torent u direktorijum „učitano“ nakon što ga učita"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Otvori torente ti&ho"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Ne prikazuj prozor „Izaberite fajlove za preuzimanje“"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Obriši nakon učita&vanja"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Briše torente nakon učitavanja"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Fascikle za pregled"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Fascikla 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Fascikla 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Fascikla 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Podešavanja pretrage"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Veb server"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Prosledi port"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Trajanje sesije (u sekundama):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Izaberite interfejs:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Korisničko ime:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Izmeni lozinku ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Putanja do programa za PHP:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Broj porta"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "prosledi port"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Vreme trajanja sesije"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "maska interfejsa"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Putanja do programa za PHP"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "korisničko ime"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "lozinka"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Parčići"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Ukupno:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Trenutno se preuzima:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Preuzeto:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Izuzeto:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Preostalo:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Veličina:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Parče"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Napredak"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Vršnjak"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Dodeljeni vršnjaci"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Sejači:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Pijavice:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Prosečna brzina preuzimanja:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Prosečna brzina slanja:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Osvežavam za:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Stanje pratioca:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Delovi torenta koji su preuzeti:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Delovi torenta koji su dostupni:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Deljenje"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Vaše slanje će prestati kada odnos deljenja dostigne ovu vrednost. Nula je bez "
+"ograničenja."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Vaše slanje će prestati kada protekne ovoliko časova u slanju."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Časova"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Ograničenje odnosa:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Ograničenje radi samo pri sejanju"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Vremensko &ograničenje:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Osveži pratioca"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Najmanji razmak osveženja - 60 sekundi"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Dodaj p&ratioca"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Ukloni pratioca"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Prome&ni pratioca"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Vrati podrazumevano"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Prikaži jezičak za prikaz vršnjaka u glavnom prozoru"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Prikaži jezičak za prikaz preuzimanja parčića u glavnom prozoru"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Prikaži jezičak za prikaz pratilaca u glavnom prozoru"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Prikaži listu vršnjaka"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Prikaži listu parčića koji se tren&utno preuzimaju"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Prikaži listu pratilaca"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Podešavanja IP blokiranja"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Izaberite filterski fajl PeerGuardian-a "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Koristi PeerGuardian filter?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Fajl IP filtera:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Preuz&mi/Pretvori"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Preuzima PeerGuardian-ov filter sa bluetack.co.uk ili blocklist.org.\n"
+"Beleška: ZIP fajl sa bluetack.co.uk je podržan."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "URL filtera Level1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Koristi filter level1?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Pretvaram..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Kliknite na dugme „Pretvori“ da započnete pretvaranje antip2p fajla. Pažnja: "
+"Ovo i na brzim mašinama zna da potraje i tokom tog vremena nećete moći da "
+"koristite KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Osvežavanje"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Osveži grafikon svakih"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "osvežavanja prikaza"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Prikupi podatke svakih"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisekundi"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maksimum"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Režim razmere najveće brzine:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Tačno"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Pogledajte „Šta je ovo“ za više pomoći"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Postavi najveću vrednost na OY skali kao:\n"
+"- Vrh: Globalno postignuta najveća brzina\n"
+"- Tačno: Najveća dostignuta brzina se vidi na grafikonu"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Brzina vršnjaka"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Brzina vršnjaka:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "osveži svakih"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "osvežavanja grafikona"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Prikupljanje podataka o mnogo povezanih vršnjaka može opteretiti procesor."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Veze vršnjaka"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Velike vrednosti mogu zagušiti grafikon povezanih vršnjaka"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Prikaži sejače u rojevima"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Prikaži pijavice u rojevima"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Broj merenja"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Slanje"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Veze"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Vršnjaci"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Uklj/isklj. grafikon brzine vršnjaka"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Razmak između uzimanja podataka o brzini vršnjaka"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Uklj/isklj. iscrtavanje pijavica u rojevima"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Uklj/isklj. iscrtavanje sejača u rojevima"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Broj merenja preuzimanja"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Broj merenja brzine vršnjaka"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Broj merenja slanja"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Broj merenja veza"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Broj merenja DHT-a"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Maks. režim OY ose"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Uvezi postojeće preuzimanje"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Podaci:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Navedite torent i već preuzete podatke za taj torent."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Uvezi"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "podrazumevano"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS dovodi"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Dovodi"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "O&briši"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Nov"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Članci"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Auto&osvežavanje"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "Zane&mari TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Osveži"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Naslov"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Čuvaj članke (dana)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktivan"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filteri"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Prihvati filtere"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Odbij filtere"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Regularni izraz"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Tretiraj kao &serije"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Proces"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Kriterijum serije"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Poklapanja bez epizode"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Maks. epizoda"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Maks. sezona"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Min. sezona"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Min. epizoda"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Testiraj te&kst"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&st"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtriraj poklapanja"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Raspoređivač protoka"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Kategorija za levi klik"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kategor&ija 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "I&sključi"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normalno"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategorija &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategorija &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Kategorija za desni klik"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategorija &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategorija 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorije"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. kategorija</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. kategorija</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "preuzimanje:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "slanje:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. kategorija</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* nula je bez ograničenja"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Snimi u fajl"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Učitaj iz fajla"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Resetuj raspored"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "U &redu"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Strana za podešavanje priključka raspoređivača"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Koristi &raspoređivač protoka?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Raspoređivač protoka"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Koristi boje umesto &sličica?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Preporučeno za sporije sisteme)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Uredi r&aspored"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Uključi raspoređivač protoka?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Koristi boje umesto sličica?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Koristi bogati tekst dnevnika"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Zastavica opštih informacija"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Zastavica poruka o vezama"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Zastavica DHT poruka"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Zastavica informacija o pratiocu"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Zastavica informacija o disku"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Zastavica za poruke IPFilter priključka"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Zastavica za poruke priključka pretraživanja"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Zastavica poruka priključka Uvoz delimičnih fajlova"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Zastavica za poruke priključka Dodatne informacije"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Zastavica za poruke priključka UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Zastavica za poruke priključka Pregled fascikle"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Zastavica za poruke priključka raspoređivača"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Zastavica za poruke RSS priključka"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Zastavica za poruke priključka veb interfejsa"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Opcije pregledača dnevnika"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Priključci"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Sve"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Ispravljanje grešaka"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Obaveštenja"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Važno"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Ništa"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Traženje:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Pregled fascikle:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Raspoređivač:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Uvoz delimičnih fajlova:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Info prozor:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS priključak:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Priključak veb interfejsa:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistem"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Opšte:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Veze:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Ul/Izl diska:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Koristi obogaćeni te&kst za dnevnik"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Spoljni pregledač"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Otvori rezultate pretrage u spoljnom pregledaču"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Koristi podrazumevani"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Putanja do pregledača:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Motori pretrage"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Ime motora traženja:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "Dod&aj"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Motori"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Ukloni sv&e"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Dodaj pod&razumevano"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Osveži sa interneta"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Traži"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Motor traženja:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Trenutni motor pretrage"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Koristi poseban pregledač"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Putanja do programa posebnog pregledača"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"%n dan\n"
+"%n dana\n"
+"%n dana"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Da, prvi"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Da, poslednji"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Ne mogu da otvorim fajl dnevnika %1 : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Ne mogu da pišem u %1 : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Ne mogu da čitam iz %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Ne mogu da napravim direktorijum %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Ne mogu da simbolički povežem %1 na %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Ne mogu da pomerim %1 u %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Ne mogu da kopiram %1 u %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Ne mogu da izbrišem %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Ne mogu da napravim %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Ne mogu da proračunam veličinu za %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Ne mogu da proračunam veličinu : %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Ne mogu da otvorim %1 : %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Ne mogu da raširim fajl : %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Ne mogu da raširim fajl"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Ne mogu da tražim u fajlu : %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Ne mogu da pišem preko kraja mmap bafera!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Stanje: <b>%2</b><br>Autor: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Učitan"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Nije učitan"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Opcije priključka"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Ne mogu da otvorim fajl %1 : %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Direktorijum %1 ne postoji"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Nedozvoljeno obeležje: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Greška dekodovanja"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Neočekivan kraj ulaza"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Ne mogu da pretvorim %1 u int"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torent nije završen!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Oštećen torent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torent nema polje objave ili čvorova"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Ne mogu da otvorim torent fajl %1 : %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Greška raščlanjivanja"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Greška se dogodila pri učitavanju torenta. Torent je verovatno oštećen ili to "
+"uopšte nije torent fajl.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Greška se dogodila pri učitavanju torenta. Torent je verovatno oštećen ili to "
+"uopšte nije torent fajl."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Ne mogu da napravim %1 : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr "Torent %1 se već preuzima. Liste pratilaca oba torenta su sastavljene."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Već preuzimate torent %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Ne mogu preselim %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Torent %1 je pokrenut sa prethodnom verzijom KTorrent-a. Da bi bili sigurnida "
+"će raditi i sa ovom verzijom KTorrent-a, moraćemo da ga preselimo. Bićete "
+"upitani za lokaciju snimanja torenta. Ako pritisnete Otkaži izabraće se vaš "
+"početni direktorijum."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Izaberite fasciklu u koju se snima"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Nije pokrenut"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Sejem"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Preuzimam"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Zastoj"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Zaustavljen"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Greška: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Odvajam prostor na disku"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "U redu"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Proveravam podatke"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Zaustavljen. Nema slobodnog prostora."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Nemate dovoljno prostora da bi ste preuzeli ovaj torent. Želite li zaista da "
+"nastavite?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Nedovoljno prostora za %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torent „%1“ je dostigao maksimum odnosa deljenja. Da zanemarim ograničenje i "
+"započnem sejanje?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Maksimum ograničenja odnosa deljenja je dostignut."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Greška pri zaustavljanju torenta %1 : %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Greška pri pokretanju torenta %1 : %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Objavljujem"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Nepoznat program"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"%n vršnjak\n"
+"%n vršnjaka\n"
+"%n vršnjaka"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Ne mogu da napravim %1 : %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Ne mogu da upišem prvo parče u DND fajl : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Ne mogu da upišem poslednje parče u DND fajl : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Ne mogu da otvorim %1 radi upisa : fajl-sistem samo za čitanje"
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Ne mogu da raširim fajl : %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Ne mogu da raširim fajl %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Ne mogu da raširim fajl %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Greška : Čitanje je prošlo završetak fajla %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Greška pri čitanju iz %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Greška pri upisu u %1 : %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Greška pri upisu u %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Ne mogu da odvojim prostor na disku : %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Ne mogu da se vežem na udp port %1 ili 10 sledećih portova."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Neispravan odgovor sa pratioca"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Neispravni podaci sa pratioca"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Neispravan URL pratioca"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Ne mogu da otvorim fajl %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Ne mogu da napravim indeksni fajl: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Ne mogu da otvorim fajl : %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Koristi UPnP da automatski prosledi portove na vašem ruteru"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Ne mogu da nađem uslugu prosleđivanja portova u opisu uređaja!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP uređaji"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Automatski traži torente u direktorijumima i učitava ih."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Pregledaj fasciklu"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Pregledaj fasciklu"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Opcije pregleda fascikle"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "učitan"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Pregled fascikle - Fascikla %1: Neispravan URL ili fascikla ne postoji. "
+"Izaberite ispravan direktorijum."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Veb interfejs"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Opcije veb interfejsa"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+#, fuzzy
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "Program za PHP nije na podrazumevanoj putanji, unesite putanju ručno"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Unesite novu lozinku za veb interfejs."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 postoji i izvršan je"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "%1 ne postoji"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+#, fuzzy
+msgid "%1 is not executable"
+msgstr "%1 nije izvršan"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 je direktorijum"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+#, fuzzy
+msgid "%1 is not php executable path"
+msgstr "%1 nije putanja do programa za php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Veb interfejs"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Omogućava da kontrolišete ktorrent kroz veb pregledač"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Preuzmi prvo"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Preuzmi normalno"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Preuzmi poslednje"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Izbriši fajl(ove)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Dostupno"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Nastupajuće"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Izgubićete sve podatke iz ovog fajla. Sigurni ste da želite ovo da uradite?\n"
+"Izgubićete sve podatke iz ovih fajlova. Sigurni ste da želite ovo da uradite?\n"
+"Izgubićete sve podatke iz ovih fajlova. Sigurni ste da želite ovo da uradite?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Bez ograničenja"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Info prozor"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Prikazuje dodatne informacije o preuzimanju. Koliko parčića je preuzeto, koliko "
+"ima sejača i pijavica ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Ne mogu da dodam pratioca u lični torent."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Ne mogu da uklonim podrazumevanog pratioca."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Ne možete dodati pratioce u lični torent"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Zemlja"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Program"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Zagušeno"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Kvrgavo"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Dostupnost"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Ocena"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Veza slanja"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Zahtevi"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Izbaci vršnjaka"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Blokiraj vršnjaka"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Dostupni parčići"
+"<br><img src=\"unavailable_color\">&nbsp; - Nedostupni parčići"
+"<br><img src=\"excluded_color\">&nbsp; - Izuzeti parčići"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Opcije Info prozora"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Preuzeti parčići"
+"<br><img src=\"unavailable_color\">&nbsp; - Parčići za preuzimanje"
+"<br><img src=\"excluded_color\">&nbsp; - Izuzeti parčići"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Pretvori"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Učitavam txt fajl..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Molim sačekajte..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Fajl pretvoren."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Ne mogu da učitam filter:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Loš fajl filtera. Možda je oštećen ili ima loš format."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtrira neželjene vršnjake na osnovu njihove IP adrese"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "Filter IP-a"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Stanje: Učitan i radi."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Stanje: Nije učitan."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Stanje: <font color=\"#ff0000\">Filter nije nađen.</font> "
+"Preuzmite i pretvorite fajl filtera."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Izabrani fajl već postoji. Želite li da ga ponovo preuzmete?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Fajl postoji"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"Fajl filtera (level1.dat) već postoji. Želite li da ga ponovo pretvorite?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Filter IP blokiranja"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Opcije filtera IP blokiranja"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistika"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Opcije statistike"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Pijavica povezano"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Pijavica u rojevima"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Sejača povezano"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Sejača u rojevima"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Prosečno povezanih pijavica po torentu"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Prosečno povezanih sejača po torentu"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Prosečno povezanih pijavica po pokrenutom torentu"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Prosečno povezanih sejača po pokrenutom torentu"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Čvorovi"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Poslovi"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Prikazuje statistiku prenosa"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Statistika brzine"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Statistika veze"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Trenutno"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Prosečno"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Ograničenje"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Prosečno od pijavice"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Prosečno ka pijavici"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Prosečno od sejača"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Od pijavica"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Od sejača"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Legenda"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torent fajlovi"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Svi fajlovi"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Ne mogu da proverim podatke : %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Ne mogu da učitam torent : %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Uvozi delimično ili potpuno preuzete torente iz drugih programa"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Uvezi postojeće preuzimanje"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL ili dovod"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Automatski pretražuje RSS dovode radi torenta koji se poklapaju sa zadatim "
+"izrazom i učitava ih."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS dovodi"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Naslov"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Opis"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Veza"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Sezona"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Epizoda"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Vreme"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Raspoređivač"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Opcije priključka raspoređivača"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "PON"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "UTO"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "SRE"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "ČET"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "PET"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "SUB"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "NED"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Raspored sačuvan."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Fajl nije nađen."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Raspored učitan."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Priključak za raspoređivanje protoka"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Otvori Raspoređivač protoka"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Raspoređivač protoka je isključen. Idite na Podešavanja->"
+"Raspoređivač da ga uključite."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Pregled dnevnika"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Pregled dnevnika"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Prikazuje izlaz dnevnika KTorenta"
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Upotrebite vaš veb pregledač da nađete %1 (velika slova) na motoru pretrage "
+"koji želite da dodate. "
+"<br>Onda kopirajte URL iz trake adrese nakon što se pretraga završi i prenesite "
+"ga ovde."
+"<br>"
+"<br>Na primer, traženje %2 na Google-u će vratiti "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. Ako dodate taj URL "
+"ovde, KTorent će moći da pretražuje uz pomoć Google-a."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Upotrebite vaš veb pregledač da nađete %1 (velika slova) na motoru pretrage "
+"koji želite da dodate. Ispod upišite URL koji tako dobijete."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Morate uneti ime i URL motora pretraživanja"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Motor pretraživanja sa tim imenom već postoji. Izaberite drugo ime."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Loš URL. Treba da tražite FOOBAR pomoću internet pregledača i kopirate i "
+"prenesete ovde tačan URL."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Pretraga"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Opcije motora traženja"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Tražim %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Torent fajlovi"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Traženje završeno"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Motor: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Traži torente na nekoliko popularnih pretraživača torenta"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Želite li da preuzmete ili sačuvate torent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Preuzmi torent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Preuzmi"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Nalazi vršnjake koji koriste ktorrent na lokalnoj mreži sa kojima može da deli "
+"torente"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "ETA algoritam:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Ne mogu da učitam parče %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Pratioci"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "Vrsta servisnog polja IP paketa"
+
+#~ msgid "Alt+N"
+#~ msgstr "Alt+P"
+
+#~ msgid "Alt+S"
+#~ msgstr "Alt+S"
diff --git a/translations/sv/Makefile.am b/translations/sv/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/sv/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/sv/messages/Makefile.am b/translations/sv/messages/Makefile.am
new file mode 100644
index 0000000..300ce12
--- /dev/null
+++ b/translations/sv/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = sv
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/sv/messages/ktorrent.po b/translations/sv/messages/ktorrent.po
new file mode 100644
index 0000000..7860808
--- /dev/null
+++ b/translations/sv/messages/ktorrent.po
@@ -0,0 +1,4901 @@
+# translation of ktorrent.po to Swedish
+#
+# Stefan Asserhäll <stefan.asserhall@comhem.se>, 2005, 2006, 2007, 2008.
+# Stefan Asserhall <stefan.asserhall@comhem.se>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-02-25 22:20+0100\n"
+"Last-Translator: Stefan Asserhäll <stefan.asserhall@comhem.se>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Inga inkommande anslutningar (möjligen stoppade av brandvägg)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Information"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Data överförd under nuvarande session"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Nuvarande hastighet för alla kombinerade dataflöden"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Grupper"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Starta"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Stoppa"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Starta alla"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Stoppa alla"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Klistra in dataflödets webbadress..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Öppna köhantering..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Lägg till i kö/Ta bort från kö"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP-filter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Kontrollera dataintegritet"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Ställ in maximal uppladdningshastighet"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Ställ in maximal nerladdningshastighet"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Dataflödesfiler"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Alla filer"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Öppna plats"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Hastighet ner: %1 upp: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Överfört ner: %1 upp: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 noder, %2 aktiviteter"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: av"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Alla dataflöden"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Sök:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "Skiftlägeskänslig"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Flytta till vänster kant"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Flytta till höger kant"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Flytta till nederkant"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Tilldela snabbtangent..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Rensa snabbtangent"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Ändra knappnummer"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Nytt snabbtangentnummer:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Du måste skriva in IP-adress på formen 'XXX.XXX.XXX.XXX'. Du kan också använda "
+"jokertecken för intervall, som '127.0.0.*'."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Välj en fil"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Välj ett filnamn att spara till"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Felaktig webbadress."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Nerladdningar"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Uppladdningar"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Angiven port (%1) är inte tillgänglig eller används av ett annat program. "
+"Ktorrent använder nu porten %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"Ktorrent kan inte acceptera anslutningar eftersom portarna %1 till %2 redan "
+"används av ett annat program."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Kan inte skapa flöde: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Flera datafiler i dataflödet \"%1\" saknas. Vill du skapa om dem, eller vill du "
+"låta bli att ladda ner dem?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Skapa om"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Ladda inte ner"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Kan inte återskapa saknade filer: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Datafiler saknas"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Kan inte välja bort saknade filer: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Filen där data från dataflödet \"%1\" sparas saknas. Vill du skapa om den?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Skapa inte om"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Kan inte återskapa datafil: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Datafil saknas"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Kontrollera dataintegritet"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "oändlig"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Fel vid genomsökning av data: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Genomsöker data från <b>%1</b>:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Ett BitTorrent-program för KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Felsökningsläge"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr "Spara dataflödet med angiven webbadress tyst"
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Dokument att öppna"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "Ktorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS-insticksprogram"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Insticksprogram för webbgränssnitt"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Statistikinsticksprogram"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Programikon och några andra"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Nerladdningsikon"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "Programikon för 1.0"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Verktygstips i ChunkBar och sortering av IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Lokalisering av länder för insticksprogrammet informationskomponent (Produkten "
+"innehåller GeoLite-data skapad av MaxMind, tillgänglig från "
+"http://www.maxmind.com/)."
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Nationsflaggor"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Filprioritering"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp användes som ett exempel för vår egen implementering av UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Programfix för globalt maximalt delningsförhållande"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Förbättringar av Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Grafiskt webbgränssnitt Coldmilk"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "IDEA-kod från KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Förbättring av konverteringshastighet i IP-filterinsticksprogrammet"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Upptäckte två säkerhetsrisker (båda är korrigerade)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Programfix för att ladda tyst med en sparad plats"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Rättningar av webbgränssnittets PHP-kod"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS-specifik reservation av disk"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Programfix för att inte visa mycket långsamma hastigheter"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+"Programfix för att visa status om eventuellt stopp på grund av brandvägg"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Flera programfixar"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Programfix för att dölja menyraden"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+"Programfix för att ändra filprioriteter i det grafiska webbgränssnittet"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Flera programfixar av det grafiska webbgränssnittet"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Programfix för filterrad"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "Programfix för uppdatering av icke trådbaserad filvy"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "Optimering av generering av SHA1-checksumma"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "Programfix för att rätta beräkning av ledigt diskutrymme på FreeBSD"
+
+#: apps/ktorrent/main.cpp:167
+msgid "Patch to load torrents silently from the command line"
+msgstr "Programfix för att ladda dataflöden tyst från kommandoraden"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Du måste välja en fil eller katalog."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr ""
+"Du har inte lagt till någon spårare. Är du säker på att du vill skapa "
+"dataflödet?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Du måste lägga till minst en nod."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Dataflödesfiler (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Välj fil där dataflödet ska sparas"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Skapar %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Egna grupper"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Ny grupp"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Redigera namn"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Ta bort grupp"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Öppna flik"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Ange gruppnamnet."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Gruppen %1 finns redan."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Ange det nya gruppnamnet."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktiva uppladdningar"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Köade uppladdningar"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Köade nerladdningar"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Användarens nerladdningar"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Användarens uppladdningar"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Inaktiva dataflöden"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Inaktiva nerladdningar"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Inaktiva uppladdningar"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktiva dataflöden"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktiva nerladdningar"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Ta bort dataflöde"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Ta bort dataflöde och data"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Lägg till deltagare"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Ytterligare deltagarkällor"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Deltagarkällor för datafllöde:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Utbyte mellan deltagare"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Manuellt tillkännagivande"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Förhandsgranskning"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Öppna katalog"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Datakatalog"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Tillfällig katalog"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Ange nerladdningsplats"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Ta bort från grupp"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Lägg till i grupp"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Hastighetsgränser"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Dataflödet finns inte. Rapportera felet till Ktorrents utvecklare."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Möjlig deltagare tillagd."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Felaktig IP-adress."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Inställningar"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Nerladdningsalternativ"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT-porten måste skilja sig från UDP-spårningsporten."
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Allmänt"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Allmänna alternativ"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Kan inte slå upp %1: %2\n"
+"Tillhandahåll en giltig IP-adress eller ett giltigt värddatornamn."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Avancerat"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Avancerade alternativ"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Synliga kolumner"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Status"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Nerladdade"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Storlek"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Uppladdade"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Nerladdningshastighet"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Uppladdningshastighet"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Tid kvar"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Med hela flödet"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "Med delar av flödet"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% klar"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Delningsförhållande"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Tid nerladdade"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Tid erbjudna"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Alla dataflöden %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Kan inte starta mer än 1 nerladdning, \n"
+"Kan inte starta mer än %n nerladdningar, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"och 1 flöde. \n"
+"och %n flöden. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "Gå till inställningar -> Anpassa Ktorrent, om du vill ändra gränserna."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Nerladdningen av dataflödet %1 är inte klar. Vill du också ta bort ofullständig "
+"data?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Ta bort nerladdning"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Ta bort data"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Behåll data"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"Du kommer att förlora all nerladdad data. Är du säker på att du vill göra det?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Du kontrollerar redan data från dataflödet %1."
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Välj nerladdningsplats för %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Du har avmarkerat följande befintliga filer. All data i filerna kommer att gå "
+"förlorad. Är du säker på att du vill göra detta?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Ja, ta bort filerna"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Nej, behåll filerna"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " för lite."
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Användare"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Köhantering"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Nej (privat dataflöde)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Hastighet:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Nerladdning: <font color='#1c9a1c'>%1</font></td>"
+"<td>Uppladdning: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Överföring:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Nerladdning: <font color='#1c9a1c'>%3</font></td>"
+"<td>Uppladdning: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "Nerladdning av <b>%1</b> är klar.<br>Medelhastighet: %2 ner %3 up."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Nerladdning klar"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> har nått sitt maximala delningsförhållande %2 och har stoppats."
+"<br>Uppladdade %3 med medelhastigheten %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Klar med att erbjuda flödet"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> har nått sin maximala tid för att erbjudas, %2 timmar, och har "
+"stoppats."
+"<br>Uppladdade %3 med medelhastigheten %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> har stoppats med följande fel:<br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Skadad data har hittats i dataflödet <b>%1</b>."
+"<br>Det är en god idé att utföra en kontroll av dataflödets integritet."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> har nått sitt maximala delningsförhållande %2 och kan inte läggas "
+"till i kön. Ta bort begränsningen för hand om du vill fortsätta erbjuda flödet."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> har nått sitt maximala sin maximala tid för att erbjudas, %2 timmar, "
+"och kan inte läggas till i kön. Ta bort begränsningen för hand om du vill "
+"fortsätta erbjuda flödet."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Flödet kan inte läggas till i kön."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Kan inte starta <b>%1</b>: <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan inte starta mer än 1 nerladdning."
+"<br>\n"
+"Kan inte starta mer än %n nerladdningar."
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Kan inte ladda ner mer än 1 nerladdning."
+"<br>\n"
+"Kan inte ladda ner mer än %n nerladdningar."
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Flödet kan inte startas"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Det finns inte tillräckligt med tillgängligt diskutrymme."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"Utrymmet på disken håller på att ta slut.<br /><b>%1</b> laddas ner till '%2'."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Dataflödet har stoppats.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Utrymmet på enheten håller på att ta slut"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Hastighetsgräns i Kibyte/s"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Obegränsad"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Hastighetsgräns för <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Ett KDE Kpart-program"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "Ktupnptest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Kan inte öppna indexfil %1: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Stefan Asserhäll"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "stefan.asserhall@comhem.se"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Markera filerna du vill ladda ner"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Ladda ner till:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grupp:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Styrd av an&vändare"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Starta dataflöde"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Ladda ner"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Markera &alla"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "Markera i&ngen"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Invertera markering"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Diskutrymme"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Nödvändigt diskutrymme:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Ledigt diskutrymme:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Efter nerladdning:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Kryptering"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Använd protokollkryptering"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Protokollkryptering används för att förhindra att internetleverantörer gör "
+"dataflödesanslutningar långsammare."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Tillåt okrypterade anslutningar"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Om avmarkerad, kan du bara ansluta till klienter som stöder kryptering."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentraliserat utbytesprotokoll mellan deltagare. Se handboken för "
+"ytterligare information."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "An&vänd DHT för att hämta ytterligare deltagare"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "UDP-port för DHT-kommunikation:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Egen IP-adress"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Skicka spåraren en egen IP-adress eller ett eget värddator&namn"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Egen IP-adress eller eget värddatornamn:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Ikon i systembrickan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Visa ikon i s&ystembrickan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Visa &hastighetsrad i systembrickan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Visa meddelanden i systembrickan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Uppladdningsbandbredd (i Kibyte/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Nerladdningsbandbredd (i Kibyte/s):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Kataloger"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Katalog för att lagra tillfälliga filer:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Flytta klara nerladdningar till:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "Spara &automatiskt nerladdningar i:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Kopiera .torrent-filer till:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Nerladdningsverktygsrad"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Ställ in dataflödets hastighetsgränser"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Maximal uppladdningshastighet:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Maximal nerladdningshastighet:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KiB/s (0 betyder obegränsad)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Lägg till möjlig deltagare"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Deltagarens IP-adress:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Ange deltagarens IP-adress och port."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Ktorrents svartlistning"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Observera: Svartlistning gäller bara nuvarande session. Använd spara och öppna "
+"för att spara dina poster, eller använda IP-filterinsticksprogram "
+"(PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Förbjudna deltagare"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Deltagarens IP-adress"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Lägg till deltagare:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Lägger till en svartlistad deltagare"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Tar bort deltagare från svartlistning"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Re&nsa"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Rensar listan"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Spara s&om..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+"Sparar svartlistan för att använda den med Ktorrents IP-filterinsticksprogram"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Maximalt antal nerladdningar:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Maximalt antal erbjudna flöden:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Starta nerladdningar vid dåligt diskutrymme:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Minimalt diskutrymme:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Starta inte"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Fråga alltid"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Tvinga att starta"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MiB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 betyder obegränsat)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Maximal nerladdningshastighet:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Global anslutningsbegränsning:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Maximal erbjudningstid:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Maximalt antal anslutningar per nerladdning:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Antal uppladdningsnischer:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP-spårningsport:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Maximalt delningsförhållande:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Maximal uppladdningshastighet:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KiB/sek (0 betyder obegränsad)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Timmar (0 betyder obegränsat)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Fortsätt erbjuda flödet efter nerladdning är klar"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Observera"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Ovanstående portar måste vidarebefordras om du är bakom en router. "
+"UPnP-insticksprogrammet kan göra det åt dig."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT-ködialogruta"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Status:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Spårare:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Delningsförhållande:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Byte kvar:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Dataflöde"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Styrd av"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "Uppladdnin&gar"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Uppladdat:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Flytta &upp"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Flytta &ner"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Flytta längst upp"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Flytta &längst ner"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Styrd av &köhantering"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Styr av an&vändare"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Klistra in webbadress"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "Webbadress:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "O&k"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Avbryt"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Skapa dataflöde"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Filen eller katalogen du vill skapa ett dataflöde för:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Du måste lägga till minst en spårare eller nod."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Filalternativ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Storlek på varje del:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KiB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "&Börja erbjuda dataflödet"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "De&centraliserat (bara DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Privat dataflöde (DHT tillåts inte)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Kommentarer:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "S&kapa"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "&Avbryt"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Spårare"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT-noder"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Nod:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP-adress eller värddatornamn"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Observera: Vissa väl fungerande DHT-noder är redan infogade. Du bör troligtvis "
+"också infoga din egen IP-adress och port om du planerar att erbjuda dataflödet."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Avancerade inställningar"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr "Algoritm för uppskattning av återstående tid:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Algoritm enligt Ktorrent:</b> Standardalgoritm som använder en kombination "
+"av andra algoritmer baserat på våra tester."
+"<br>\n"
+"<b>Algoritm med nuvarande hastighet:</b> Enklaste algoritmen - kvarvarande "
+"byte/nuvarande hastighet"
+"<br>\n"
+"<b>Algoritm med allmän medelhastighet:</b> kvarvarande byte/medelhastighet"
+"<br>\n"
+"<b>Algoritm med fönster av storlek X:</b> Beräknar kvarvarande tid från X "
+"samplingar av hastigheten"
+"<br>\n"
+"<b>Algoritm med rörligt medelvärde:</b> Hastighet enligt rörligt medelvärde "
+"beräknat från X samplingar"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Nuvarande hastighet"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Total medelhastighet"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Fönster av storleken X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Rörligt medelvärde"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(får effekt efter omstart)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Ina&ktivera reservation av diskutrymme"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "Reservera allt dis&kutrymme i förväg (undviker fragmentering)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Grundläggande (långsam)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Specifik för filsystem"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Prestanda"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Minnesanvändning:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Låg"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Medium"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Hög"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Uppdateringsintervall för grafiskt gränssnitt:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Snabb processor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Långsam processor"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Datakontroll"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Vid uppladdning, ko&ntrollera inte om delar större än"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Gör en kontroll av data&integritet efter"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "skadade delar"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Nätverk"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Maximalt antal anslutningar:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP för IP-paket:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Använd inte KDE:s pro&xyinställningar för HTTP-spårningsanslutningar"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP-spårningsproxy:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Genomsöker data"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Genomsöker data från dataflödet:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Antal hittade delar:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Antal misslyckade eller inte nerladdade delar:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textetikett2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textetikett3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Maximalt antal nerladdningar (0 = obegränsat)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Maximalt antal erbjudna flöden (0 = obegränsat)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Starta nerladdningar vid dåligt diskutrymme?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Maximalt antal anslutningar per dataflöde (0 = obegränsat)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Maximalt antal anslutningar för alla dataflöden (0 = obegränsat) "
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Maximal uppladdningshastighet i KiB/sek (0 = obegränsad)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Maximal nerladdningshastighet i KiB/sek (0 = obegränsad)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Maximalt delningsförhållande (0 = ingen begränsning)."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Maximal erbjudningstid (0 = ingen begränsning)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Visa en ikon i systembrickan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Visa hastighetsrad i systembrickan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Nerladdningsbandbredd (i Kibyte/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Uppladdningsbandbredd (i Kibyte/s):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Visa meddelanden när ett dataflöde är klart."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Fortsätt erbjuda flödet efter nerladdning är klar"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Katalog för att lagra tillfälliga filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Om nerladdningar automatiskt ska sparas i angiven katalog"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Katalog för att lagra nerladdade filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Om färdiga nerladdningar automatiskt ska flyttas till färdigkatalogen"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Katalog att flytta färdiga nerladdade filer till"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ""
+"Om .torrent-filer automatiskt ska kopieras till katalogen för kopierade "
+".torrent-filer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Katalog att kopiera .torrent-filer till"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Om en egen IP-adress ska användas att skicka till spåraren"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Katalog som användes för spara senast"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "IP-adress att skicka till spåraren"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Minnesanvändning"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Uppdateringsintervall för grafiskt gränssnitt"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Stöd för DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT-port"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Antal uppladdningsnischer"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Kolumner visade i Ktorrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Algoritm för beräknad tid"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"När det inte finns något utrymme kvar för att göra färdigt nerladdningen och "
+"fritt diskutrymme är mindre än minimalt diskutrymme, stoppas dataflödet."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Insticksprogramhantering"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Ladda"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "Ladda &ur"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Ladda &alla"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Ladda &ur alla"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Förvald UPnP-enhet att använda"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Detekterade enheter:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Enhet"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Vidarebefordrade portar"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "Anslutning till fjärrnätverk"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Vidare&befordra portar"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Ångra vidarebefordring av portar"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Sök igen"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Aktivera sökning av katalog 1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Aktivera sökning av katalog 2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Aktivera sökning av katalog 3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Sökväg till katalog 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Sökväg till katalog 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Sökväg till katalog 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Om dataflödet ska öppnas tyst eller inte."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Borttagningsåtgärd markerad."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Förflyttningsåtgärd är markerad."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Katalogsökinställningar"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Sök katalog &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Sök katalog &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Sök katalog &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Gå till \"l&addad\" katalog efter laddning"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Flytta dataflöde till \"laddad\" katalog efter den laddats"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Öppna dataflöden t&yst"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Visa inte dialogrutan 'Markera filer att ladda ner'"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Ta bort efter laddnin&g"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Tar bort dataflödet efter laddning"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Kataloger att söka i"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Katalog 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Katalog 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Katalog 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Sökinställningar"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Webbserver"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Vidarebefordra port"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Sessionstid att vara aktiv (i sekunder)"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Välj gränssnitt:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Användarnamn:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Ändra lösenord..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Sökväg till körbar fil för PHP:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Portnummer"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "vidarebefordra port"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Sessionstid att vara aktiv"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Gränssnittets skal"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "Sökväg till körbar fil för PHP"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "användarnamn"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "lösenord"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Delar"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Totalt:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Nuvarande nerladdningar:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Nerladdade:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Undantagna:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Kvar:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Storlek:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Del"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Förlopp"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Deltagare"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Tilldelade deltagare"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Med hela flödet:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "Med delar av flödet:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Medelnerladdningshastighet:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Medeluppladdningshastighet:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Nästa uppdatering:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Spårarens status:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Delar av flödet som har laddats ner:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Delar av flödet som är tillgängliga:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Delning"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Uppladdningen stoppas när delningsförhållandet når det här värdet. Noll betyder "
+"ingen begränsning."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Uppladdningen stoppas när den har laddas upp så här många timmar."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Timmar"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Förhållandegräns:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Gränsen fungerar bara när flödet erbjuds"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Tids&gräns:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Uppdatera spårare"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Minimalt uppdateringsintervall - 60 sekunder"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Lägg till spå&rare"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Ta bort spårare"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "Ändr&a spårare"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Återställ förval"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Visa visningsflik för deltagare i huvudfönstret"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Visa visningsfliken för delnerladdning i huvudfönstret"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Visa visningsflik för spårare i huvudfönstret"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Visa lista med deltagare"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Visa lista med delar som &för närvarande laddas ner"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Visa lista med spårare"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP-blockeringsinställningar"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Välj PeerGuardian-filterfil "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Använd PeerGuardian-filter?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP-filterfil:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Ladda &ner och konvertera"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Ladda ner PeerGuardian-filter från bluetack.co.uk eller blocklist.org.\n"
+"Observera: ZIP-filer från bluetack.co.uk stöds."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Filterwebbadress av nivå 1"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Använd nivå 1 filter?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Konverterar..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Klicka på knappen 'Konvertera' för att börja konvertera antip2p-filen. "
+"Observera: processen kan ta en stund till och med på snabba datorer, och under "
+"tiden kommer du inte att kunna använda Ktorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Uppdatera"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Uppdatera diagram var"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Uppdateringar av grafiskt gränssnitt"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Samla in data var"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "millisekund"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Maximal"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Maximal hastighetsskala:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Exakt"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Se 'Vad är det här' för ytterligare hjälp"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Ställ in maximalt värde för OY-skalan som:\n"
+"- Topp: Totalt uppnådd maximal hastighet\n"
+"- Exakt: Maximal uppnådd hastighet som syns i diagrammet"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Deltagarens hastighet"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Deltagarens hastighet:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "uppdatera var"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "uppdateringar av diagramdata"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Insamling av data för många anslutna deltagare kan använda mycket "
+"processorkraft."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Deltagarens anslutningar"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Stora värden kan dölja diagram för anslutna deltagare"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Visa användare med hela flödet i svärmar"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Visa användare med delar av flödet i svärmar"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Antal mätningar"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Uppladdning"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Anslutningar"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Deltagare"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Växla diagram med deltagares hastighet"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Intervall mellan hämtning av data om deltagares hastighet"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Växla uppritning i svärmar för användare med delar av flödet"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Växla uppritning i svärmar för användare med hela flödet"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Antal nerladdningsmätningar"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Antal mätningar av deltagares hastighet"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Antal uppladdningsmätningar"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Antal anslutningsmätningar"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Antal DHT-mätningar"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Maximalläge för OY-axel"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Importera befintlig nerladdning"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Dataflöde:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Data:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Ange dataflöde och data som redan laddats ner för det dataflödet."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Importera"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "förval"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS-kanaler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Kanaler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "&Ta bort"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Ny"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&Webbadress"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Artiklar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "&Uppdatera automatiskt"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "I&gnorera TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Uppdatera"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Titel"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Behåll artiklar (dagar)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Aktiv"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filter"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Filter för att acceptera"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Filter för att förkasta"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Reguljära uttryck"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Behandla som &serier"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Behandla"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Kriterier för serie"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Träffar utan episod"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Sista episod"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Sista säsong"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Första säsong"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Första episod"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Testte&xt"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Te&st"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtrera träffar"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Schemaläggning av bandbredd"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Vänsterklickskategori"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kate&gori 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "Stäng &av"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategori &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategori &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Högerklickskategori"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategori &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategori 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategorier"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1:a kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3:e kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "ladda ner:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "ladda upp:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KiB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2:a kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 betyder obegränsat"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Spara i fil"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Ladda från fil"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Återställ schema"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "O&k"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Inställningssida för insticksprogram för schemaläggning"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Använd schemaläggning av &bandbredd?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Schemaläggning av bandbredd"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Använd färger istället för p&unktavbildningar?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Rekommenderas för långsammare system)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Redigera s&chema"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Aktivera schemaläggning av bandbredd?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Använd färger istället för punktavbildningar?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Använd formaterad text i logg"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Meddelandeflagga för allmän information"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Meddelandeflagga för anslutningar"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Meddelandeflagga för DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Meddelandeflagga för spårningsinformation"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Meddelandeflagga för information om disk in- och utmatning"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Meddelandeflagga i insticksprogram för IP-filtrering"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Meddelandeflagga i sökinsticksprogram"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Meddelandeflagga i insticksprogram för delfilimport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Meddelandeflagga i insticksprogram för informationskomponent"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Meddelandeflagga i UPnP-insticksprogram"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Meddelandeflagga i insticksprogram för katalogsökning"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Meddelandeflagga i insticksprogram för schemaläggning"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Meddelandeflagga i RSS-insticksprogram"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Meddelandeflagga i insticksprogram för webbgränssnitt"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Loggvisningsalternativ"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Insticksprogram"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Alla"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Felsökning"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Anmärkning"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Viktigt"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Inget"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP-filter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Sök:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Sök i katalog:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Schemaläggning:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Delfilimport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Informationskomponent:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS-insticksprogram:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Insticksprogram för webbgränssnitt:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "System"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Allmänt:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Anslutningar:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Disk in- och utmatning:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Använd formaterad te&xt i log"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Extern webbläsare"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Öppna sökresultat i extern webbläsare"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Använd standardwebbläsare"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Sökväg till egen webbläsare:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Söktjänster"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Söktjänstens namn:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Lägg till"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Tjänster"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "Webbadress"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Ta bort alla"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Lägg till &förval"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Uppdatera från Internet"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Sök"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Söktjänst:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Nuvarande söktjänst"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Använd egen webbläsare"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Sökväg till körbar fil för egen webbläsare"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GiB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MiB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KiB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KiB/s"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"1 dygn \n"
+"%n dygn "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Ja, först"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Ja, sist"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Kan inte öppna loggfilen %1: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Kan inte skriva till %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Kan inte läsa från %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Kan inte skapa katalogen %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Kan inte skapa symbolisk länk från %1 till %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Kan inte flytta %1 till %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Kan inte kopiera %1 till %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Kan inte ta bort %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Kan inte skapa %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Kan inte beräkna filstorlek för %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Kan inte beräkna filstorlek: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Kan inte öppna %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Kan inte expandera fil: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Kan inte expandera fil"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Kan inte söka i indexfil: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Kan inte skriva förbi slutet på mmap-buffer."
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Status: <b>%2</b><br>Upphovsman: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Laddad"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Inte laddad"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Insticksprogramalternativ"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Kan inte öppna filen %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Katalogen %1 finns inte"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Felaktig symbol: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Avkodningsfel"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Oväntat slut på indata"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Kan inte konvertera %1 till ett heltal"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Dataflödet är inte färdigt."
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Skadat dataflöde"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Dataflödet har inget meddelande- eller nodfält"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "Kan inte öppna dataflödesfilen %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Tolkningsfel"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Ett fel uppstod när dataflödet skulle laddas. Dataflödet är troligen fördärvat "
+"eller är inte en dataflödesfil.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Ett fel uppstod när dataflödet skulle laddas. Dataflödet är troligen fördärvat "
+"eller är inte en dataflödesfil."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Kan inte skapa %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Du laddar redan ner dataflödet %1, listan med spårare för båda dataflöden har "
+"slagits ihop."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Du laddar redan ner dataflödet %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Kan inte konvertera %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Dataflödet %1 startades med en tidigare version av Ktorrent. För att försäkra "
+"dig om att dataflödet fortfarande fungerar med den här versionen av Ktorrent, "
+"konverterar vi dataflödet. Du blir tillfrågad om en plats att spara dataflödet. "
+"Om du trycker på Avbryt, väljes din hemkatalog."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Välj katalog att spara till"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Inte startad"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Erbjuder flödet"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Laddar ner"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Avstannad"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Stoppad"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Fel: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Reserverar diskutrymme"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Köad"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Kontrollerar data"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Stoppad. Inget utrymme kvar på enheten."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Du har inte tillräckligt med diskutrymme för att ladda ner dataflödet. Är du "
+"säker på att du vill fortsätta?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Otillräckligt diskutrymme för %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Dataflödet \"%1\" har nått sitt maximala delningsförhållande. Ignorera gränsen "
+"och erbjud flödet ändå?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Maximalt delningsförhållande uppnått."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Fel när dataflödet %1 skulle stoppas: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Fel när dataflödet %1 skulle startas: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Tillkännagör"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Okänd klient"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+" 1 deltagare\n"
+"%n deltagare"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Kan inte skapa filen %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Misslyckades skriva första delen till DND-filen: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Misslyckades skriva sista delen till DND-filen: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Kan inte öppna %1 för skrivning: skrivskyddat filsystem"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Kan inte expandera filen %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Kan inte expandera filen %1: ofullständig skrivning"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Kan inte expandera fil %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Fel: Läsning förbi filslut för filen %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Fel vid läsning från %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Fel vid skrivning till %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Fel vid skrivning till %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Kan inte reservera diskutrymme i förväg: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Kan inte binda till UDP-port %1 eller de 10 följande portarna."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Ogiltigt svar från spårare"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Ogiltig data från spårare"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Ogiltig webbadress för spårare"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Kan inte öppna filen %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Kan inte skapa indexfil: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Kan inte öppna filen %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "Använder UPnP för att automatiskt skicka vidare portar på routern"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr ""
+"Kan inte hitta vidarebefordringstjänst för port i enhetens beskrivning."
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP-enheter"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr ""
+"Söker automatiskt igenom katalogen efter dataflödesfiler och laddar dem."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Sök i katalog"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Sök i katalog"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Sökkatalogalternativ"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "laddade"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Katalogsökning: Katalogen %1: Felaktig webbadress eller katalogen finns inte. "
+"Välj en giltig katalog."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Webbgränssnitt"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Alternativ för webbgränssnitt"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Den körbara filen php finns inte i standardsökvägen. Skriv in sökvägen för "
+"hand."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Ange ett nytt lösenord för webbgränssnittet."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 finns och är körbar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 finns inte"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 är inte körbar"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 är en katalog"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 är inte en sökväg till den körbara filen php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Webbgränssnitt"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Tillåt användaren att styra Ktorrent via webbläsaren"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Ladda ner först"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Ladda ner normalt"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Ladda ner sist"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Ta bort fil(er)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Tillgänglig"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Vilande"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"All data i filen kommer att gå förlorad. Är du säker på att du vill göra "
+"detta?\n"
+"All data i filerna kommer att gå förlorad. Är du säker på att du vill göra "
+"detta?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Ingen begränsning"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Informationskomponent"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Visar ytterligare information om en nerladdning, som vilka delar som har "
+"laddats ner, antal användare med hela flödet och användare med delar av flödet "
+"..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Kan inte lägga till spårare för ett privat flöde."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Kan inte ta bort flödets standardspårare."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Du kan inte lägga till spårare för ett privat flöde"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP-adress"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Land"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Klient"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Strypt"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Avsnäst"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Tillgänglighet"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Poäng"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Uppladdningsnisch"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Begäran"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Sparka ut deltagare"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Bannlys deltagare"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Tillgängliga delar"
+"<br><img src=\"unavailable_color\">&nbsp; - Inte tillgängliga delar"
+"<br><img src=\"excluded_color\">&nbsp; - Undantagna delar"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Alternativ för informationskomponent"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Nerladdade delar"
+"<br><img src=\"unavailable_color\">&nbsp; - Delar att ladda ner"
+"<br><img src=\"excluded_color\">&nbsp; - Undantagna delar"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Konvertera"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Laddar txt-fil..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Vänta ..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Filen konverterad."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Kunde inte ladda filter:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Felaktig filterfil. Den kan vara förstörd, eller ha ett felaktigt format."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Filtrerar bort oönskade deltagare baserat på deras IP-adress"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP-filter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Status: Laddad och kör."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Status: Inte laddad."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Status: <font color=\"#ff0000\">Filterfilen hittades inte.</font> "
+"Ladda ner och konvertera filterfilen."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Markerad fil finns redan. Vill du ladda ner den igen?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Filen finns"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "Filterfilen (level1.dat) finns redan. Vill du konvertera den igen?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP-blockeringsfilter"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Alternativ för IP-blockeringsfilter"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Statistik"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Statistikinställningar"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "Anslutna användare med delar av flödet"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "Användare med delar av flödet i svärmar"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Anslutna användare med hela flödet"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Användare med hela flödet i svärmar"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Medeltal anslutna med delar av flödet per dataflöde"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Medeltal anslutna med hela flödet per dataflöde"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Medeltal anslutna med delar av flödet per pågående dataflöde"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Medeltal anslutna med hela flödet per pågående dataflöde"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Noder"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Aktiviteter"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Visar överföringsstatistik"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Hastighetsstatistik"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Anslutningsstatistik"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Nuvarande"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Medeltal"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Gräns"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Medeltal från användare med delar av flödet"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Medeltal till användare med delar av flödet"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Medeltal från användare med hela flödet"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Från användare med delar av flödet"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Från användare med hela flödet"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Beteckning"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Dataflödesfiler"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Alla filer"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Kan inte verifiera data: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Kan inte ladda dataflödesfilen: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Importerar delvis eller fullständigt nerladdade dataflödesfiler från andra "
+"klienter"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Importera befintlig nerladdning"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "Kanalens webbadress"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Söker automatiskt igenom RSS-kanaler efter reguljära uttryck som matchar "
+"dataflöden och laddar dem."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS-kanaler"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Misslyckades med att hitta och ladda ner ett giltigt dataflöde för %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Titel"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Beskrivning"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Länk"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Säsong"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Episod"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Tid"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Schemaläggning"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Alternativ för insticksprogram för schemaläggning"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "Mån"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "Tis"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "Ons"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "Tor"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "Fre"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "Lör"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "Sön"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Schema sparat."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Filen hittades inte."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Schema laddad."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Insticksprogram för schemaläggning av bandbredd"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Öppna schemaläggning av bandbredd"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Schemaläggning av bandbredd är inaktiverad. Använd Inställningar -> "
+"Schemaläggning för att aktivera den."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Loggvisning"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Loggvisning"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Visar loggutmatning från Ktorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Använd din webbläsare för att söka efter strängen %1 (stora bokstäver) med "
+"söktjänsten du vill lägga till. "
+"<br>Kopiera därefter webbadressen i adressraden när sökningen är färdig, och "
+"klistra in den här."
+"<br>"
+"<br>Att till exempel söka efter %1 på Google, ger resultatet "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br>Om du lägger till denna webbadress här, kan Ktorrent söka med användning av "
+"Google."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Använd webbläsaren för att söka efter strängen %1 (med stora bokstäver) med "
+"söktjänsten du vill lägga till. Använd resulterande webbadress nedan."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Du måste fylla i söktjänstens namn och webbadress"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "En söktjänst med samma namn finns redan. Använd ett annat namn."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Felaktig webbadress. Du måste söka efter FOOBAR med din webbläsare och "
+"kopiera/klistra in exakt webbadress här."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Sök"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Söktjänstalternativ"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Söker efter %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "Dataflödesfiler"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Sökning klar"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Söktjänst: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Sök efter dataflöden på flera populära söktjänster för dataflöden"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Vill du ladda ner eller spara dataflödet?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Ladda ner dataflöde"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Ladda ner"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Hittar deltagare som kör Ktorrent i det lokala nätverket, att dela dataflöden "
+"med"
diff --git a/translations/tr/Makefile.am b/translations/tr/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/tr/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/tr/messages/Makefile.am b/translations/tr/messages/Makefile.am
new file mode 100644
index 0000000..a9550cb
--- /dev/null
+++ b/translations/tr/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = tr
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/tr/messages/ktorrent.po b/translations/tr/messages/ktorrent.po
new file mode 100644
index 0000000..bb61410
--- /dev/null
+++ b/translations/tr/messages/ktorrent.po
@@ -0,0 +1,4900 @@
+# translation of ktorrent.po to Turkish
+# translation of ktorrent.po to
+#
+#
+# Barış Metin <baris@uludag.org.tr>, 2005.
+# Engin Çağatay <engincagatay@yahoo.com>, 2006.
+# Yavuz BAYRAK, 2007.
+# Serdar Soytetir <tulliana@gmail.com>, 2007.
+# serdar soytetir <tulliana@gmail.com>, 2007.
+# Akın Ömeroğlu <akin@omeroglu.net>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-09-09 14:47+0300\n"
+"Last-Translator: Serdar Soytetir <tulliana@gmail.com>\n"
+"Language-Team: Turkish <yerellestirme@kde.org.tr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Hiç gelen bağlantı yok (güvenlik duvarı kullanıyor olabilirsiniz)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Bilgi"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Şimdiki oturumda aktarılan veri"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Tüm torrentlerin şimdiki toplam hızı"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Torrent Grupları"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Başlat"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Durdur"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Hepsini Başlat"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Hepsini Durdur"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Torrent Adresi Yapıştır..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Sıralama Yöneticisini Aç..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Sıralamaya Al /Sıralamadan Çıkart"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP Filtresi"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Veri Doğruluğunu Denetle"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Gönderme hızı limitini ayarla"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "İndirme hızı limitini ayarla"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent Dosyaları"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Tüm Dosyalar"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Konum Aç"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "İndirme hızı: %1 / Gönderme hızı: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "İndirilen veri: %1 / Gönderilen veri: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: %1 düğüm, %2 görev"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: kapalı"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Tüm Torrentler"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Sola taşı"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Sağa taşı"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Aşağı taşı"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Kısayol Ata..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Kısayolu Temizle"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Düğme Numarasını Değiştir"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Yeni hızlandırma numarası:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"IP adresini 'XXX.XXX.XXX.XXX' biçiminde girmelisiniz. '127.0.0.*' biçiminde de "
+"girebilirsiniz."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Bir dosya seç"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Kaydetmek için bir dosya adı seçin"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Bozuk Adres."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "İndirilenler"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Gönderilenler"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Belirtilmiş portu (%1) kullanılamaz veya şu an başka uygulama tarafından "
+"kullanılmakta. KTorrent %2 portunu kullanıyor."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent bağlantı kabul edemiyor çünkü %1'den %2'ye kadar olan portlar başka "
+"bir uygulama tarafından kullanılmakta."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Torrent oluşturulamıyor: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Torrent için bazı veri dosyaları \"%1\" bulunamıyor. Bu dosyaları yeniden "
+"yapılandırmak ister misiniz? Yoksa bunlar yeniden indirilsin mi?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Yeniden Oluştur"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "İndirmekten Vazgeç"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Eksik dosyalar yeniden oluşturulamıyor: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Veri dosyaları eksik"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Eksik dosyalar seçimden çıkartılamıyor: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Bilgilerin kaydedildiği yerdeki \"%1\" torrent dosyası yok, tekrar oluşturmak "
+"ister misiniz?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "Yeniden Oluştur"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Veri dosyası yeniden oluşturulamıyor: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Veri dosyası yok"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Veri Doğruluğu Denetleniyor"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "sınırsız"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "% %1"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Veri taranamıyor: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Veriler taranıyor <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "KDE için bir BitTorrent programı"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Hata ayıklama kipi"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Açılacak belge"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS Eklentisi"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Web Arayüzü Eklentisi"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "İstatistik Eklentisi"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Uygulama simgesi ve diğerleri"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "İndirme simgesi"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 uygulama simgesi"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Parçacık Çubuğunun ipuçları ve IWFileTreeItem sıralaması"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Bilgilendirme parçacığı için Ülke konumlandırıcı eklentisi (GeoLite verilerini "
+"içeren bu ürün MaxMind tarafından oluşturuldu, http://www.maxmind.com/ "
+"adresinden edinebilirsiniz). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Ülke bayrakları"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Dosya öncelikleri"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp kendi UPnP uygulamamız için örnek olarak kullanıldı"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Toplu azami paylaşım oranı yaması"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Sıfır Ayar geliştirmeleri"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk web arayüzü"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "KDevelop'tan IDEAl kodu"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Ipfilter eklentisinde dönüşüm hızı geliştirmesi"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "2 güvenlik açığı keşfetti (ikisi de düzeltildi)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Kayıt konumuna sessizce yükleme yaması"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Web arayüzündeki PHP kodlarında düzeltmeler"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS dosya sistemine özgü önceden disk ayırma özelliği"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Çok düşük hızları göstermeme yaması"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Güvenlik duvarı durumunu gösterme yaması"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Değişik yamalar"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "Değişik yamalar"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "Filtre Eşleşmeleri"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Kayıt konumuna sessizce yükleme yaması"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Bir dosya veya dizin seçmelisiniz."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "Bir izleyici eklemeden torrent oluşturmak istediğinize emin misiniz?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "En az bir düğüm eklemelisiniz."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent Dosyaları (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Torrentin Kaydedileceği Bir Dosya Seçin"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "%1 Oluşturuluyor..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Özel Gruplar"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Yeni Grup"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "İsmi Düzenle"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Grubu Kaldır"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Sekme Aç"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Lütfen grup ismini girin."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "%1 grubu zaten var."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Lütfen yeni grubun ismini girin."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Aktif gönderme işlemleri"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Sıralanmış gönderme işlemleri"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Sıralanmış indirme işlemleri"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Kullanıcının indirme işlemleri"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Kullanıcının gönderme işlemleri"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Pasif torrentler"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Pasif indirme işlemleri"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Pasif gönderme işlemleri"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Aktif torrentler"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Aktif indirme işlemleri"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Torrenti Kaldır"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Torrenti ve Veriyi Kaldır"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Paylaşımcı Ekle"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Ek Paylaşımcı Kaynakları"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Torrent Paylaşımcı Kaynakları:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Paylaşımcı Değişimi"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "El ile Paylaş"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Önizleme"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Dizin Aç"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Veri Dizini"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Geçici Dizin"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "İndirme Konumunu Ayarla"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Gruptan Kaldır"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Gruba Ekle"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Hız Limitleri"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+"Torrent mevcut değil. Lütfen bu hatayı KTorrent geliştiricilerine bildirin."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Olası paylaşımcı eklendi."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Bozuk IP adresi."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Tercihler"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "İndirme Seçenekleri"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT bağlantı portu UDP portundan farklı olmalı!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Genel"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Genel Seçenekler"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Bulunamıyor: %1: %2\n"
+"Lütfen doğru IP adresi veya makine adresi girin."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Gelişmiş"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Gelişmiş Seçenekler"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Görünen sütunlar"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Durum"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "İndirilenler"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Boyut"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Gönderilenler"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "İndirme Hızı"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Gönderme Hızı"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Kalan Zaman"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Gönderenler"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "İndirenler"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% Tamamlandı"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Paylaşım Oranı"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "İndirilen Süre"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Paylaşılan Süre"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Tüm Torrentler %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr "%n indirmeden daha fazlası başlatılamaz, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "ve %n paylaşımcı. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Limitleri değiştirmek istiyorsanız Ayarlar -> KTorrent'i Yapılandır yolunu "
+"takip edin."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Torrent %1 tamamen indirilmedi. Yarım kalmış verileri silmek ister misiniz?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "İndirme İşlemini Sil"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Verileri Sil"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Verileri Koru"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr ""
+"İndirilen tüm veriler kaybedilecek. Bunu yapmak istediğinizden emin misin?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "%1 torrentinin verisini zaten denetliyorsunuz !"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "%1 için indirme konumu seçin"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Varolan dosyaların seçimini kaldırdınız. Bu dosyalardaki verileri "
+"kaybedeceksiniz. Bunu yapmak istediğinizden emin misiniz?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Evet, dosyaları sil"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Hayır, dosyaları koru"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " kısa!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Kullanıcı"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Sıralama Yöneticisi"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Yok (özel torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Hız:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>İndirme Hızı: <font color='#1c9a1c'>%1</font></td>"
+"<td>Gönderme Hızı: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Aktarılan Miktarlar:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>İndirilenler: <font color='#1c9a1c'>%3</font></td>"
+"<td>Gönderilenler: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> tamamlandı.<br>Ortalama hız: %2 İndirme / %3 Yükleme."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "İndirme tamamlandı"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> %2 azami paylaşım oranına ulaştı ve durduruldu."
+"<br>%3 %4 ortalama hızı ile yüklendi."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Gönderme tamam"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> %2 azami paylaşım süresine ulaştı ve durduruldu."
+"<br>%3 %4 ortalama hızı ile yüklendi."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> belirtilen hata sonucu durduruldu: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Torrent <b>%1</b>"
+"<br> içinde kötü veriler bulundu. Veri denetlemesi önerilmektedir."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> %2 azami paylaşım oranına ulaşmıştır ve bekletilemez. Göndermeye "
+"devam etmek istiyorsanız limiti elle kaldırınız."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> %2 azami paylaşım süresine ulaşmıştır ve bekletilemez. Göndermeye "
+"devam etmek istiyorsanız limiti elle kaldırınız."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torrent bekletilemez."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Başlatılamadı <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"<br>\n"
+"%n torrentten daha fazlası gönderilemez. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"<br>\n"
+"%n torrentten daha fazlası indirilemez. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Torrent başlatılamadı"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Yeterince kulanılabilir disk alanı yok."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "Disk alanınız doldu.<br /><b>%1</b> dosyası '%2' konumuna indirilecek."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Torrent durdu.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "Uygulamanın çalıştığı aygıtta yer kalmadı"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "KB/sn olarak hız limiti"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Limitsiz"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "<b>%1</b> için hız limitleri:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Bir KDE KPart Uygulaması"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "%1 içerik dosyası açılamıyor : %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Serdar Soytetir, Yavuz Bayrak, Barış Metin, Akın Ömeroğlu"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"tulliana@gmail.com, yavuz.irtibat@gmail.com, baris@uludag.org.tr, "
+"akin@omeroglu.net"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "İndirmek İstediğiniz Dosyaları Seçin"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Şuraya indir:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Grup:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "&Kullanıcı denetimli"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Torrenti başlat"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "İndir"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Tümünü &Seç"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&Hiçbirini Seçme"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Seçimi Tersine Çevir"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Disk alanı"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Gereken disk alanı:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "Boş disk alanı:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "İndirdikten sonra:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Şifreleme"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Protokol şifrelemesi kullan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Protokol şifrelemesi internet sağlayıcılarınn bittorent bağlantılarını "
+"yavaşlatmasını engellemek için kullanılır."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Şifrelenmemiş bağlantılara izin ver"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Bu şık seçili değilse, sadece açıklanma desteği olan istemcilere "
+"bağlanabiliniyor."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Merkezi olmayan değişim protokolü.Daha fazla bilgi için kullanım kılavuzuna "
+"bakın."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Daha çok paylaşımcı bulmak için DHT kullan"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "DHT iletişimi için UDP portu:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Özel IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "İzl&eyiciye bir IP adresi veya bilgisayar adı yolla"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Özel IP ya da bilgisayar:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Sistem Çekmecesi Simgesi"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "&Sistem çekmecesi simgesini göster"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Sistem çekmecesi simgesinde &hız çubuğunu göster"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Sistem çekmecesi iletilerini göster"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Gönderme bantgenişliği (KB/sn olarak):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "İndirme bantgenişliği (KB/sn olarak):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Dizinler"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Geçici dosyaların saklanacağı dizin:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Tamamlanmış indirmeleri buraya taşı:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "İndirilenleri otom&atik olarak buraya kaydet:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr ".torrent dosyalarını buraya kopyala:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "İndirme Araç Çubuğu"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Torrent için hız limitlerini ayarla"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "En yüksek gönderme hızı limiti:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "En yüksek indirme hızı limiti:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/sn (0 limit yok demektir)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Olası paylaşımcı ekle"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "Paylaşımcının IP adresi:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Paylaşımcının IP numarasını ve portunu girin."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent Kara Listesi"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Not: Kara liste sadece mevcut oturum için uygulanır. Bu girdileri kaydetmek ve "
+"daha sonra kullanmak için kaydet/aç düğmelerini kullanın ya da IPFilter "
+"eklentisini kullanın (PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Yasaklanmış Paylaşımcılar"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Paylaşımcıların IP adresleri"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Paylaşımcı ekle:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Paylaşımcıyı kara listeye ekler"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Seçili Eşleri karalisteden siler"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "Temiz&le"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Bu listeyi temizler"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Farklı &Kaydet..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Bu karalisteyi KTorrent IPFiltre eklentisi kullanımı için kaydet"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "En fazla indirme:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "En fazla gönderme:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "İndirmeyi düşük disk alanı üzerinde başlat :"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "En düşük disk alanı:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Başlatma"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Herzaman sor"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Başlatmaya zorla"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 = limit yok)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "İndirme hızı limiti:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Genel bağlantı limiti:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "En yüksek paylaşım süresi:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Bir torrent için en fazla bağlantı:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Yükleme yerlerinin sayısı:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP izleyici portu:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "En yüksek paylaşım oranı:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Gönderme hızı limiti:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/sn (0 = limit yok)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Saat (0 limit yok demektir)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "İndirme işlemi tamamlandığında &yayınlamaya devam et"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Dikkat"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Eğer bir router arkasındaysanız belirtilen portlar yönlendirilmeli. UPnP "
+"eklentisi bunu sizin için yapabilir."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT Sıralama Penceresi"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Durum:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "İzleyici:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Paylaşım oranı:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Kalan bayt:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Kontrol eden"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "&Gönderilenler"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Gönderilen:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Y&ukarı taşı"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "A&şağı taşı"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Yukarı taşı"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Aşağı &taşı"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "&QM Denetimli"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "&Kullanıcı Denetimli"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Adres Yapıştır"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "Adres:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "&Tamam"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "İ&ptal"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Torrent Oluştur"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Torrent dosyasını oluşturmak istediğiniz dosya veya dizin:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "En az bir tane izleyici veya düğme eklemelisiniz."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Dosya Seçenekleri"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Her parçanın boyutu:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Torrenti yayınlamaya &başla"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Merkezi Olma&yan (Sadece DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Özel torrent (DHT geçişi yok)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Yorumlar:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "&Oluştur"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "İ&ptal"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "İzleyiciler"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT düğümleri"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Düğüm:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP ya da bilgisayar"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Port"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"Not: Bazı bilinen DHT düğümleri ön tanımlı olarak gelmektedir. Eğer bu "
+"torrentti yollamayı düşünüyorsanız lütfen kendi IP adresinizi ve port "
+"numaranızı girin."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Gelişmiş Seçenekler"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Şimdiki hız"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Genel ortalama hız"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "X için Pencere"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Taşıma ortalaması"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(yeniden başlattıktan sonra etkinleştirilir)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Önceden disk alanı &ayırma özelliğini pasifleştir"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+"Önceden &gereken tüm disk alanını ayır (dosya parçalanmalarını engeller)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Basit (yavaş)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Dosya sistemine özgü"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Performans"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Bellek kullanımı:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Düşük"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Orta"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Yüksek"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Arayüz güncelleme aralığı:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1sn"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2sn"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5sn"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Hızlı İşlemci"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Yavaş İşlemci"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Veri Denetleme"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "Dosya gönderilirken şundan &büyük parçaları yeniden denetleme"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Veri doğruluğunu şundan &sonra denetle"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "bozuk parça"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Ağ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Bir torrent için izin verilen en fazla bağlantı (0 = limit yok)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "HTTP izleyici bağlantıları için KDE &vekil sunucu ayarlarını kullanma"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP izleyici vekil sunucusu:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Veriler taranıyor"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Torrent verisi taranıyor :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Bulunan parça sayısı :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Başarısız olan / indirilemeyen parça sayısı :"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Test Et"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "metinEtiketi2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "metinEtiketi3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Etkin indirimlerin limiti (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Etkin indirimlerin limiti (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Düşük disk alanı üzerinde indirmeler başlatılsın mı?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Bir torrent için izin verilen en fazla bağlantı (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Tüm torrentler için izin verilen en fazla bağlantı (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Gönderim hızı için limit (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "İndirim hızı için KB/sn bazında limit (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Azami paylaşım oranı (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Saat cinsinden azami paylaşım süresi (0 = limit yok)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Sistem çekmecesi simgesini göster"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Sistem çekmecesinde hız simgesini göster"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "İndirme bantgenişliği (kb/sn olarak):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Gönderme bantgenişliği (kb/sn olarak):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Torrent tamamlandığında uyarı iletisi göster."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "İndirim tamamlandığında yayınlamaya devam et"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Geçici dosyaların saklanacağı dizin"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "İndirilenleri otomatik olarak Kayıt dizinine kaydet"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "İndirilen dosyaların saklanacağı dizin"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "İndirme işlemi bitenleri otomatik olarak Bitirilmişler dizinine taşı"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "İndirilme işlemi biten dosyaların taşınacağı dizin"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr ".torrent dosyalarını otomatik olarak Kopyalama dizinine kopyala"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr ".torrent dosyalarının kopyalanacağı dizin"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "İzleyiciyi geçmek için özel bir IP kullan"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Kayıt dizini olarak kullanılan son dizin"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "İzleyiciyi geçmek için IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Bellek kullanımı"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Arayüz güncelleme sıklığı"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "DHT Desteği"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT bağlantı portu"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Yükleme yerleri sayısı"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "KTorrentGöstericisi tarafından gösterilen sütunlar"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "ET algoritması"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Torrenti indirmek için disk alanı kalmadığında ya da minimum disk alanına "
+"ulaşıldığında torrent durdurulacaktır."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Eklenti Yöneticisi"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Yükle"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Kaldır"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "&Tümünü Yükle"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "Tümünü &Kaldır"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Kullanılacak öntanımlı UPnP aygıtı"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Bulunan aygıtlar:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Aygıt"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Yönlendirilen Portlar"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN Bağlantısı"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "&Portları Yönlendir"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Bağlantı portu yönlendirmesini geri al"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Yeniden Tara"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Dizin1 taraması etkinleştirilsin mi?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Dizin2 taraması etkinleştirilsin mi?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Dizin3 taraması etkinleştirilsin mi?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Dizin1 yolu"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Dizin2 yolu"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Dizin3 yolu"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Torrentin sessiz açılıp açılmayacağı."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Seçilen davranışı sil."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Seçilen davranışı taşı."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "DizinTarama Seçenekleri"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Dizin &1 taraması"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Dizin &2 taraması"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Dizin &3 taraması"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Yüklendikten sonra \"yüklenmişler\" dizinine &taşı"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Yüklendikten sonra torrenti \"yüklenmişler\" dizinine taşı"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Torrentleri &sessizce aç"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "'İndirilecek Dosyaları Seç' penceresini gösterme"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Yük&lendikten sonra sil"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Torrentleri yüklendikten sonra siler"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Taranacak Dizinler"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Dizin 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Dizin 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Dizin 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Arama Tercihleri"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Web Sunucu"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Portu yönlendir"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Oturum TTL (sn olarak):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Arayüz seçin:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Kullanıcı adı:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Parolayı değiştir ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Php çalıştırılabilr dosyasının konumu:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Port numarası"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Portu yönlendir"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Oturum süresi"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "Arayüz teması"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "çalıştırılabilir php dosyasının konumu"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "kullanıcı adı"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "parola"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Parçalar"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Toplam:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Şu anda indirilen:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "İndirilmiş:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Hariç tutulanlar:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Kalan:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Boyut:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Parça"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "İlerleme"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Paylaşımcı"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Atanan Paylaşımcılar"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Gönderenler:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "İndirenler:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Ortalama İndirme Hızı:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Ortalama Gönderme Hızı:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Sonraki Güncelleme:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "İzleyici Durumu:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Torrentin indirilmiş parçaları:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Erişilebilir durumdaki torrent parçaları:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Paylaşım"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Paylaşım oranı bu değere ulaştıktan sonra yükleme durdurulur. Sıfır limit yok "
+"demektir."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "Paylaşım oranı bu değere ulaştıktan sonra yükleme durdurulur."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "Saat"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Oran limiti:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Limit sadece gönderen kipinde etkin"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "Süre &limiti:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "İ&zleyiciyi Güncelle"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Asgari güncelleme aralığı - 60 saniye"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "İ&zleyici Ekle"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "İzleyiciyi Kaldır"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "İzleyi&ciyi Değiştir"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Öntanımlılara Geri Dön"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Anapencerede paylaşımcı sekmesini göster"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Anapencerede parça indirme sekmesini göster"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Anapencerede izleyici sekmesini göster"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Paylaşımcıların listesini göster"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Şu anda &indirilen parçaları listede göster"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "İzleyicilerin listesini göster"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP Engelleme Tercihleri"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Paylaşımcı için Bekçi Filtresi Dosyası Seç "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Paylaşımcı için Bekçi filtresi kullanılsın mı?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP filtreleme dosyası:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "İ&ndir/Dönüştür"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"PeerGuardian (EşBekçisi) filtresini bluetack.co.uk ya da blocklist.org "
+"adreslerinden indir.\n"
+" Not: WIP dosyası destekleniyor."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Seviye1 filtre adresi"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Seviye1 filtresi kullanılsın mı?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Dönüştürülüyor..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"antip2p dosyasını dönüştürmek için dönüştür tuşuna basın. NOT: Bu işlem hızlı "
+"bilgisayarlarda bile bir süre alır ve bu süre zarfında Ktorrent uygulamasını "
+"kullanamayacaksınız."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Güncelle"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Grafikleri şu sıklıkla güncelle"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Arayüz güncellemeleri"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Verileri bu sıklıkta topla"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "milisaniye"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "En fazla"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "En fazla hız cetveli kipi:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Tam"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Daha fazla bilgi için 'Bu nedir'e bakın"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Düzlemdeki en yüksek değerleri girin:\n"
+"- Tepede: Bu güne kadar yakalanan en yüksek hız\n"
+"- Doğru: Listede yer alan en büyük hız"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Paylaşımcı hızı"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Paylaşımcı hızı:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "bu sıklıkta güncelle"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "grafik veri güncellemeleri"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "Çok fazla paylaşımcı hakkında bilgi almak CPU kullanımını arttırır."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "Paylaşımcı bağlantıları"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Büyük değerler bağlı kaynak listelerini anlaşışmaz kılabilir"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Göndericileri kümeleyerek göster"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "İndirenleri kümeleyerek göster"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Ölçüm sayıları"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Gönder"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "Bağlantılar"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Paylaşımcılar"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Kaynak ve hız listeleri arasında geçiş yap"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Kaynaklardan alınan verilerin arasındaki süre"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Kümelerde yer alan indirenlerin çizimine geçiş yap"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Kümelerde yer alan gönderenlerin çizimine geçiş yap"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "İndirme ölçüm sayısı"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Paylaşımcı hızı ölçüm sayısı"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Gönderme ölçüm sayısı"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Bağlantı ölçüm sayısı"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "DHT ölçüm sayısı"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "OY düzlemi en yüksek modu"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Mevcut bir indirmeyi al"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Veri:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Lütfen belirtili torrent için torrent'i ve de verileri belirtiniz."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&İçeri Aktar"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "öntanımlı"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Rss Beslemeleri"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Beslemeler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "Si&l"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "Y&eni"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&Adres"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Yazılar"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Otomatik &tazeleme"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "TTL'yi &Yoksay"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Tazele"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Başlık"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Yazıları sakla (gün)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Etkin"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Filtreler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Filtreleri Kabul Et"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Filtreleri Reddet"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Sıradan ifadeler"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Sıraya &Göre Davran"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "İşletim"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Sıra kriterleri"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Bölümsüz Eşle"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Azami Bölüm"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Azami Sezon"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Asgari Sezon"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Asgari Bölüm"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "&Metni test et"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "De&netle"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Filtre Eşleşmeleri"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Bantgenişliği zamanlayıcısı"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Kategoriyi sol tıkla"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Kategor&i 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "K&apat"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Normal"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Kategori &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Kategori &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Kategoriyi sağ tıkla"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Kategori &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Kategori 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Kategoriler"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. Kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. Kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "indirme:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "gönderme:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/sn *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. Kategori</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "*0, limit yok demektir"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Farklı kaydet"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Dosyadan yükle"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Zamanlamacıyı sıfırla"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&Tamam"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Zamanlayıcı eklentisi tercihler sayfası"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Bantgenişliği &zamanlayıcısı kullanılsın mı?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Bantgenişliği zamanlayıcısı"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Resim yerine &renk kullanılsın mı?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Yavaş sistemler için önerilir)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Za&manlayıcıyı ayarla"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Bantgenişliği zamanlayıcısı etkinleştirilsin mi?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Resim yerine renk kullanılsın mı?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Günlükler için zengin metin kullan"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Genel bilgi iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Bağlantı iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "DHT iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "İzleyici bilgi iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Bellek Giriş/Çıkış iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "IPFiltre eklentisi iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Arama eklentisi iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Parça Dosya İçeri Aktarma eklentisi iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Bilgi Programcığı eklenti iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "UPnP eklenti iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "DizinTarama eklenti iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Zamanlayıcı eklenti iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "RSS eklenti iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "AğArayüzü eklenti iletileri işaretlemesi"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "GünlükGörüntüleyici Seçenekleri"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Eklentiler"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Tümü"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Hata ayıkla"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Uyarı"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Önemli"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Hiçbiri"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP Filtresi:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Ara:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "Tarama Dizini:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Zamanlayıcı:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "Parça Dosya İçeri Aktarımı:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "Bilgi Programcığı:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS eklentisi:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Ağ Arayüzü eklentisi:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Sistem"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Genel:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "Bağlantılar:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "Disk Giriş/Çıkış:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Günlük kayıtları için &zengin metin kullan"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Harici Tarayıcı"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Aramaları harici web tarayıcısında göster"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Öntanımlı tarayıcıyı kullan"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Özel tarayıcı konumu:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Arama Motorları"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Arama motorunun adı:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Ekle"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Arama Motorları"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "Adres"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "&Tümünü Kaldır"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "&Öntanımlı Ekle"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "İnternetten Güncelle"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Ara"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Arama motoru:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Geçerli arama motoru"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Özel tarayıcı kullan"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Özel tarayıcı dosyası konumu"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/sn"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "%n gün "
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Evet, İlk Önce"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Evet, En Son"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "%1 günlük dosyası açılamıyor : %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "%1 dosyasına yazılamıyor : %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "%1 adresinden okunamıyor"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "%1 dizini oluşturulamıyor: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Sembolik bağ oluşturulamıyor %1 -> %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "%1, %2 konumuna taşınamıyor: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "%1, %2 konumuna kopyalanamıyor: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "%1 silinemiyor: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "%1 oluşturulamıyor: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "%1 dosyasının boyutu hesaplanamıyor: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Dosya boyutu hesaplanamıyor: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "%1 açılamıyor: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Dosya genişletilemedi: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Dosya genişletilemiyor"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Dosyada aranamıyor: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "mmap tamponunun sonundan itibaren yazılamiyor!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Durum: <b>%2</b><br>Yazar: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Yüklendi"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Yüklenmedi"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Eklenti Seçenekleri"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "%1 dosyası açılamıyor: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "%1 dizini mevcut değil"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Geçersiz anahtar: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Kodçözme hatası"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Beklenmeyen girdi sonu"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "%1 int'e dönüştüremiyor"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent eksik!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Bozuk torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrentin düğüm veya anons alanı yok"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "%1 torrent dosyası açılamıyor: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Ayrıştırma Hatası"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Torrent dosyası yüklenirken bir hata oluştu. Büyük olasılıkla bu dosya bozulmuş "
+"ya da bu bir torrent dosyası değil.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Torrent dosyasını yüklerken bir hata oluştu. Büyük bir ihtimal ile torrent "
+"dosyası bozulmuş ya da bu bir torrent dosyası değil."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "%1 açılamıyor: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"%1 torrentini zaten indiriyorsunuz, iki torrentin izleyici listesi "
+"birleştirildi."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "%1 torrentini zaten indiriyorsunuz"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "%1 taşınamıyor : %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"%1 dosyası KTorrent'in eski bir sürümü tarafından başlatılmış. bu dosyanın "
+"KTorrent'in yeni sürümü ile çalıştığından emin olun, bu torrenti taşıyacağız. "
+"Bu dosyayı kaydetmek için size bir dizin sorulacak, İptal'e basarsanız dosyayı "
+"kaydetmek için ev dizininiz kullanılacak."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Kaydedilecek Dizini Seç"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Başlatılmadı"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Gönderiliyor"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "İndiriliyor"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Bekletiliyor"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Durdu"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Hata: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Disk alanı ayrılıyor"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "Sıraya Eklendi"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Veri denetleniyor"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Durduruldu. Aygıtta yer kalmadı."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"Bu torrenti indirmek için yeterli disk alanınız yok. Devam etmek istediğinizden "
+"emin misiniz?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "%1 için yetersiz disk alanı"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Torrent \"%1\" azami paylaşım oranına ulaşmıştır. Limiti yoksayıp göndermeye "
+"devam edilsin mi?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Azami paylaşım oranına ulaşıldı."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Torrent durdururken hata %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Torrent başlatırken hata %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Beyan ediliyor"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Bilinmeyen istemci"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "%n paylaşımcı"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "%1 dosyası oluşturulamıyor: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "İlk parça DND dosyasına yazılamadı : %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Son parça DND dosyasına yazılamadı : %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Yazmak için %1 açılamadı : salt okunur dosya sistemi"
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "Dosya genişletilemedi: %1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "%1 dosyası genişletilemiyor"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "%1 dosyası genişletilemiyor"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Dosya %1 sonundan itibaren okunma hatası"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "%1 konumundan okunamıyor"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "%1 konumuna yazılamıyor: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "%1 konumuna yazılamıyor"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Önceden bellek alanı ayrılamıyor: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "%1 ve sonraki 10 bağlantı portlarına erişilemiliyor."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "İzleyiciden geçersiz cevap"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "İzleyiciden geçersiz veri"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Geçersiz izleyici adresi"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "%1 dosyası açılamıyor: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "İçerik dosyası oluşturulamıyor: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Dosya aöılamıyor: %1 : %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+"Router cihazınız üzerinde otomatik olarak bağlantı portlarını yönlendirmek için "
+"UPnP kullanır"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Aygıtın açıklamasında bağlantı port yönlendirme hizmetini bulamıyorum!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP Aygıtları"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Otomatik olarak dizinleri izleyici için tarar ve bunları yükler."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "Dizin Tarama"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "Dizin Tarama"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Dizin Tarama Seçenekleri"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "yüklendi"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"DizinTara - Dizin %1: Yanlış Adres ya da dizin yok. Var olan dizini seçiniz."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Web Arayüzü"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Web Arayüzü Seçenekleri"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Php çalıştırılabilir dosyası öntanımlı yerde değil, lütfen bu dosyanın yolunu "
+"girin"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Lütfen web arayüzü için yeni parola giriniz."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 var ve çalıştırılabiliyor"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 dizini oluşturulmamış"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 çalıştırılabilir değil"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 bir dizin"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 çalıştırılabilir php dosyasının konumu değil"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "Web Arayüzü"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "ktorrent ağ üzerinden denetleme imkanı mevcut olsun mu"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "İlk Önce İndir"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Normal İndir"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "En Son İndir"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Dosya(ları) Sil"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Erişilebilir"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "Bekliyor"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Bu dosyalardaki tüm verileri kaybedeceksiniz, bunu yapmak istediğinizden emin "
+"misiniz ?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Limit kullanma"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Bilgi programcığı"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"İndirilen hakkında daha fazla bilgi verir. Misal: hangi parçalar indirildi, "
+"indiren ve yollayan sayıları..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Özel torrente izleyici eklenemiyor."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Torrentin öntanımlı izleyicisi kaldırılamaz."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Özel torrent'lere izleyici ekleyemezsiniz"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Ülke"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "İstemci"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Boğuldu"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Terslendi"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Erişilebilirlik"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Puan"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Gönderme Yuvası"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Talepler"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Paylaşımcıyı Tekmele"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Paylaşımcıyı Yasakla"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Erişilebilir Parçalar"
+"<br><img src=\"unavailable_color\">&nbsp; - Erişilemez Parçalar"
+"<br><img src=\"excluded_color\">&nbsp; - Hariç Tutulan Parçalar"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Bilgi programcığı seçenekleri"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - İndirilmiş Parçalar"
+"<br><img src=\"unavailable_color\">&nbsp; - İndirilecek Parçalar"
+"<br><img src=\"excluded_color\">&nbsp; - Hariç Tutulan Parçalar"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Dönüştür"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "txt dosyası yükleniyor..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Lütfen bekleyin..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Dosya dönüştürüldü."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Filtre yüklenemedi:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "Yanlış filtre dosyası. Kötü ya da yanlış biçimde olabilir."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "İstenmeyen paylaşımcıları IP adreslerine göre filtreler"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IP Filtresi"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Durum: Yüklendi ve çalışıyor."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Durum: Yüklenmedi."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Durum: <font color=\"#ff0000\">Filtre dosyası bulunamadı.</font> "
+"Filtre dosyası indirin ve dönüştürün."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Seçili dosya zaten var, yeniden indirmek mi istiyorsunuz?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Dosya Mevcut"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr ""
+"(level1.dat) filtre dosyası zaten var, bunu yeniden dönüştürmek mi istersiniz?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP Engelleme Süzgeci"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IP Engelleme Süzgeci Seçenekleri"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "İstatistikler"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "İstatistik seçenekleri"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "İndirenler bağlandı"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "İndirenler kümede"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "Gönderenler bağlandı"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Gönderenler kümede"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "Bir torrent için ortalama bağlanan indiren sayısı"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "Bir torrent için ortalama bağlanan gönderen sayısı"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "Çalışan torrentlerde bağlanılan ortalama indirici sayısı"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "Çalışan torrentlerde bağlanılan ortama gönderici sayısı"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Düğümler"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Görevler"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Aktarım istatistiklerini gösterir"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Hız istatistikleri"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Bağlantı istatistikleri"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Güncel"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Ortalama"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Limit"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "İndirenlerden ortalama"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "İndirenlere ortalama"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Gönderenlerden ortalama"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "İndirenlerden"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Gönderenlerden"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Açıklama"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent dosyaları"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Tüm dosyalar"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Veri doğrulanamıyor: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Torrent dosyası yüklenemiyor: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr ""
+"Başka istemcilerden tamamen veya yarım indirilen torrent'leri içeri aktarır"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Mevcut indirmeyi al"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "Beslemenin Adresi"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Otomatik olarak rss beslemelerini tarayıp düzenli ifadelere göre torrentleri "
+"eşleyip yükler."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS Beslemeleri"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Başlık"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Açıklama"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Bağlantı"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Sezon"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Bölüm"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Zaman"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Zamanlayıcı"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Zamanlayıcı eklenti seçenekleri"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "PZT"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "SALI"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "ÇAR"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "PERŞ"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "CUMA"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "CTS"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "PZR"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Zamanlama kaydedildi."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Dosya bulunamadı."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Zamanlama yüklendi."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Bantgenişliği zamanlama eklentisi"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Bantgenişliği Zamanlamacısını Aç"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Bantgenişliği zamanlayıcısı etkisiz. Seçenekler -> Zamanlayıcı diye gidip etkin "
+"hale getirin."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "Günlük Görüntüleyicisi"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "Günlük Görüntüleyicisi"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Ktorrent'in günlük kayıtlarını gösterir"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Web tarayıcınızı kullanarak eklemek istediğiniz arama motorunda %1 sözcüğünü "
+"(büyük harfler) ile arayın. "
+"<br>Daha sonra oluşan Adresi kopyalayıp buraya yapıştırın."
+"<br>"
+"<br>Örneğin Google'da %1 için arama işlemi "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8 sonucunu verecektir. "
+"<br>Bu Adresi buraya eklerseniz, ktorrent Goggle kullanarak arama yapabilir."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Eklemek istediğiniz arama motorunda web tarayıcınız ile %1 sözcüğünü (büyük "
+"harfler) ile arayın. Daha sonra oluşan Adresi kullanın."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Arama motorunun adını ve adresini girmelisiniz"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "Aynı isimde olan arama motoru zaten var. Başka bir isim kullanın."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Yanlış adres. Ağ tarayıcınız ile FOOBAR diye arayıp doğru adresi buraya "
+"yapıştırabilirsiniz."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Ara"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Arama Motoru Seçenekleri"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "%1 aranıyor..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent dosyaları"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Arama tamamlandı"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Arama Motoru: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Gözde arama motorlarında torrent ara"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Torrent'i indirmek mi kaydetmek mi istiyorsunuz?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Torrent'i İndir"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "İndir"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Torrent paylaşmak için yerel ağ üzerinde ktorrent çalıştıran paylaşımcılar ara"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "ETA algoritması:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "%1 parçası yüklenemedi"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "İzleyiciler"
+
+#~ msgid "Type of service field of IP packets"
+#~ msgstr "IP paketlerinin servis alanı tipi"
diff --git a/translations/uk/Makefile.am b/translations/uk/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/uk/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/uk/messages/Makefile.am b/translations/uk/messages/Makefile.am
new file mode 100644
index 0000000..7ffee10
--- /dev/null
+++ b/translations/uk/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = uk
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/uk/messages/ktorrent.po b/translations/uk/messages/ktorrent.po
new file mode 100644
index 0000000..1c9c4dc
--- /dev/null
+++ b/translations/uk/messages/ktorrent.po
@@ -0,0 +1,4921 @@
+# Translation of ktorrent.po to Ukrainian
+#
+# Ivan Petrouchtchak <ivanpetrouchtchak@yahoo.com>, 2005, 2006, 2007.
+# Ivan Petrouchtchak <fr.ivan@ukrainian-orthodox.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2007-11-06 21:01-0800\n"
+"Last-Translator: Ivan Petrouchtchak <fr.ivan@ukrainian-orthodox.org>\n"
+"Language-Team: Ukrainian <translation@linux.org.ua>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "Немає з'єднань ззовні (можливо, фаєрвол перешкоджає)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "Інформація"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "Перенесено даних під час поточного сеансу"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "Поточна швидкість всіх торентів разом"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "Групи"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "Запустити"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "Зупинити"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "Запустити всі"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "Зупинити всі"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "Вставити адресу URL торента..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "Відкрити менеджер черги..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "Поставити / забрати з черги"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IPFilter"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "Перевірити цілісність даних"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "Макс. швидкість вивантаження"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "Макс. швидкість звантаження"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Файли торентів"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "Всі файли"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "Відкрити адресу"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "Швидкість звантаж.: %1 / вивант.: %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "Звантажено: %1 / вивантажено: %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT: вузлів - %1, завдань - %2"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT: вимкн."
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "Всі торенти"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "Знайти:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "З урахуванням регістру"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "Пересунути ліворуч"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "Пересунути праворуч"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "Пересунути донизу"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "Призначити прискорювач..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "Очистити прискорювач"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "Змінити номер кнопки"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "Новий номер прискорювача:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr ""
+"Мусите ввести IP в форматі \"XXX.XXX.XXX.XXX\". Також можна вживати шаблони "
+"заміни для діапазонів \"127.0.0.*\"."
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "Виберіть файл"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "Виберіть назву файла для збереження"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "Неправильний URL."
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "Звантаження"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "Вивантаження"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr ""
+"Вказаний порт (%1) не доступний або використовується іншою програмою. KTorrent "
+"тепер вживає порт %2."
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+"KTorrent не може приймати з'єднання, бо порти від %1 до %2 вже використовуються "
+"іншою системою."
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "Не вдається створити торент: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr ""
+"Відсутні декілька файлів з даними торента \"%1\", хочете їх заново створити чи "
+"не звантажувати їх?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "Створити заново"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "Не звантажувати"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "Не вдається заново створити відсутні файли: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "Відсутні файли з даними"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "Не вдається скасувати вибір відсутніх файлів: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr ""
+"Відсутній файл, де було збережено дані торента \"%1\". Створити файл заново?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "Не створювати заново"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "Не вдається заново створити файл з даними: %1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "Відсутній файл з даними"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "Перевірка цілісності даних"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "безкінечно"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "Помилка сканування даних: %1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "Сканування даних <b>%1</b> :"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "Програма BitTorrent для KDE"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "Режим зневадження"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "Відкрити документ"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "Втулок RSS"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Втулок веб-інтерфейсу"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "Втулок статистики"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "Піктограма програми і декілька інших"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "Піктограма звантаження"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 піктограма програми"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "Підказка ChunkBar і впорядкування IWFileTreeItem"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+"Знаходження країн для втулки InfoWidget (цей продукт включає дані GeoLite, "
+"створені MaxMind, які доступні на http://www.maxmind.com/). "
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "Прапори країн"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "Пріоритет файлів"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp вживався як приклад для нашого власного впровадження UPnP"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "Глобальна латка коефіцієнта вивантаження / звантаження"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Вдосконалення Zeroconf"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "Coldmilk веб-інтерфейс"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "Код IDEAl з KDevelop"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "Покращення швидкості перетворення у втулці ipfilter"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "Виявив дві вразливості безпеки (обидві полагоджено)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "Латка для тихого завантаження з адресою збереження"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Виправлення в коді PHP веб-інтерфейсу"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "Виділення диску на XFS"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "Латка - не показувати дуже малі швидкості"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "Латка для показу стану за фаєрволом"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "Декілька латок"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "Латка для ховання смужки меню"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "Латка для зміни пріоритетів в веб-інтерфейсі"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "Декілька латок до веб-інтерфейсу"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "Латка панелі фільтрів"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "Латка для тихого завантаження з адресою збереження"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "Потрібно вибрати файл або теку."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "Ви не додали координатора; ви певні, що хочете створити цей торент?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "Потрібно додати принаймні один вузол."
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Файли торента (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "Виберіть файл для збереження торента"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "Створення %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "Нетипові групи"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "Нова група"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "Змінити назву"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "Вилучити групу"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "Відкрити вкладку"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "Будь ласка, введіть назву групи."
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "Група %1 вже існує."
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "Будь ласка, введіть нову назву групи."
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "Активні вивантаження"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "Вивантаження в черзі"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "Звантаження в черзі"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "Звантаження користувача"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "Вивантаження користувача"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "Бездіяльні торенти"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "Бездіяльні звантаження"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "Бездіяльні вивантаження"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "Активні торенти"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "Активні звантаження"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "Вилучити торент"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "Вилучити торент і дані"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "Додати вузли"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "Додаткові джерела вузлів"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "Джерела вузлів торента:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "Обмін вузлів"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "Ручне оголошення"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "Перегляд"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "Відкрити каталог"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "Каталог даних"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "Тимчасовий каталог"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "Вказати адресу звантаження"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "Вилучити з групи"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "Додати до групи"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "Обмеження швидкості"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "Торент не існує. Повідомте про цю помилку розробників KTorrent."
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "Доданий потенційний вузол."
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "Неправильна адреса URL."
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "Параметри"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "Параметри звантаження"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "Порт DHT повинен бути іншим, ніж порт UDP координатора!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "Загальні"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "Загальні параметри"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"Не вдається знайти %1: %2\n"
+"Будь ласка, вкажіть чинний IP або назву вузла."
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "Додатково"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "Додаткові параметри"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "Видимі стовпчики"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "Стан"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "Звантажено"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "Розмір"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "Вивантажено"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "Швидкість звантаження"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "Швидкість вивантаження"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "Залишилось часу"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "Поширювачі"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "П'явки"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% завершено"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "Коефіцієнт звант./вивант."
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "Час звантаження"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "Час поширення"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "Всі торенти %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+"Неможливо запустити більше, ніж %n звантаження, \n"
+"Неможливо запустити більше, ніж %n звантаження, \n"
+"Неможливо запустити більше, ніж %n звантажень, "
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr ""
+"і %n поширення. \n"
+"і %n поширення. \n"
+"і %n поширень. "
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+"Якщо ви хочете змінити обмеження, то підіть до Параметри -> "
+"Налаштувати KTorrent."
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr ""
+"Торент %1 ще не закінчив звантаження. Хочете також вилучити незавершені дані?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "Вилучити звантаження"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "Вилучити дані"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "Залишити дані"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "Ви втратите всі звантажені дані. Ви справді хочете це робити?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "Ви вже перевіряєте дані торента %1!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "Виберіть адресу звантаження для %1"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr ""
+"Ви скасували вибір наступних існуючих файлів. Ви втратите всі дані в цих "
+"файлах. Ви справді хочете це робити?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "Так, вилучити файли"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "Ні, залишити файли"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " коротко!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "Користувач"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "Менеджер черги"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "Ні (приватний торент)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Швидкість:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Звантаження: <font color='#1c9a1c'>%1</font></td>"
+"<td>Вивантаження: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Перенесено:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Звантажено: <font color='#1c9a1c'>%3</font></td>"
+"<td>Вивантажено: <font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr ""
+"<b>%1</b> завершив звантаження. "
+"<br>Середня швидкість: звант. %2 / вивант. %3."
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "Звантаження завершено"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> досягнув максимального значення коефіцієнта вивантаження / "
+"звантаження %2 і зупинився. "
+"<br>Вивантажено %3 з середньою швидкістю %4."
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "Поширення завершено"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+"<b>%1</b> досягнув максимального часу поширення %2 г. і зупинився. "
+"<br>Вивантажено %3 з середньою швидкістю %4."
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> зупинено наступною помилкою: <br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+"Було знайдено пошкоджені дані в торенті <b>%1</b>"
+"<br>Добре було б перевірити цілісність даних торента."
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> досягнув максимального коефіцієнту вивантаження / звантаження %2 і не "
+"може бути поставлений в чергу. Якщо ви хочете продовжити поширення, вилучіть "
+"обмеження вручну."
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+"<b>%1</b> досягнув максимального часу поширення %2 г. і не може бути "
+"поставлений в чергу. Якщо ви хочете продовжити поширення, вилучіть обмеження "
+"вручну."
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Неможливо поставити торент в чергу."
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "Неможливо запустити <b>%1</b> : <br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+"Неможливо поширювати більше, ніж %n торент. "
+"<br>\n"
+"Неможливо поширювати більше, ніж %n торенти. "
+"<br>\n"
+"Неможливо поширювати більше, ніж %n торентів. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+"Неможливо звантажувати більше, ніж %n торент. "
+"<br>\n"
+"Неможливо звантажувати більше, ніж %n торенти. "
+"<br>\n"
+"Неможливо звантажувати більше, ніж %n торентів. "
+"<br>"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "Неможливо запустити торент"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "Недостатньо місця на диску."
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+"У вас залишилося мало місця на диску.<br /><b>%1</b> звантажується у \"%2\"."
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "Торент було зупинено.<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "На пристрої мало місця"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "Обмеження швидкості в КБ/с"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "Необмежено"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "Обмеження швидкості для <b>%1</b>:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "Програма-компонент KDE"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "Не вдається відкрити файл індексу %1: %2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "о. Іван Петрущак"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "fr.ivan@ukrainian-orthodox.org"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "Виберіть, які файли ви хочете звантажити"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "Звантажити у:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "Група:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "Керується &користувачем"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "Запустити торент"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "Звантаження"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "Вибрати &все"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "&Нічого не вибирати"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "Інвертувати вибір"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "Місце на диску"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "Потрібно місця на диску:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "На диску вільно:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "Після звантаження:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "Шифрування"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "Вживати шифрування протоколу"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+"Шифрування протоколу вживається, щоб провайдери Інтернету (ISP) не сповільняли "
+"з'єднання бітторента."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "Дозволити незашифровані з'єднання"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+"Якщо вимкнено, ви зможете з'єднуватись лише з клієнтами, що підтримують "
+"шифрування."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"Протокол <b>D</b>istributed <b>H</b>ash <b>T</b>able."
+"<br>Протокол нецентралізованого обміну даними між вузлами. Для подробиць див. "
+"посібник."
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "&Вживати DHT для залучення додаткових вузлів"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "Порт UDP для комунікації DHT:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "Нетиповий IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "Наді&слати координатору нетипову адресу IP або назву вузла"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "Нетипові IP або назва вузла:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "Піктограма системного лотка"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "Показувати п&іктограму в системному лотку"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "Показувати п&анель швидкості в системному лотку"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "Показувати повідомлення-вигульки в системному лотку"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "Швидкість вивантаження (в КБ/с):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "Швидкість звантаження (в КБ/с):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "Теки"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "Тека для збереження тимчасових файлів:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "Пересунути завершені звантаження до:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "&Автоматично зберегти звантаження до:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "Скопіювати файли торента до:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "Пенал звантаження"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "Вкажіть обмеження швидкості для торента"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "Макс. швидкість вивантаження:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "Макс. швидкість звантаження:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "КБ/с (0 - без обмеження)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "Додати потенційний вузол"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "IP вузла:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "Порт:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "Введіть IP і порт вузла."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "Чорний список KTorrent"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+"Примітка: Чорний список стосується тільки поточного сеансу. Вживайте зберегти / "
+"відкрити, щоб зберігати ваші записи або скористайтесь втулком IPFilter "
+"(PeerGuardian)."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "Заборонені вузли"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "Адреса IP вузла"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "Додати вузол:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "Додає вузол до чорного списку"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "Вилучає вибраний вузол з чорного списку"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "О&чистити"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "Очищає список"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "Зберегти &як..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "Зберегти цей чорний список для використання у втулку KTorrent IPFilter"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "Максимум звантажень:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "Макс. кількість поширень:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "Почати звантаження коли мало місця на диску:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "Мінімальний простір на диску:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "Не починати"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "Завжди запитувати"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "Примусово починати"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "МБ"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 - без обмеження)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "Макс. швидкість звантаження:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "Глобальне обмеження кількості з'єднань:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "Макс. час поширення:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "Максимум з'єднань на торент:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "Кількість позицій вивантаження:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "Порт UDP координатора:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "Макс. коефіцієнт звант. / вивант.:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "Макс. швидкість вивантаження:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "КБ/с (0 - без обмеження)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "Год. (0 - без обмеження)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "&Продовжувати поширення після закінчення звантаження"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "Увага"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+"Потрібно перенаправити ці порти, якщо ви знаходитесь за маршрутизатором. Втулок "
+"UPnP не може цього зробити за вас."
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "Вікно черги торента"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "Стан:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Координатор:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "Коефіцієнт звант. / вивант.:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "Залишилось байтів:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Торент"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "Хто керує"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "В&ивантаження"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "Вивантажено:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "Пе&ресунути вгору"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "Пересунути в&низ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "Пересунути у верхівку"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "Пересунути в самий &низ"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "Керується менеджером &черги"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "Керується &користувачем"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "Вставити URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "Г&аразд"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "&Скасувати"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "Створити торент"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "Файл чи тека, з яких ви хочете створити торент:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "Потрібно додати принаймні один координатор або вузол."
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "Параметри файлів"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "Розмір кожного шматка:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "КБ"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "Почати по&ширення торента"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "Нецентралі&зований (тільки DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "Приватний торент (DHT не дозволено)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "Коментарі:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "С&творити"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "С&касувати"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Координатори"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "Вузли DHT"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "Вузол:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP або назва вузла"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "Порт"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+"ПРИМІТКА: Деякі відомі добрі вузли DHT вже вставлено. Мабуть, потрібно також "
+"вставити вашу власну адресу IP і порт, якщо ви плануєте поширювати цей торент."
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "Додаткові параметри"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+"<b>Алгоритм KTorrent:</b> Типовий алгоритм, який складено з інших алгоритмів, "
+"на основі наших тестів."
+"<br>\n"
+"<b>Алгоритм поточної швидкості:</b> Найпростіший алгоритм - "
+"ЗалишилосьБайтів/ПоточнаШвидкість"
+"<br>\n"
+"<b>Алгоритм глобальної середньої швидкості:</b> "
+"ЗалишилосьБайтів/СередняШвидкість"
+"<br>\n"
+"<b>Алгоритм вікна X:</b> Оцінку часу підраховано з X зразків швидкості"
+"<br>\n"
+"<b>Алгоритм рухомого середнього:</b> Рухому середню швидкість підраховано з X "
+"зразків"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "Поточна швидкість"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "Загальна середня швидкість"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr "Вікно X"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr "Рухоме середнє"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(увійде в дію після перезапуску)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "Ви&мкнути виділення місця на диску"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "&Цілком виділити місце на диску (запобігає фрагментації)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "Простий (повільно)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "Відповідно до файлової системи"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "Швидкодія"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "Вживання пам'яті:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "Незначне"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "Середнє"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "Значне"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "Інтервал оновлення інтерфейсу:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 мс"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 с"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "Швидкий процесор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "Повільний процесор"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "Перевірка даних"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "При вивантаженні, &не перевіряти знов шматки, більші за"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr "Перевіряти &цілісність даних після"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "пошкоджені шматки"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "Мережа"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "Максимальна кількість встановлень з'єднань:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "DSCP для пакетів IP:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "Не вживати про&ксі KDE для HTTP-з'єднань координатора"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "Проксі HTTP координатора:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "Сканування даних"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "Сканування даних торента:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "Знайдено шматків:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "Шматків з помилками / не звантажених:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "Тест"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "Максимальна кількість звантажень (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "Максимальна кількість поширень (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "Починати звантаження, коли мало місця на диску?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "Максимальна кількість з'єднань на торент (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "Макс. кількість з'єднань для всіх торентів (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "Макс. швидкість вивантаження в КБ/с (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "Макс. швидкість звантаження в КБ/с (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "Макс. коефіцієнт вгору/вниз (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "Макс. час поширення в годинах (0 = без обмеження)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "Показувати піктограму в системному лотку"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "Показувати панель швидкості в системному лотку"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "Швидкість звантаження (в кб/с):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "Швидкість вивантаження (в кб/с):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Показувати вигулькні повідомлення про завершення торента."
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "Продовжувати поширення після закінчення звантаження"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "Тека для збереження тимчасових файлів"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "Чи автоматично зберігати звантаження у каталозі збереження"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "Тека для збереження звантажених файлів"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "Чи автоматично пересувати звантаження до теки завершених"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "Тека для пересування файлів, звантаження яких завершено"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "Чи автоматично копіювати файли торента до torrentCopyDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "Тека для копіювання файлів .torrent"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "Чи передавати координатору нетипову адресу IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr "Каталог, який було вжито для останнього збереження"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "Передати координатору адресу IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "Вживання пам'яті"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "Інтервал оновлення графічного інтерфейсу"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "Підтримка DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "Порт DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "Кількість позицій вивантаження"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "Стовпчики показані в KTorrentView"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "Алгоритм (оцінки часу)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+"Якщо немає місця для завершення звантаження й вільного простору на диску менше, "
+"ніж вказано в minDiskSpace, торент зупиниться."
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "Менеджер втулків"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "Завантажити"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "&Розвантажити"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "Завантажити в&сі"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "&Розвантажити всі"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "Вживати типовий пристрій UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "Виявлені пристрої:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "Пристрій"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "Перенаправлені порти"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "З'єднання WAN"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "Перенап&равити порти"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "Повернути перенаправлення портів"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "Пересканувати"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "Увімкнути сканування теки 1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "Увімкнути сканування теки 2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "Увімкнути сканування теки 3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "Шлях теки 1"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "Шлях теки 2"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "Шлях теки 3"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "Чи відкривати торент без втручання."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "Увімкнено дію вилучення."
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "Увімкнена дія пересування."
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "Параметри сканування тек"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "Сканувати теку &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "Сканувати теку &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "Сканувати теку &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "Піс&ля завантаження пересунути в теку \"завантажених\""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "Після завантаження торента пересунути його у теку \"завантажених\""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "Відкривати торент без втр&учання"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "Не показувати вікно «Вибрати файли для звантаження»"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "Вилучити після заван&таження"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "Вилучає торент після завантаження"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "Сканувати теки"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "Тека 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "Тека 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "Тека 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "Параметри пошуку"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Веб-сервер"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "Перенаправити порт"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "Сеанс TTL (в сек.):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "Виберіть інтерфейс:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "Ім'я користувача:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "Змінити пароль ..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "Шлях до програми php:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "Номер порту"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "Перенаправити порт"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "Тривалість життя сеансу"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "жупан інтерфейсу"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "шлях до програми php"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "ім'я користувача"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "пароль"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "Шматки"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "Всього:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "Звантажується:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "Звантажено:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "Виключено:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "Ліворуч:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "Розмір:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "Шматок"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "Поступ"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "Вузол"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "Призначені вузли"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "Поширювачі:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "П'явки:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "Середня швидкість звантаження:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "Середня швидкість вивантаження:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "Наступне оновлення через:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Стан координатора:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "Звантажені частини торента:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "Наявні частини торента:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "Вгору/вниз"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr ""
+"Ваше вивантаження зупиниться, коли коефіцієнт досягне цього значення. Нуль "
+"означає - без обмеження."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr ""
+"Ваше вивантаження зупиниться після вивантаження протягом вказаної кількості "
+"годин."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "год."
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "Обмеження коефіцієнта:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "Обмеження працює тільки в режимі поширення"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "&Обмеження часу:"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "&Оновити координатор"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "Мінімальний інтервал оновлення - 60 секунд"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "Дода&ти координатор"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "Вилучити координатор"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "З&мінити координатор"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "Відновити типові параметри"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "Показати в головному вікні вкладку перегляду вузлів"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "Показати в головному вікні вкладку перегляду звантаження шматків"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "Показати в головному вікні вкладку перегляду координаторів"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "Показати список вузлів"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "Показати список шматків, які теп&ер звантажуються"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "Показати список координаторів"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "Параметри блокування адрес IP"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "Виберіть файл фільтра PeerGuardian "
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "Вживати фільтр PeerGuardian?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "Файл фільтра IP:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "Званта&жити / перетворити"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"Звантажити фільтр PeerGuardian з bluetack.co.uk або blocklist.org.\n"
+"ПРИМІТКА: підтримується ZIP-файл з bluetack.co.uk."
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "Адреса URL фільтра 1 рівня"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "Вживати фільтр 1 рівня?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "Перетворення..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+"Клацніть на кнопку «Перетворити», щоб почати перетворення файла antip2p. "
+"ПРИМІТКА: цей процес може зайняти трохи часу, навіть на швидких комп'ютерах, і "
+"під час перетворення ви не зможете користуватись програмою KTorrent."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "Оновити"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "Оновляти графіки кожні"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "Оновлення інтерфейсу"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "Збирати дані кожні"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "мс"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "Макс."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "Макс. режим шкали швидкості:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "Точна"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "Щоб отримати більше інформації, дивіться «Що це?»"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+"Вкажіть максимальне значення на шкалі OY як:\n"
+"- Найвища: глобальна максимальна швидкість\n"
+"- Точна: Макс. досягнута швидкість, яку видно на графіку"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "Швидкість вузлів"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "Швидкість вузлів:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "оновлювати кожні"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "оновлення даних графіка"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+"Збирання даних про велику кількість з’єднаних вузлів може досить завантажити "
+"процесор."
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "З'єднання вузлів"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "Великі значення можуть спотворити графіки з’єднаних вузлів"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "Показувати поширювачів роями"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "Показувати п’явки роями"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr "Кількість вимірів"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "Вивантажити"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "З'єднання"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "Вузли"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "Перемикання графіків швидкості вузлів"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "Інтервал між отриманням даних про швидкість вузлів"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr "Перемикання показу п’явок роями"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr "Перемикання показу поширювачів роями"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, no-c-format
+msgid "Download mesurments count"
+msgstr "Звантажити кількість вимірів"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr "Кількість вимірів швидкості вузлів"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr "Вивантажити кількість вимірів"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr "Кількість вимірів з’єднань"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr "Кількість вимірів DHT"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr "Макс. режим осі OY"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "Імпортувати існуюче звантаження"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Торент:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "Дані:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "Будь ласка, вкажіть торент і дані, які вже для нього звантажені."
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "&Імпортувати"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "типовий"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "Подачі RSS"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "Подачі"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "Ви&лучити"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "&Створити"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "Статті"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "Авто&оновлення"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "І&гнорувати TTL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "Освіжити"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "&Заголовок"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "Зберігати статті (днів)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "&Активний"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "Фільтри"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "Фільтри прийняття"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "Фільтри відкидання"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "Формальні вирази"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "Розглядати як &серії"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "Процес"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "Критерії серій"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr "Звантажити збіг без епізоду"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr "Макс. епізодів"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, no-c-format
+msgid "Max Season"
+msgstr "Макс. сезонів"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr "Мін. сезонів"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr "Мін. епізодів"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "Перевірити &текст"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "Те&ст"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "Фільтрувати співпадання"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "Планування пропускної здатності"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "Клацніть лівою кнопкою мишки на категорію"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "Категорі&я 1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "В&имкнути"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "&Звичайний"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "Категорія &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "Категорія &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "Клацніть правою кнопкою мишки на категорію"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "Категорія &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "&Категорія 3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "Категорії"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. категорія</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. категорія</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "звантаження:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "вивантаження:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "КБ/с *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. категорія</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 означає - без обмеження"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "Зберегти у файл"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "&Завантажити з файла"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "Скинути планування"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "&Гаразд"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "Сторінка параметрів втулка планування"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "Вживати планування п&ропускної здатності?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "Планування пропускної здатності"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "Вживати замість мал&юнків кольори?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(Рекомендовано для повільних систем)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "Змінити п&ланування"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "Увімкнути планування пропускної здатності?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "Вживати замість малюнків кольори?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "Вживати в журналі багатий текст"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "Прапорець загальних повідомлень"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "Прапорець повідомлень про з'єднання"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "Прапорець повідомлень DHT"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Прапорець повідомлень про координатор"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "Прапорець повідомлень дискового В/В"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "Прапорець повідомлень втулка IPFilter"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "Прапорець повідомлень втулка пошуку"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "Прапорець повідомлень втулка PartFileImport"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "Прапорець повідомлень втулка InfoWidget"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "Прапорець повідомлень втулка UPnP"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "Прапорець повідомлень втулка ScanFolder"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "Прапорець повідомлень втулка планування"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "Прапорець повідомлень втулка RSS"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Прапорець повідомлень втулку веб-інтерфейсу"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "Параметри перегляду журналу"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "Втулки"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "Всі"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "Зневадження"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "Примітка"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "Важливо"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "Немає"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IPFilter:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "Пошук:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "ScanFolder:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "Планування:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "InfoWidget:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "Втулок RSS:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Втулок веб-інтерфейсу:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "Система"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "Загальні:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "З'єднання:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "В/В диска:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "Вживати в журналі багатий те&кст"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "Зовнішній навігатор Тенет"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "Відкривати результати пошуку в зовнішньому навігаторі"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "Вживати типовий навігатор"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "Нетиповий шлях навігатора:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "Рушії пошуку"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "Назва рушія пошуку:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "&Додати"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "Рушії"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "Ви&лучити всі"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "Додати ти&повий"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "Оновити з Інтернету"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "Пошук"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "Рушій пошуку:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "Поточний рушій пошуку"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "Вживати нетиповий навігатор"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "Шлях до програми нетипового навігатора"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 ГБ"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 МБ"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 КБ"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 Б"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 КБ/с"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr ""
+"%n день\n"
+"%n дні\n"
+"%n днів"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "Так, першим"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "Так, останнім"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "Не вдається відкрити файл журналу %1: %2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "Не вдається записати у %1: %2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "Не вдається прочитати з %1"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "Не вдається створити каталог %1: %2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "Не вдається створити символічне посилання %1 до %2: %3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "Не вдається пересунути %1 до %2: %3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "Не вдається скопіювати %1 до %2: %3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "Не вдається вилучити %1: %2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "Не вдається створити %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "Не вдається вирахувати розмір файла %1: %2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "Не вдається вирахувати розмір файла: %2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "Не вдається відкрити %1: %2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "Не вдається розгорнути файл: %1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "Не вдається розгорнути файл"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "Неможливо шукати у файлі: %1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "Не можна записувати поза межами буферу mmap!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>Стан: <b>%2</b><br>Автор: %3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "Завантажено"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "Не завантажено"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "Параметри втулків"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "Не вдається відкрити файл %1: %2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "Каталог %1 не існує"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "Недозволена лексема: %1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "Помилка декодування"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "Несподіваний кінець вводу"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "Не вдається перетворити %1 в int"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Торент не повний!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "Пошкоджений торент!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Торент немає полів оголошення чи вузлів"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr " Не вдається відкрити файл торента %1: %2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "Помилка аналізу"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"Трапилась помилка під час завантаження торента. Ймовірно, пошкоджено торент або "
+"це, навіть, не є файл торента.\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr ""
+"Трапилась помилка під час завантаження торента. Найімовірніша причина: "
+"пошкодження торента або це, навіть, не є файл торента."
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "Не вдається створити %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+"Ви вже звантажуєте цей торент %1; список координаторів обох торентів було "
+"об'єднано."
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "Ви вже звантажуєте торент %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "Неможливо мігрувати %1: %2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Торент %1 було розпочато попередньою версією програми KTorrent. Щоб "
+"переконатись, що цей торент працюватиме з цією версією KTorrent, буде зроблено "
+"міграцію цього торента. У вас запитають адресу, де зберегти торент. Якщо ви "
+"натиснете \"Скасувати\", то буде вибрано теку вашої домівки."
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "Виберіть теку, у яку зберігати"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "Не запущено"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "Поширення"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "Звантаження"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "Пауза зв'язку"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "Зупинено"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "Помилка: "
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "Виділення простору на диску"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "У черзі"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "Перевірка даних"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "Зупинено. На пристрої не залишилось місця."
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr ""
+"У вас замало місця на диску для звантаження цього торента. Ви справді хочете "
+"продовжити?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, c-format
+msgid "Insufficient disk space for %1"
+msgstr "Замало простору на диску для %1"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+"Торент «%1» досягнув максимальне значення коефіцієнта вивантаження / "
+"звантаження. Ігнорувати обмеження і продовжити поширення?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "Досягнуте максимальне значення коефіцієнта вивантаження / звантаження."
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "Помилка зупинки торента %1: %2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "Помилка запуску торента %1: %2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "Оголошення"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "Невідомий клієнт"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr ""
+"%n вузол\n"
+"%n вузли\n"
+"%n вузлів"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "Не вдається створити файл %1: %2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "Не вдалося записати перший шматок в файл DND: %1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "Не вдалося записати останній шматок в файл DND: %1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "Неможливо відкрити %1 для запису: файлова система тільки для читання"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "Не вдається розгорнути файл%1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "Не вдається розгорнути файл %1: не завершено запис"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "Не вдається розгорнути файл %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "Помилка: читання поза кінцем файла %1"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "Помилка читання з %1"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "Помилка запису до %1: %2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "Помилка запису до %1"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "Не вдається виділити місце на диску: %1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "Не вдається прив'язати до порту udp %1 або до 10 наступних портів."
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "Не чинна відповідь координатора"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "Не чинні дані від координатора"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "Не чинна адреса URL координатора"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "Не вдається відкрити файл %1: %2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "Не вдається створити індексний файл: %1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "Не вдається відкрити файл %1: %2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr ""
+"Вживає UPnP для автоматичного перенаправлення портів на вашому маршрутизаторі"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "Неможливо знайти службу перенаправлення портів в описі пристрою!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "Пристрої UPnP"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "Автоматично сканує в каталогах за файлами торентів і завантажує їх."
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "Сканувати теку"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "ScanFolder"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "Параметри сканування тек"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "завантажено"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+"Сканування тек - тека %1: Не чинний URL або тека не існує. Будь ласка, виберіть "
+"чинний каталог."
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "WebInterface"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Параметри WebInterface"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+"Програма запуску php не знаходиться в типовому шляху, будь ласка, введіть шлях "
+"вручну"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "Будь ласка, введіть новий пароль для веб-інтерфейсу."
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 існує і його можна запускати"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 не існує"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 не можна запускати"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 - це каталог"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 не являється шляхом до програми запуску php"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Веб-інтерфейс"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "Дозволяє керувати ktorrent через навігатор"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "Звантажити першим"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "Звантажити звичайно"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "Звантажити останнім"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "Вилучити файл(и)"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "Наявні"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "В очікуванні"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr ""
+"Ви втратите всі дані в цьому файлі. Ви дійсно хочете це робити?\n"
+"Ви втратите всі дані в цих файлах. Ви дійсно хочете це робити?\n"
+"Ви втратите всі дані в цих файлах. Ви дійсно хочете це робити?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "Без обмеження"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "Інформаційний віджет"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr ""
+"Показує додаткову інформацію про звантаження. Наприклад, які шматки вже "
+"звантажено, скільки поширювачів і скільки п'явок ..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "Неможливо додати координатора до приватного торента."
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "Неможливо вилучити типового координатора торентів."
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "Ви не можете додати координаторів до приватного торента"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "Країна"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "Клієнт"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "Зупинено"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "Обрізано"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "Наявність"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "Оцінка"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "Позиція вивантаження"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "Запитів"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "Копнути вузол"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "Заборонити вузол"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Наявні шматки"
+"<br><img src=\"unavailable_color\">&nbsp; - Недоступні шматки"
+"<br><img src=\"excluded_color\">&nbsp; - Виключені шматки"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "Параметри інформаційного віджета"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - Звантажені шматки"
+"<br><img src=\"unavailable_color\">&nbsp; - Шматки, які треба звантажити"
+"<br><img src=\"excluded_color\">&nbsp; - Виключені шматки"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "Перетворити"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "Завантаження текстового файла..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "Зачекайте, будь ласка..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "Файл перетворено."
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "Не вдалося завантажити фільтр:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr ""
+"Поганий файл фільтра. Він або пошкоджений, або у неправильному форматі."
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "Відфільтровує небажані вузли на основі їхніх адрес IP"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "Фільтр IP"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "Стан: завантажено і запущено."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "Стан: не завантажено."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr ""
+"Стан: <font color=\"#ff0000\">фільтр не знайдено.</font> "
+"Звантажте і перетворіть файл фільтра."
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "Вибраний файл вже існує, хочете знов звантажити його?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "Файл існує"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "Файл фільтра (level1.dat) вже існує, хочете перетворити його знов?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "Фільтр IPBlocking"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "Параметри фільтра IPBlocking"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "Статистика"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "Параметри статистики"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "З'єднаних п’явок"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "П'явок в роях"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "З'єднаних поширювачів"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "Поширювачів в роях"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "З’єднаних п’явок на торент (середнє)"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "З’єднаних поширювачів на торент (середнє)"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "З’єднаних п’явок на активний торент (середнє)"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "З’єднаних поширювачів на активний торент (середнє)"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "Вузли"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "Завдання"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "Показує статистику перенесення"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "Статистика швидкості"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "Статистика з'єднань"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "Поточна"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "Середня"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "Обмеження"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "Середня від п’явки"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "Середня до п’явки"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "Середня від поширювачів"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "Від п’явок"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "Від поширювачів"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "Легенда"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Файли торентів"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "Всі файли"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "Не вдається перевірити цілісність даних: %1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "Не вдається завантажити файл торента: %1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "Імпортує від інших клієнтів частково або повністю звантажені торенти"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "Імпортувати існуюче звантаження"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "URL подачі"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr ""
+"Автоматично шукати в подачах RSS файли торентів, що задовольняють формальні "
+"вирази, і завантажувати їх."
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "Подачі RSS"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr "Не вдалося знайти і звантажити чинний торент для %1"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "Заголовок"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "Опис"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "Посилання"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Season"
+msgstr "Сезон"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr "Епізод"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "Час"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "Планування"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "Параметри втулка планування"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "пн"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "вт"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "ср"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "чт"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "пт"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "сб"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "нд"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "Планування збережено."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "Файл не знайдено."
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "Планування завантажено."
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "Втулок планування пропускної здатності"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "Відкрити планування пропускної здатності"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr ""
+"Планування пропускної здатності вимкнене. Підіть до Параметри ->"
+"Планування, щоб його увімкнути."
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "LogViewer"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "LogViewer"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "Показує вивід журналу ktorrent"
+
+#: plugins/search/searchprefpage.cpp:52
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"Скористайтесь вашим навігатором Тенет, щоб знайти %1 (великі літери) за "
+"допомогою пошуковика, який ви хочете додати. "
+"<br> Потім, скопіюйте адресу URL з панелі адреси і вставте цю адресу сюди. "
+"<br>"
+"<br>Наприклад, пошук за %1 на Ґуґлі, дасть результат: "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> Якщо додати сюди цю адресу URL, то ktorrent може шукати за допомогою "
+"Ґуґла."
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+"Скористайтесь вашим навігатором Тенет, щоб знайти %1 (великі літери) за "
+"допомогою пошуковика, який ви хочете додати. Потім, скопіюйте цю адресу URL "
+"сюди."
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "Ви мусите ввести назву і адресу URL рушія пошуку"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr ""
+"Рушій пошуку з такою назвою вже існує. Будь ласка, виберіть іншу назву."
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr ""
+"Неправильна адреса URL. Пошукайте за FOOBAR з допомогою вашого навігатора Тенет "
+"і скопіюйте / вставте сюди точну адресу URL."
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "Пошук"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "Параметри рушія пошуку"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "Пошук за %1..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "файли торента"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "Пошук завершено"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " Рушій: "
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "Пошук за торентами на декількох популярних рушіях пошуку торентів"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "Хочете звантажити чи зберегти торент?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "Звантажити торент"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "Звантажити"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+"Знаходить в локальній мережі вузли, на яких запущено ktorrent, щоб мати з ними "
+"спільні торенти"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "Алгоритм (час до закінчення):"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "Не вдається завантажити шматок %1"
+
+#~ msgid "Patch to update the FileView in a separate thread"
+#~ msgstr "Латка для оновлення FileView в окремій нитці"
+
+#~ msgid "Alt+X"
+#~ msgstr "Alt+X"
+
+#~ msgid "TrackerViewBase"
+#~ msgstr "TrackerViewBase"
diff --git a/translations/zh_CN/Makefile.am b/translations/zh_CN/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/zh_CN/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/zh_CN/messages/Makefile.am b/translations/zh_CN/messages/Makefile.am
new file mode 100644
index 0000000..b5f72f3
--- /dev/null
+++ b/translations/zh_CN/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = zh_CN
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/zh_CN/messages/ktorrent.po b/translations/zh_CN/messages/ktorrent.po
new file mode 100644
index 0000000..28d4f13
--- /dev/null
+++ b/translations/zh_CN/messages/ktorrent.po
@@ -0,0 +1,4854 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# sejishikong <sejishikong@263.net>, 2005.
+# QAed by Funda Wang <fundawang@linux.net.cn>, 2005-09-23.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent 1.1rc1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2008-01-21 15:13+0800\n"
+"Last-Translator: Lie_Ex <lilith.ex@gmail.com>\n"
+"Language-Team: zh_CN <kde-china@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr "无进入连接(可能被防火墙阻挡)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "信息"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "在当前会话中传输的数据"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "当前所有下载的总速度"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr "组"
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "开始"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "停止"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "全部开始"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "全部停止"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "粘贴 Torrent URL..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "打开队列管理器..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "入队/离队"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP 过滤器"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "检查数据完整性"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "设定最大上传速率"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "设定最大下载速率"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "种子文件"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "所有文件"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "打开位置"
+
+#: apps/ktorrent/ktorrent.cpp:793
+msgid "Speed down: %1 / up: %2"
+msgstr "下载速度:%1/上传速度:%2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+msgid "Transferred down: %1 / up: %2"
+msgstr "下载量:%1 /上传量:%2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT:%1 个节点,%2 个任务"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT:关"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+msgid "All Torrents"
+msgstr "全部 Torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr "查找:"
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr "大小写敏感"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+msgid "Move to left dock"
+msgstr "移到左侧停靠区"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+msgid "Move to right dock"
+msgstr "移到右侧停靠区"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+msgid "Move to bottom dock"
+msgstr "移到底部停靠区"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr "指派快捷键..."
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr "清除快捷键"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr "更改按钮编号"
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr "新快捷键编号:"
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr "您必须按照“XXX.XXX.XXX.XXX”格式输入 IP,可以使用如“127.0.0.*”这样的范围通配符。"
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "选择文件"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "选择用来保存的文件名"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "错误的 URL。"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "下载"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "上传"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr "指定的端口(%1)不可用,或者已经被其它应用程序使用。KTorrent 现在使用端口 %2。"
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr "KTorrent 无法接收连接,因为 %1 到 %2 的端口已被其它程序占用。"
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "无法创建 torrent:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr "种子“%1”的部分数据文件已丢失,您要重新生成它们,还是不要再重新下载?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "重建"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "不下载"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "无法重建缺少的文件:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "数据文件缺失"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "无法反选缺少的文件:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr "种子“%1”保存的数据文件丢失,您想要重新创建它吗?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Do Not Recreate"
+msgstr "不重建"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "无法重建数据文件:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "缺少数据文件"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "检查数据完整性"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "无限制"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1%"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, c-format
+msgid "Error scanning data: %1"
+msgstr "扫描数据出错:%1"
+
+#: apps/ktorrent/scandialog.cpp:77
+msgid "Scanning data of <b>%1</b> :"
+msgstr "扫描 <b>%1</b> 的数据:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "KDE 下的 BitTorrent 程序"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "调试模式"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "要打开的文档"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+msgid "RSS Plugin"
+msgstr "RSS 插件"
+
+#: apps/ktorrent/main.cpp:126
+msgid "Webinterface Plugin"
+msgstr "Web 界面插件"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr "统计插件"
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "应用程序图标及其它"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "下载图标"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 应用程序图标"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "下载块栏的工具提示和 IWFileTreeItem 排序"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr "信息部件插件的国家定位器(此产品包含 MaxMind 创建的地理数据,相关主页在 http://www.maxmind.com/)"
+
+#: apps/ktorrent/main.cpp:144
+msgid "Country flags"
+msgstr "国旗"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "文件优先化"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp 是我们自己的 UPnP 简易实现范例"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr "全局最大共享率的补丁"
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr "Zeroconf 加强"
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr "冰镇牛奶一样的 Web 界面"
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr "来自 KDevelop 的 IDEAl 代码"
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr "IP 过滤插件的会话速度改善"
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr "发现了两个安全缺陷(都已修正)"
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr "静默装入保存位置的补丁"
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr "Web 界面的 PHP 代码修正"
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr "XFS 特定的磁盘预分配机制"
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr "不显示极低速度的补丁"
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr "显示防火墙潜在状态的补丁"
+
+#: apps/ktorrent/main.cpp:159
+msgid "Several patches"
+msgstr "若干补丁"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr "隐藏菜单栏的补丁"
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr "在 Web 界面中修正文件优先级的补丁"
+
+#: apps/ktorrent/main.cpp:162
+msgid "Several webgui patches"
+msgstr "若干 Web 界面相关的补丁"
+
+#: apps/ktorrent/main.cpp:163
+msgid "Filterbar patch"
+msgstr "过滤栏补丁"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr "非线程化文件视图更新的补丁"
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr "SHA1 哈希值生成优化"
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr "修正了 FreeBSD 上空闲磁盘空间计算方式的补丁"
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "静默装入保存位置的补丁"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "您必须选择一个文件或文件夹。"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "您还没有添加一个 tracker,您确定想要就这样创建种子吗?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+msgid "You must add at least one node."
+msgstr "您必须至少添加一个节点。"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "种子文件 (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "选择保存 Torrent 的文件"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "正在创建 %1..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+msgid "Custom Groups"
+msgstr "自定义组"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr "新建组"
+
+#: apps/ktorrent/groups/groupview.cpp:141
+msgid "Edit Name"
+msgstr "编辑名称"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+msgid "Remove Group"
+msgstr "删除组"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr "打开标签"
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr "请输入组名称。"
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr "组 %1 已经存在。"
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr "请输入新的组名。"
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+msgid "Active uploads"
+msgstr "活动的上传"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+msgid "Queued uploads"
+msgstr "已排队的上传"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+msgid "Queued downloads"
+msgstr "已排队的下载"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+msgid "User downloads"
+msgstr "用户下载"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+msgid "User uploads"
+msgstr "用户上传"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+msgid "Inactive torrents"
+msgstr "非活动种子"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+msgid "Inactive downloads"
+msgstr "非活动下载"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+msgid "Inactive uploads"
+msgstr "非活动上传"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+msgid "Active torrents"
+msgstr "活动的种子"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+msgid "Active downloads"
+msgstr "活动的下载"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+msgid "Remove Torrent"
+msgstr "删除 Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+msgid "Remove Torrent and Data"
+msgstr "删除 Torrent 和数据"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+msgid "Add Peers"
+msgstr "添加对等点"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr "额外对等点来源"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr "种子对等点来源:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr "对等点交换"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "手动通告"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "预览"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr "打开目录"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr "数据目录"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr "临时目录"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+msgid "Set Download Location"
+msgstr "设定下载位置"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr "从组中删除"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+msgid "Add to Group"
+msgstr "添加到组"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, no-c-format
+msgid "Speed Limits"
+msgstr "速度限制"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr "种子不存在。请向 KTorrent 开发者报告 bug。"
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr "潜在对等点已添加。"
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+msgid "Malformed IP address."
+msgstr "IP 地址错误。"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "首选项"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "下载选项"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT 端口必须不同于 UDP tracker 端口!"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "常规"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "常规选项"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"无法查阅 %1 : %2\n"
+"请提供合法的 IP 地址或主机名。"
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr "高级"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, no-c-format
+msgid "Advanced Options"
+msgstr "高级选项"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr "可见列"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "状态"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "已下载"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "大小"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "已上传"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "下载速度"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "上传速度"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "剩余时间"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+msgid "Seeders"
+msgstr "做种者"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+msgid "Leechers"
+msgstr "吸血虫"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "完成百分比"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+msgid "Share Ratio"
+msgstr "共享率"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+msgid "Time Downloaded"
+msgstr "下载时间"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+msgid "Time Seeded"
+msgstr "做种时间"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+msgid "All Torrents %1/%2"
+msgstr "全部种子 %1/%2"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr "无法启动多于 %n 个下载"
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "和 %n 个种子。"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr "如果您想要更改限制,请转到 设置 -> 配置 KTorrent。"
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr "Torrent %1 尚未完成下载,您是否想要删除未完成的数据?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "删除下载"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Delete Data"
+msgstr "删除数据"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr "保留数据"
+
+#: apps/ktorrent/ktorrentview.cpp:395
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "您将失去已经下载的全部数据。您确定想要这么做吗?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "您已经检查了 torrent %1 的数据!"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, c-format
+msgid "Choose download location for %1"
+msgstr "选择 %1 的下载位置"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr "您已经取消了下列已有文件。您将丢失这些文件中的全部数据,您确定想要这么做吗?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "是,删除文件"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "否,保留文件"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr " 短!"
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "用户"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "队列管理器"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "无(私有 torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>速度:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>下载:<font color='#1c9a1c'>%1</font></td>"
+"<td>上传:<font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>传输:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>下载:<font color='#1c9a1c'>%3</font></td>"
+"<td>上传:<font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> 已经完成下载。<br>平均速度:%2 下载/ %3 上传。"
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "下载完成"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+msgid "Seeding completed"
+msgstr "做种完成"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> 已经停止,因为下面的错误:<br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr "Torrent 无法入队。"
+
+#: apps/ktorrent/trayicon.cpp:243
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "无法启动 <b>%1</b>:<br>"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr "无法启动多于 %n 个下载"
+
+#: apps/ktorrent/trayicon.cpp:256
+#, fuzzy, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr "无法启动多于 %n 个下载"
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr "无法启动种子"
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr "磁盘空间不足。"
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr "您的磁盘空间不足。<br /><b>%1</b> 会被下载到“%2”。"
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr "种子已经停止。<br />"
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr "设备剩余空间不足"
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "速度限制,单位 KB/秒"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "无限制"
+
+#
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+msgid "Speed limits for <b>%1</b>:"
+msgstr "<b>%1</b> 的速度限制:"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE KPart 应用程序"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "无法打开索引文件 %1:%2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "sejishikong"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "sejishikong@263.net"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "选择您想要下载的文件"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, no-c-format
+msgid "Download to:"
+msgstr "下载到:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr "组:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, no-c-format
+msgid "&User controlled"
+msgstr "用户控制(&U)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, no-c-format
+msgid "Start torrent"
+msgstr "开始种子任务"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "下载"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "全部选择(&A)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "全部不选(&N)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "反向选择"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr "磁盘空间"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr "需要的磁片空间:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr "剩余磁盘空间:"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, no-c-format
+msgid "After download:"
+msgstr "下载后:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "加密"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "使用协议加密"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr "协议加密可让您的 ISP 不能减慢您的 BT 下载连接速度。"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "允许不加密的连接"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "使用 DHT 获得额外的下载者(&U)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "DHT 通讯的 UDP 端口:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "自定义 IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "向 tracker 发送自定义 IP 或主机名(&N)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "自定义 IP 或主机名:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, no-c-format
+msgid "System Tray Icon"
+msgstr "系统托盘图标"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "显示系统托盘图标(&Y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "在托盘图标中显示速度栏(&B)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, no-c-format
+msgid "Show system tray popup messages"
+msgstr "显示系统托盘弹出消息"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr "上传带宽(KB/秒):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr "下载带宽(KB/秒):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "文件夹"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "保存临时文件的文件夹:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, no-c-format
+msgid "Move completed downloads to:"
+msgstr "将已完成的下载移动到:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "自动保存下载到(&A):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "复制 .torrent 文件到:"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "下载工具栏"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "设置种子的速度限制"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, no-c-format
+msgid "Max upload rate:"
+msgstr "最大上传速率:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, no-c-format
+msgid "Max download rate:"
+msgstr "最大下载速率:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/秒 (0为无限制)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr "添加潜在对等点"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, no-c-format
+msgid "Peer IP:"
+msgstr "对等点 IP:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "端口:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr "输入对等点 IP 和端口。"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent 黑名单"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "已封禁的对等点"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "对等点 IP 地址"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "添加对等点:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "添加对等点到黑名单"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "从黑名单中删除选中的对等点"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "清除(&L)"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "清除此列表"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "另存为(&A)..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "最大任务数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "最大种子数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr "在低剩余空间的磁盘上下载:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, no-c-format
+msgid "Minimum disk space:"
+msgstr "最小磁盘空间:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, no-c-format
+msgid "Don't start"
+msgstr "不开始"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr "总是询问"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, no-c-format
+msgid "Force start"
+msgstr "强行开始"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr "MB"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 为无限制)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "最大下载速率:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, no-c-format
+msgid "Global connection limit:"
+msgstr "全局连接限制:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, no-c-format
+msgid "Max seed time:"
+msgstr "最大做种时间:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "每任务最大连接数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "上传通道数:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP Tracker 端口:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, no-c-format
+msgid "Max share ratio:"
+msgstr "最大共享率:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "最大上传速率:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/秒 (0为无限制)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "小时 (0 为无限制)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "下载完成后保持做种(&K)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "注意"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT 队列对话框"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "状态:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "Tracker:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "共享率:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "剩余字节数:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "控制方式"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "上传(&S)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "已上传:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "上移(&O)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "下移(&N)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, no-c-format
+msgid "Move to top"
+msgstr "移到顶端"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr "移到底端(&B)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "队列管理器控制(&Q)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "用户控制(&U)"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "粘贴 URL"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "URL:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "确定(&K)"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "取消(&A)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "创建 Torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "您想要创建 torrent 的文件或文件夹:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "您必须至少添加一个 tracker 或节点。"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "文件选项"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "每块的大小:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "开始做种(&G)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr "分布式(只对 DHT 网络有效)(&Z)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "私有 torrent(不允许 DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "注释:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, no-c-format
+msgid "&Create"
+msgstr "创建(&C)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "取消(&N)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "Trackers"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr "DHT 结点"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, no-c-format
+msgid "Node:"
+msgstr "结点:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, no-c-format
+msgid "IP or hostname"
+msgstr "IP 或主机名"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "端口"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, no-c-format
+msgid "Advanced Preferences"
+msgstr "高级首选项"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, no-c-format
+msgid "Current speed"
+msgstr "当前速度"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr "全局平均速度"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr "(重新启动程序后生效)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr "禁用磁盘空间预分配(&B)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr "预分配全部磁盘空间(可避免碎片)(&U)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr "基本(较慢)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr "文件系统特定"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, no-c-format
+msgid "Performance"
+msgstr "性能"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "内存占用:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "低"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "中"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "高"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "界面更新间隔:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500 毫秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1 秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2 秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5 秒"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr "快速 CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr "慢速 CPU"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, no-c-format
+msgid "Data Checking"
+msgstr "数据检查"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr "在上传期间,对大于以下尺寸的块不重新检查(&N) "
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr "损坏的块"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr "联网"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "最大连接数:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr "IP 数据包的 DSCP:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr "HTTP tracker 连接时不使用 KDE 的代理设置(&X)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "HTTP Tracker 端口:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "扫描数据"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "正在扫描种子数据:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "找到的块数量:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "失败/未下载的块数量:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "测试"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr "textLabel2"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr "textLabel3"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "下载的最大任务数(0为无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "种子的最大任务数(0为无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr "在低剩余空间的磁盘上下载吗?"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "每个下载任务的最大连接数(0为无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "所有下载任务的最大连接数(0为无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "最大上传速度(KB/秒)(0为无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "最大下载速度(KB/秒)(0为无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "最大共享率(0 代表无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "最大共享率(按小时计,0 代表无限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "显示系统托盘图标"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "在托盘图标中显示速度栏"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr "下载带宽(kb/秒):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr "上传带宽(kb/秒):"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "下载任务完成时显示弹出消息。"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "在下载完成后保持做种"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "保存临时文件的文件夹"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "是否将下载自动保存到 saveDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "保存下载文件的文件夹"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "是否将已完成的下载自动移动到 completedDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "已完成的下载移动到"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "是否将 .torrent 文件自动复制到 torrentCopyDir"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr ".torrent 文件复制到"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "是否将自定义 IP 传递给 tracker"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "传递给 tracker 的 IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "内存占用"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "界面更新间隔"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "支持 DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT 端口"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "上传通道数"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr "KTorrent 视图要显示的列"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr "ET 算法"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "插件管理器"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "装入"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "卸载(&N)"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, no-c-format
+msgid "Load &All"
+msgstr "全部装入(&A)"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, no-c-format
+msgid "&Unload All"
+msgstr "全部卸载(&U)"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "要使用的默认的 UPnP 设备"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "检测到的设备:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "设备"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "转发的端口"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, no-c-format
+msgid "WAN Connection"
+msgstr "WAN 连接"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, no-c-format
+msgid "Forw&ard Ports"
+msgstr "转发端口(&A)"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "撤消端口转发"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "重新扫描"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "允许扫描文件夹1?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "允许扫描文件夹2?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "允许扫描文件夹3?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "文件夹1路径"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "文件夹2路径"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "文件夹3路径"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "是否以静默方式打开 torrent。"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "选中了删除动作。"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "选中了移动动作。"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "扫描文件夹首选项"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "扫描文件夹 &1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "扫描文件夹 &2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "扫描文件夹 &3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "装入后移动到“已装入”目录(&A)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr ""
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "以静默方式打开 torrent(&Y)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "不显示“选择要下载的文件”对话框"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "装入后删除(&G)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "装入后删除 torrent"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "要扫描的文件夹"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "文件夹 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "文件夹 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "文件夹 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "搜索首选项"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr "Web 服务器"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, no-c-format
+msgid "Forward port"
+msgstr "转发端口"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr "会话 TTL(秒):"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, no-c-format
+msgid "Select interface:"
+msgstr "选择接口:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, no-c-format
+msgid "Username:"
+msgstr "用户名:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr "更改密码..."
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr "PHP 可执行文件路径:"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr "端口号"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, no-c-format
+msgid "forward Port"
+msgstr "转发端口"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr "会话生存时间"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, no-c-format
+msgid "interface skin"
+msgstr "界面皮肤"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr "PHP 可执行文件路径"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr "用户名"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr "密码"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "块"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "总共:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "当前正在下载:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "已下载:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "已排除:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr "剩余:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "大小:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "块"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "进度"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "下载者"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "指派的下载者"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "种子:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "下载者:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "平均下载速度:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "平均上传速度:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "下次更新于:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "Tracker 状态:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "这个 torrent 已经下载的部分:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "这个 torrent 可用的部分:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "分享"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr "您的上传会在达到指定分享比率后自动停止。0 代表无限制。"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "您的上传会在指定小时数后自动停止。"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr "小时"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, no-c-format
+msgid "Ratio limit:"
+msgstr "比率限制:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "限制只在种子模式中有效"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, no-c-format
+msgid "Time &limit:"
+msgstr "时间限制(&L)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, no-c-format
+msgid "&Update Tracker"
+msgstr "更新 tracker(&U)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "最小更新间隔 - 60 秒"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, no-c-format
+msgid "Add Trac&ker"
+msgstr "添加 tracker(&K)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "删除 Tracker"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "更改 tracker(&A)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "恢复默认值"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "在主窗口中显示下载者查看标签"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "在主窗口中显示块下载查看标签"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "在主窗口中显示 trackers 查看标签"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "显示下载者列表"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "显示当前正在下载的块列表(&Y)"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "显示 tracker 列表"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IP 屏蔽首选项"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "使用 KTorrent 过滤器吗?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, fuzzy, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "使用 KTorrent 过滤器吗?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP 过滤器文件:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "下载/转换(&N)"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "一级过滤器 URL"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "使用一级过滤器吗?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "正在转换..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr "更新"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr "图表更新间隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, no-c-format
+msgid "GUI updates"
+msgstr "界面更新间隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr "数据收集间隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr "毫秒"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, no-c-format
+msgid "Maximum"
+msgstr "最大"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "最大速度刻度:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr "精确"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr "查看“这是什么”获取更多帮助"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, no-c-format
+msgid "Peers speed"
+msgstr "对等点速度"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, no-c-format
+msgid "Peers speed:"
+msgstr "对等点速度:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr "更新间隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr "图表数据更新"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr "收集大量连接点的数据时会导致较大的 CPU 开销。"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, no-c-format
+msgid "Peers connections"
+msgstr "对等点连接"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr "过大的连接点值会使图表变得模糊"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, no-c-format
+msgid "Show seeders in swarms"
+msgstr "显示群集中的吸血虫"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr "显示群集中吸血虫"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, no-c-format
+msgid "Upload"
+msgstr "上传"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, no-c-format
+msgid "Connections"
+msgstr "连接"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "下载者"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr "切换对等点速度图表"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr "获取对等点连接速度数据的间隔"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "下载 Torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, no-c-format
+msgid "Connections mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "导入已有的下载"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "数据:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "请指定 torrent 和该 torrent 已下载的数据。"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "导入(&I)"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, no-c-format
+msgid "default"
+msgstr "默认"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr "RSS 种子"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, no-c-format
+msgid "Feeds"
+msgstr "种子"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr "删除(&L)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr "新建(&N)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, no-c-format
+msgid "&URL"
+msgstr "&URL"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr "文章数"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr "自动刷新(&R)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr "忽略 TTL(&G)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr "刷新"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr "标题(&T)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr "保留文章(天)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr "活动(&A)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, no-c-format
+msgid "Filters"
+msgstr "过滤器"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, no-c-format
+msgid "Accept Filters"
+msgstr "接受过滤器"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr "拒绝过滤器"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr "正则表达式"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr "串行处理(&S)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, no-c-format
+msgid "Process"
+msgstr "处理"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr "串行条件"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "最大比率:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr "测试文本(&X)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, no-c-format
+msgid "Te&st"
+msgstr "测试(&S)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, no-c-format
+msgid "Filter Matches"
+msgstr "过滤器匹配"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "带宽规划器"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "左键单击类别"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "类别 1(&Y)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "关闭(&U)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "普通(&N)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "类别 &3"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "类别 &2"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "右键单击类别"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "类别 &1"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "类别 3(&C)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "类别"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. 类别</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. 类别</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "下载:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "上传:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/s *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. 类别</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 为无限制"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "保存到文件"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "从文件装入(&L)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "重置规划"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "确定(&K)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "规划器插件首选项页"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "使用带宽规划器吗?(&B)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "带宽规划器"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "使用颜色取代点阵吗(&X)?"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(较慢系统推荐适用)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "编辑规划(&C)"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "启用带宽规划器吗?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "使用颜色取代点阵吗?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "使用富格式日志文本"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "常规消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "连接消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "DHT 消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "Tracker 消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "磁盘 IO 消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "IP 过滤器插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "搜索插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "部分文件导入插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "信息部件插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "UPnP 插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "扫描文件夹插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "规划器插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "RSS 插件消息标记"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "Web 界面插件消息标记"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "日志查看器选项"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "插件"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "全部"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "调试"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "注意"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "重要"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "无"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP 过滤器:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "搜索:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "扫描文件夹:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "规划器:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "部分文件导入:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "信息部件:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr "RSS 插件:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, no-c-format
+msgid "WebInterface plugin:"
+msgstr "Web 界面插件:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "系统"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "常规:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "连接:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "磁盘 I/O:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "日志使用富格式文本(&X)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr "外部浏览器"
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr "在外部浏览器中打开搜索"
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr "使用默认浏览器"
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, no-c-format
+msgid "Custom browser path:"
+msgstr "自定义浏览器路径:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "搜索引擎"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "搜索引擎名称:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "添加(&A)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "引擎"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "URL"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "全部删除(&E)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "添加默认(&L)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, no-c-format
+msgid "Update From Internet"
+msgstr "从 Internet 上更新"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "搜索"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "搜索引擎:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "当前的搜索引擎"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr "使用自定义浏览器"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr "自定义浏览器可执行文件路径"
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 字节"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/秒"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "%n 天"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "是,最先"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "是,最后"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "无法打开日志文件 %1:%2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "无法写入 %1:%2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "无法从 %1 读取"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "无法创建目录 %1:%2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "无法创建符号链接 %1 到 %2:%3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "无法移动 %1 到 %2:%3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "无法复制 %1 到 %2:%3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "无法删除 %1:%2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "无法创建 %1:%2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "无法计算 %1 的文件大小:%2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "无法计算文件大小:%2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "无法打开 %1:%2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "无法展开文件:%1"
+
+#: libktorrent/util/fileops.cpp:393
+msgid "Cannot expand file"
+msgstr "无法展开文件"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "无法在文件中搜索:%1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "无法向超出 mmap 缓冲区尾部的区域写数据!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr "%1<br>状态:<b>%2</b><br>作者:%3"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "已装入"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "未装入"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "插件选项"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "无法打开文件 %1:%2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "目录 %1 不存在"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "发生错误:%1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "解码错误"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "输入的结尾不正确"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "无法将 %1 转换为整数"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent 不完整!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "损坏的 torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "种子内不含发布或节点信息字段"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "无法打开 torrent 文件 %1:%2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "语法错误"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr ""
+"载入 torrent 文件时发生了一个错误。大多数情况下是因为 torrent 文件已经损坏,或者根本就不是一个 torrent 文件。\n"
+"%1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr "载入 torrent 文件时发生了一个错误。大多数情况下是因为 torrent 文件已经损坏,或者根本就不是一个 torrent 文件。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+msgid "Unable to create %1 : %2"
+msgstr "无法创建 %1:%2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "您已经下载种子 %1"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "无法迁移 %1:%2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "选择保存到的文件夹"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "没有开始"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "做种中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "下载中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "失速"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "停止"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "错误:"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "正分配磁盘空间"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "已排队"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "正检查数据"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr "下载已停止。设备上没有剩余空间。"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr "您没有下载种子任务所需的足够磁盘空间。您确认想要继续吗?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy, c-format
+msgid "Insufficient disk space for %1"
+msgstr "正分配磁盘空间"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "达到了最大共享率限制。"
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "停止 torrent %1 出错:%2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "启动 torrent %1 出错:%2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr "发布"
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "未知的客户端"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "%n 个连接"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "无法创建文件 %1:%2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "向 DND 文件写入第一个块失败:%1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "向 DND 文件写入最后一个块失败:%1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr "无法以写模式打开 %1:只读文件系统"
+
+#: libktorrent/torrent/cachefile.cpp:240
+msgid "Cannot expand file %1 : %2"
+msgstr "无法展开文件 %1:%2"
+
+#: libktorrent/torrent/cachefile.cpp:242
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "无法展开文件 %1:写入不完整"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "无法展开文件 %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "错误:读操作越过文件 %1 尾部"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "无法从 %1 读取"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "无法写入 %1:%2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "写入 %1 出错"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "无法预先分配磁盘空间:%1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "无法绑定 UDP 端口 %1 或接着的 10 个端口。"
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+msgid "Invalid response from tracker"
+msgstr "来自 tracker 无效的响应"
+
+#: libktorrent/torrent/httptracker.cpp:273
+msgid "Invalid data from tracker"
+msgstr "来自 tracker 无效的数据"
+
+#: libktorrent/torrent/httptracker.cpp:415
+msgid "Invalid tracker URL"
+msgstr "无效的 tracker URL"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "无法打开文件 %1:%2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "无法创建索引文件:%1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "无法打开文件 %1:%2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "使用 UPnP 字段在路由器上转发端口"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "无法在设备描述中找到端口转发服务!"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP 设备"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "自动扫描文件夹中的 torrent 文件并装入它们。"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+msgid "Scan Folder"
+msgstr "扫描文件夹"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "扫描文件夹"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "扫描文件夹选项"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "已装入"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr "Web 界面"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface Options"
+msgstr "Web 界面选项"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr "在默认路径中找不到 php 可执行程序,请手动输入路径"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr "请输入 Web 界面的新密码。"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr "%1 存在且可执行"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+msgid "%1 does not exist"
+msgstr "%1 不存在"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr "%1 不是可执行文件"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr "%1 是目录"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr "%1 不是 php 可执行文件路径"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Web Interface"
+msgstr "Web 界面"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr "允许通过浏览器控制 ktorrent"
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "最先下载"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "正常下载"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "最后下载"
+
+#: plugins/infowidget/fileview.cpp:62
+msgid "Delete File(s)"
+msgstr "删除文件"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "可用"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "推迟"
+
+#: plugins/infowidget/fileview.cpp:343
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr "您将丢失文件中的全部数据,您确定想要这么做吗?"
+
+#: plugins/infowidget/statustab.cpp:55
+msgid "No limit"
+msgstr "无限制"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "信息部件"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr "显示关于下载的额外信息。如已经下载的块、种子数量和吸血虫数量等..."
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "无法将 tracker 添加到私有种子。"
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "无法删除 torrent 默认 tracker。"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "您无法向私有种子添加 trackers。"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "国家"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "客户端"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "已屏蔽"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "已阻止"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "可用性"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "评分"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "上传通道"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "请求"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr "踢出对方"
+
+#: plugins/infowidget/peerview.cpp:250
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "屏蔽对方"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - 可用的块"
+"<br><img src=\"unavailable_color\">&nbsp; - 不可用的块"
+"<br><img src=\"excludec_color\">&nbsp; - 排除的块"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "信息部件选项"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; - 下载块 "
+"<br><img src=\"unavailable_color\">&nbsp; - 要下载的块"
+"<br><img src=\"excluded_color\">&nbsp; - 排除的块"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "转换"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "正在装入文本文件..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "请稍候..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "文件已转换。"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "无法装入过滤器:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "无效的过滤规则。该文件可能已损坏或者格式不对。"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr "根据 IP 地址过滤排除不想接受的对等点"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+msgid "IP Filter"
+msgstr "IP 过滤器"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "状态:已装入且正运行。"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "状态:未装入"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr "状态:<font color=\"#ff0000\">过滤器文件未找到。</font>下载并转换过滤器文件。"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "选中的文件已经存在,您是否想要再下载一遍?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "文件已存在"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "过滤器文件(level1.dat)已经存在,您想要再次转换吗?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IP 屏蔽过滤器"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IP 屏蔽过滤器选项"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+msgid "Statistics"
+msgstr "统计"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr "统计选项"
+
+#: plugins/stats/StatsCon.cc:49
+msgid "Leechers connected"
+msgstr "已连接吸血虫"
+
+#: plugins/stats/StatsCon.cc:50
+msgid "Leechers in swarms"
+msgstr "群集中的吸血虫"
+
+#: plugins/stats/StatsCon.cc:51
+msgid "Seeders connected"
+msgstr "已连接的做种者"
+
+#: plugins/stats/StatsCon.cc:52
+msgid "Seeders in swarms"
+msgstr "群集中的做种者"
+
+#: plugins/stats/StatsCon.cc:53
+msgid "Average connected leechers per torrent"
+msgstr "每个种子平均连接的吸血虫数"
+
+#: plugins/stats/StatsCon.cc:54
+msgid "Average connected seeders per torrent"
+msgstr "每个种子平均连接的吸血虫数"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr "每个运行中种子平均连接的吸血虫数"
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr "每个运行中种子平均连接的吸血虫数"
+
+#: plugins/stats/StatsCon.cc:61
+msgid "Nodes"
+msgstr "结点"
+
+#: plugins/stats/StatsCon.cc:62
+msgid "Tasks"
+msgstr "任务"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr "显示传输统计"
+
+#: plugins/stats/statsplugin.cc:67
+msgid "Speed statistics"
+msgstr "速度统计"
+
+#: plugins/stats/statsplugin.cc:68
+msgid "Connection statistics"
+msgstr "连接统计"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+msgid "Current"
+msgstr "当前"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr "平均"
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+msgid "Limit"
+msgstr "限制"
+
+#: plugins/stats/StatsSpd.cc:71
+msgid "Average from leecher"
+msgstr "来自吸血虫的平均下载速度"
+
+#: plugins/stats/StatsSpd.cc:72
+msgid "Average to leecher"
+msgstr "到吸血虫的平均上传速度"
+
+#: plugins/stats/StatsSpd.cc:73
+msgid "Average from seeder"
+msgstr "来自做种者的平均下载速度"
+
+#: plugins/stats/StatsSpd.cc:74
+msgid "From leechers"
+msgstr "来自吸血虫"
+
+#: plugins/stats/StatsSpd.cc:75
+msgid "From seeders"
+msgstr "来自做种者"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr "图例"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent 文件"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "全部文件"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "无法验证数据:%1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "无法装入 torrent 文件:%1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "导入来自其它客户端的部分或已完成下载的种子数据"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "导入以有下载"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr "种子地址"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr "自动扫描匹配正则表达式的 RSS 种子并装载它们"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr "RSS 种子"
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr "标题"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "描述"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr "链接"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "最大比率:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Time"
+msgstr "时间"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "规划器"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "规划器插件选项"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "周一"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "周二"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "周三"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "周四"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "周五"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "周六"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "周日"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "规划已保存。"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "文件未找到。"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "规划已装入。"
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "带宽规划插件"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "打开带宽规划器。"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr "带宽规划器已禁用。请转到首选项->规划器启用此功能。"
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "日志查看器"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+msgid "Log Viewer"
+msgstr "日志查看器"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr "显示 ktorrent 的日志输出"
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"使用您的 Web 浏览器在您想添加的搜索引擎上来查找字符串 %1 (大写字母),在搜索完成后复制在地址栏中的网址,然后粘贴到此处。"
+"<br>例如在 Google上搜索 %2,将返回 "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8。如果您添加这个网址到此处,ktorrent "
+"可以使用Google进行搜索。"
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "您必须输入搜索引擎的名称和网址"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "一个同名的搜索引擎已经存在。请使用一个不同的名字。"
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr "错误的 URL。您应当使用您的 Internet 浏览器搜索 FOOBAR,并且将 URL 精确复制/粘贴到此处。"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "搜索"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "搜索引擎选项"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "正在搜索 %1 ..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent 文件"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "搜索已完成"
+
+#: plugins/search/searchtab.cpp:65
+msgid " Engine: "
+msgstr " 引擎:"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "在几个流行的 torrent 搜索引擎中搜索 torrents"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "您是想要下载还是保存 torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "下载 Torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "下载"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr "Zeroconf"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr "在本地网络搜索正在运行并分享种子的 ktorrent 对等点"
+
+#~ msgid "ETA algorithm:"
+#~ msgstr "ETA 算法:"
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "无法装入块 %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "Trackers"
+
+#, fuzzy
+#~ msgid "Alt+N"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr "InfoWidget 插件的国家位置。国旗由 http://flags.blogpotato.de/ 荣誉提供。"
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "您必须至少添加一个 tracker。"
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "已下载"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+U"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+A"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+1"
+
+#~ msgid "Max ratio:"
+#~ msgstr "最大比率:"
+
+#~ msgid "Name"
+#~ msgstr "名称"
+
+#~ msgid "Author"
+#~ msgstr "作者"
+
+#~ msgid "IP filter plugin, filters out unwanted peers"
+#~ msgstr "IP 过滤器插件,过滤不受欢迎的端点"
+
+#~ msgid "Shows logging output in a widget"
+#~ msgstr "在部件中显示日志输出"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "下载完成"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "Tracker URL:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "Tracker 状态:"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "指定的 UDP 端口 (%1) 不可用或已经被其它应用程序使用。KTorrent 将绑定到端口 %2。"
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "选择保存到的文件夹"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "下载 %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "上传 %1/%2"
diff --git a/translations/zh_TW/Makefile.am b/translations/zh_TW/Makefile.am
new file mode 100644
index 0000000..b9efc84
--- /dev/null
+++ b/translations/zh_TW/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS= messages
diff --git a/translations/zh_TW/messages/Makefile.am b/translations/zh_TW/messages/Makefile.am
new file mode 100644
index 0000000..c37fe4d
--- /dev/null
+++ b/translations/zh_TW/messages/Makefile.am
@@ -0,0 +1,3 @@
+KDE_LANG = zh_TW
+SUBDIRS = $(AUTODIRS)
+POFILES = AUTO
diff --git a/translations/zh_TW/messages/ktorrent.po b/translations/zh_TW/messages/ktorrent.po
new file mode 100644
index 0000000..82d3a18
--- /dev/null
+++ b/translations/zh_TW/messages/ktorrent.po
@@ -0,0 +1,5052 @@
+# translation of ktorrent.po to Chinese Traditional
+#
+# Frank Weng (a.k.a. Franklin) <franklin at goodhorse dot idv dot tw>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: ktorrent\n"
+"POT-Creation-Date: 2008-04-18 19:40+0200\n"
+"PO-Revision-Date: 2006-08-28 14:39+0800\n"
+"Last-Translator: Frank Weng (a.k.a. Franklin) <franklin at goodhorse dot idv "
+"dot tw>\n"
+"Language-Team: Chinese Traditional <zh-l10n@linux.org.tw>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: apps/ktorrent/ktorrent.cpp:167
+msgid "No incoming connections (possibly firewalled)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 42
+#: apps/ktorrent/ktorrent.cpp:184 rc.cpp:345 rc.cpp:383 rc.cpp:1019
+#, no-c-format
+msgid "Info"
+msgstr "資訊"
+
+#: apps/ktorrent/ktorrent.cpp:185
+msgid "Data transferred during the current session"
+msgstr "目前連線已傳送的資料"
+
+#: apps/ktorrent/ktorrent.cpp:186
+msgid "Current speed of all torrents combined"
+msgstr "所有 torrents 組合的目前速度"
+
+#: apps/ktorrent/groups/groupview.cpp:76 apps/ktorrent/ktorrent.cpp:215
+msgid "Groups"
+msgstr ""
+
+#: apps/ktorrent/ktorrent.cpp:515 apps/ktorrent/ktorrentviewmenu.cpp:41
+msgid ""
+"_: to start\n"
+"Start"
+msgstr "開始"
+
+#: apps/ktorrent/ktorrent.cpp:519 apps/ktorrent/ktorrentviewmenu.cpp:37
+msgid ""
+"_: to stop\n"
+"Stop"
+msgstr "停止"
+
+#: apps/ktorrent/ktorrent.cpp:527 apps/ktorrent/ktorrent.cpp:530
+msgid ""
+"_: to start all\n"
+"Start All"
+msgstr "全部開始"
+
+#: apps/ktorrent/ktorrent.cpp:533 apps/ktorrent/ktorrent.cpp:536
+msgid ""
+"_: to stop all\n"
+"Stop All"
+msgstr "全部停止"
+
+#: apps/ktorrent/ktorrent.cpp:539
+msgid ""
+"_: to paste torrent URL\n"
+"Paste Torrent URL..."
+msgstr "貼上 Torrent 網址..."
+
+#: apps/ktorrent/ktorrent.cpp:543
+msgid ""
+"_: to open Queue Manager\n"
+"Open Queue Manager..."
+msgstr "開啟佇列管理者..."
+
+#: apps/ktorrent/ktorrent.cpp:548 apps/ktorrent/ktorrentviewmenu.cpp:53
+msgid "Enqueue/Dequeue"
+msgstr "加入/移出佇列"
+
+#: apps/ktorrent/ktorrent.cpp:553
+msgid "IPFilter"
+msgstr "IP 過濾器"
+
+#: apps/ktorrent/ktorrent.cpp:558 apps/ktorrent/ktorrentviewmenu.cpp:96
+msgid "Check Data Integrity"
+msgstr "檢查資料完整性"
+
+#: apps/ktorrent/ktorrent.cpp:571
+msgid "Set max upload rate"
+msgstr "設定最大上傳速率"
+
+#: apps/ktorrent/ktorrent.cpp:574
+msgid "Set max download rate"
+msgstr "設定最大下載速率"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "Torrent Files"
+msgstr "Torrent 檔案"
+
+#: apps/ktorrent/ktorrent.cpp:626
+msgid "All Files"
+msgstr "所有檔案"
+
+#: apps/ktorrent/ktorrent.cpp:627
+msgid "Open Location"
+msgstr "開啟位置"
+
+#: apps/ktorrent/ktorrent.cpp:793
+#, fuzzy
+msgid "Speed down: %1 / up: %2"
+msgstr "速度:上傳 %1/下載 %2"
+
+#: apps/ktorrent/ktorrent.cpp:799
+#, fuzzy
+msgid "Transferred down: %1 / up: %2"
+msgstr "已傳輸:上傳 %1/下載 %2"
+
+#: apps/ktorrent/ktorrent.cpp:819
+msgid "DHT: %1 nodes, %2 tasks"
+msgstr "DHT:%1 個節點,%2 個工作"
+
+#: apps/ktorrent/ktorrent.cpp:823
+msgid "DHT: off"
+msgstr "DHT:關閉"
+
+#: apps/ktorrent/fileselectdlg.cpp:284 apps/ktorrent/groups/allgroup.cpp:26
+#: apps/ktorrent/groups/groupmanager.h:54 apps/ktorrent/ktorrent.cpp:962
+#, fuzzy
+msgid "All Torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/filterbar.cpp:52
+msgid "Find:"
+msgstr ""
+
+#: apps/ktorrent/filterbar.cpp:65
+msgid "Case sensitive"
+msgstr ""
+
+#: apps/ktorrent/newui/ddockwindow.cpp:88
+#, fuzzy
+msgid "Move to left dock"
+msgstr "上移(&O)"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:89
+#, fuzzy
+msgid "Move to right dock"
+msgstr "上移(&O)"
+
+#: apps/ktorrent/newui/ddockwindow.cpp:90
+#, fuzzy
+msgid "Move to bottom dock"
+msgstr "上移(&O)"
+
+#: apps/ktorrent/newui/button.cpp:58
+msgid "Assign Accelerator..."
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:60
+msgid "Clear Accelerator"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "Change Button Number"
+msgstr ""
+
+#: apps/ktorrent/newui/button.cpp:319
+msgid "New accelerator number:"
+msgstr ""
+
+#: apps/ktorrent/ipfilterwidget.cpp:72
+msgid ""
+"You must enter IP in format 'XXX.XXX.XXX.XXX'. You can also use wildcards for "
+"ranges like '127.0.0.*'."
+msgstr "您必須以 'XXX.XXX.XXX.XXX' 格式輸入 IP。您可以用萬用字元,如 '127.0.0.*'。"
+
+#: apps/ktorrent/ipfilterwidget.cpp:88
+#: plugins/scheduler/bwsprefpagewidget.cpp:129
+msgid "Choose a file"
+msgstr "選擇一個檔案"
+
+#: apps/ktorrent/ipfilterwidget.cpp:100
+#: plugins/scheduler/bwsprefpagewidget.cpp:119
+msgid "Choose a filename to save under"
+msgstr "選擇要儲存的檔案名稱"
+
+#: apps/ktorrent/pastedialog.cpp:56 plugins/infowidget/trackerview.cpp:78
+#: plugins/search/searchprefpage.cpp:131
+msgid "Malformed URL."
+msgstr "不正確的網址"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 9
+#: apps/ktorrent/groups/downloadgroup.cpp:27
+#: apps/ktorrent/groups/groupmanager.h:57 apps/ktorrent/pref.cpp:147
+#: apps/ktorrent/viewmanager.cpp:62 rc.cpp:138 rc.cpp:342
+#, no-c-format
+msgid "Downloads"
+msgstr "下載"
+
+#: apps/ktorrent/groups/groupmanager.h:60
+#: apps/ktorrent/groups/uploadgroup.cpp:27 apps/ktorrent/viewmanager.cpp:63
+msgid "Uploads"
+msgstr "上傳"
+
+#: apps/ktorrent/ktorrentcore.cpp:115
+#, fuzzy
+msgid ""
+"Specified port (%1) is unavailable or in use by another application. KTorrent "
+"is now using port %2."
+msgstr "指定的連接埠(%1)無法使用,或是正被其他的應用程式使用中。KTorrent 改使用連接埠 %2。"
+
+#: apps/ktorrent/ktorrentcore.cpp:124
+msgid ""
+"KTorrent is unable to accept connections because the ports %1 to %2 are already "
+"in use by another program."
+msgstr ""
+
+#: apps/ktorrent/ktorrentcore.cpp:767
+#, c-format
+msgid "Cannot create torrent: %1"
+msgstr "無法建立 torrent:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1028
+#, fuzzy
+msgid ""
+"Several data files of the torrent \"%1\" are missing, do you want to recreate "
+"them, or do you want to not download them?"
+msgstr "有些 torrent %1 的資料檔不見了。您要重新建立資料檔,還是您不打算下載了?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 apps/ktorrent/ktorrentcore.cpp:1069
+msgid "Recreate"
+msgstr "重建"
+
+#: apps/ktorrent/ktorrentcore.cpp:1031 plugins/infowidget/fileview.cpp:61
+msgid "Do Not Download"
+msgstr "不下載"
+
+#: apps/ktorrent/ktorrentcore.cpp:1041
+#, fuzzy, c-format
+msgid "Cannot recreate missing files: %1"
+msgstr "無法重建檔案:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1042 apps/ktorrent/ktorrentcore.cpp:1056
+#: apps/ktorrent/ktorrentcore.cpp:1062
+msgid "Data files are missing"
+msgstr "資料檔已遺失"
+
+#: apps/ktorrent/ktorrentcore.cpp:1055
+#, fuzzy, c-format
+msgid "Cannot deselect missing files: %1"
+msgstr "無法取消選取檔案:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1068
+#, fuzzy
+msgid ""
+"The file where the data is saved of the torrent \"%1\" is missing, do you want "
+"to recreate it?"
+msgstr "torrent %1 要儲存資料的檔案已遺失。要重建嗎?"
+
+#: apps/ktorrent/ktorrentcore.cpp:1069
+#, fuzzy
+msgid "Do Not Recreate"
+msgstr "重建"
+
+#: apps/ktorrent/ktorrentcore.cpp:1078
+#, fuzzy, c-format
+msgid "Cannot recreate data file: %1"
+msgstr "無法重建資料檔:%1"
+
+#: apps/ktorrent/ktorrentcore.cpp:1079 apps/ktorrent/ktorrentcore.cpp:1085
+msgid "Data file is missing"
+msgstr "資料檔已遺失"
+
+#: apps/ktorrent/ktorrentcore.cpp:1135
+msgid "Checking Data Integrity"
+msgstr "檢查資料完整性"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:153
+#: apps/ktorrent/ktorrentviewitem.cpp:159
+msgid "infinity"
+msgstr "無限制"
+
+#: apps/ktorrent/ktorrentviewitem.cpp:255 plugins/infowidget/fileview.cpp:189
+#: plugins/infowidget/iwfiletreeitem.cpp:95
+msgid "%1 %"
+msgstr "%1 %"
+
+#: apps/ktorrent/scandialog.cpp:70
+#, fuzzy, c-format
+msgid "Error scanning data: %1"
+msgstr "掃描資料時發生錯誤:%1"
+
+#: apps/ktorrent/scandialog.cpp:77
+#, fuzzy
+msgid "Scanning data of <b>%1</b> :"
+msgstr "掃描區塊資料中:"
+
+#: apps/ktorrent/main.cpp:76
+msgid "A BitTorrent program for KDE"
+msgstr "KDE 的 BitTorrent 軟體"
+
+#: apps/ktorrent/main.cpp:108
+msgid "Debug mode"
+msgstr "除錯模式"
+
+#: apps/ktorrent/main.cpp:109
+msgid "Silently save torrent given on URL"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:110
+msgid "Document to open"
+msgstr "要開啟的文件"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 59
+#: apps/ktorrent/main.cpp:120 rc.cpp:553
+#, no-c-format
+msgid "KTorrent"
+msgstr "KTorrent"
+
+#: apps/ktorrent/main.cpp:125
+#, fuzzy
+msgid "RSS Plugin"
+msgstr "外掛程式"
+
+#: apps/ktorrent/main.cpp:126
+#, fuzzy
+msgid "Webinterface Plugin"
+msgstr "一般選項"
+
+#: apps/ktorrent/main.cpp:127
+msgid "Statistics Plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:130
+msgid "Application icon and a couple of others"
+msgstr "應用程式圖示和一些其他的"
+
+#: apps/ktorrent/main.cpp:131
+msgid "The downloads icon"
+msgstr "下載圖示"
+
+#: apps/ktorrent/main.cpp:134
+msgid "1.0 application icon"
+msgstr "1.0 應用程式圖示"
+
+#: apps/ktorrent/main.cpp:139
+msgid "ChunkBar's tooltip and IWFileTreeItem sorting"
+msgstr "區塊列的工具提示及 IWFileTreeItem 排序"
+
+#: apps/ktorrent/main.cpp:143
+msgid ""
+"Country locator for InfoWidget plugin (This product includes GeoLite data "
+"created by MaxMind, available from http://www.maxmind.com/). "
+msgstr ""
+
+#: apps/ktorrent/main.cpp:144
+#, fuzzy
+msgid "Country flags"
+msgstr "國家"
+
+#: apps/ktorrent/main.cpp:145
+msgid "File prioritization"
+msgstr "檔案優先權"
+
+#: apps/ktorrent/main.cpp:146
+msgid "Miniupnp was used as an example for our own UPnP implementation"
+msgstr "Miniupnp 是做為我們自己的 UPnP 實作的範例"
+
+#: apps/ktorrent/main.cpp:147
+msgid "Global max share ratio patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:148 apps/ktorrent/main.cpp:149
+msgid "Zeroconf enhancements"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:150
+msgid "Coldmilk webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:151
+msgid "IDEAl code from KDevelop"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:152
+msgid "Conversion speed improvement in ipfilter plugin"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:153
+msgid "Discovered 2 security vulnerabilities (both are fixed)"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:154
+msgid "Patch to load silently with a save location"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:155
+msgid "Fixes in PHP code of webinterface"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:156
+msgid "XFS specific disk preallocation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:157
+msgid "Patch to not show very low speeds"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:158
+msgid "Patch to show potentially firewalled status"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:159
+#, fuzzy
+msgid "Several patches"
+msgstr "資料夾 1 路徑"
+
+#: apps/ktorrent/main.cpp:160
+msgid "Patch to hide the menubar"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:161
+msgid "Patch to modify file priorities in the webgui"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:162
+#, fuzzy
+msgid "Several webgui patches"
+msgstr "資料夾 1 路徑"
+
+#: apps/ktorrent/main.cpp:163
+#, fuzzy
+msgid "Filterbar patch"
+msgstr "資料夾 1 路徑"
+
+#: apps/ktorrent/main.cpp:164
+msgid "Non threaded fileview update patch"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:165
+msgid "Optimization to SHA1 hash generation"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:166
+msgid "Patch to fix free diskspace calculation on FreeBSD"
+msgstr ""
+
+#: apps/ktorrent/main.cpp:167
+#, fuzzy
+msgid "Patch to load torrents silently from the command line"
+msgstr "是否要安靜地開啟 torrent。"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:64
+msgid "You must select a file or a folder."
+msgstr "您必須選擇檔案或資料夾。"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:71
+#, fuzzy
+msgid ""
+"You have not added a tracker, are you sure you want to create this torrent ?"
+msgstr "若是您取消選擇檔案。您將失去所有檔案中的資料。您確定要這樣做嗎?"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:79
+#, fuzzy
+msgid "You must add at least one node."
+msgstr "您必須至少加入一個追蹤器。"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:98
+msgid "Torrent Files (*.torrent)"
+msgstr "Torrent 檔案 (*.torrent)"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:99
+msgid "Choose File to Save Torrent"
+msgstr "選擇要儲存 Torrent 的檔案"
+
+#: apps/ktorrent/torrentcreatordlg.cpp:108
+msgid "Creating %1..."
+msgstr "建立 %1 中..."
+
+#: apps/ktorrent/groups/groupview.cpp:107
+#, fuzzy
+msgid "Custom Groups"
+msgstr "自訂 IP"
+
+#: apps/ktorrent/groups/groupview.cpp:138
+msgid "New Group"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:141
+#, fuzzy
+msgid "Edit Name"
+msgstr "名稱"
+
+#: apps/ktorrent/groups/groupview.cpp:144
+#, fuzzy
+msgid "Remove Group"
+msgstr "移除追蹤器"
+
+#: apps/ktorrent/groups/groupview.cpp:147
+msgid "Open Tab"
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:159
+msgid "Please enter the group name."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:166
+#: apps/ktorrent/groups/groupview.cpp:217
+msgid "The group %1 already exists."
+msgstr ""
+
+#: apps/ktorrent/groups/groupview.cpp:207
+msgid "Please enter the new group name."
+msgstr ""
+
+#: apps/ktorrent/groups/activeuploadsgroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:90
+#, fuzzy
+msgid "Active uploads"
+msgstr "上傳"
+
+#: apps/ktorrent/groups/groupmanager.h:66
+#: apps/ktorrent/groups/queueduploadsgroup.cpp:29
+#, fuzzy
+msgid "Queued uploads"
+msgstr "已送進佇列"
+
+#: apps/ktorrent/groups/groupmanager.h:63
+#: apps/ktorrent/groups/queueddownloadsgroup.cpp:29
+#, fuzzy
+msgid "Queued downloads"
+msgstr "下載圖示"
+
+#: apps/ktorrent/groups/groupmanager.h:69
+#: apps/ktorrent/groups/userdownloadsgroup.cpp:29
+#, fuzzy
+msgid "User downloads"
+msgstr "下載:"
+
+#: apps/ktorrent/groups/groupmanager.h:72
+#: apps/ktorrent/groups/useruploadsgroup.cpp:29
+#, fuzzy
+msgid "User uploads"
+msgstr "上傳"
+
+#: apps/ktorrent/groups/groupmanager.h:75
+#: apps/ktorrent/groups/inactivegroup.cpp:29
+#, fuzzy
+msgid "Inactive torrents"
+msgstr "建立 Torrent"
+
+#: apps/ktorrent/groups/groupmanager.h:78
+#: apps/ktorrent/groups/inactivedownloadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive downloads"
+msgstr "下載:"
+
+#: apps/ktorrent/groups/groupmanager.h:81
+#: apps/ktorrent/groups/inactiveuploadsgroup.cpp:29
+#, fuzzy
+msgid "Inactive uploads"
+msgstr "上傳"
+
+#: apps/ktorrent/groups/activegroup.cpp:29
+#: apps/ktorrent/groups/groupmanager.h:84
+#, fuzzy
+msgid "Active torrents"
+msgstr "Torrent"
+
+#: apps/ktorrent/groups/activedownloadsgroup.cpp:28
+#: apps/ktorrent/groups/groupmanager.h:87
+#, fuzzy
+msgid "Active downloads"
+msgstr "下載:"
+
+#: apps/ktorrent/ktorrentview.cpp:397 apps/ktorrent/ktorrentviewmenu.cpp:45
+#, fuzzy
+msgid "Remove Torrent"
+msgstr "建立 Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:49
+#, fuzzy
+msgid "Remove Torrent and Data"
+msgstr "建立 Torrent"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:59
+#, fuzzy
+msgid "Add Peers"
+msgstr "新增端點:"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:63
+msgid "Additional Peer Sources"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:64
+msgid "Torrent Peer Sources:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 85
+#: apps/ktorrent/ktorrentviewmenu.cpp:66 plugins/infowidget/peerview.cpp:221
+#: rc.cpp:77 rc.cpp:1256 rc.cpp:1307
+#, no-c-format
+msgid "DHT"
+msgstr "DHT"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:67
+msgid "Peer Exchange"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:72
+msgid "Manual Announce"
+msgstr "手動宣告"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:76 plugins/infowidget/fileview.cpp:50
+msgid "Preview"
+msgstr "預覽"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:81
+msgid "Open Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:82
+msgid "Data Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:84
+msgid "Temporary Directory"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:87
+#, fuzzy
+msgid "Set Download Location"
+msgstr "下載圖示"
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:90
+msgid "Remove From Group"
+msgstr ""
+
+#: apps/ktorrent/ktorrentviewmenu.cpp:93
+#, fuzzy
+msgid "Add to Group"
+msgstr "自訂 IP"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 16
+#: apps/ktorrent/ktorrentviewmenu.cpp:100 rc.cpp:147
+#, fuzzy, no-c-format
+msgid "Speed Limits"
+msgstr "速度限制,以 KB/s 為單位"
+
+#: apps/ktorrent/addpeerwidget.cpp:67
+msgid "Torrent does not exist. Report this bug to KTorrent developers."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:102
+msgid "Potential peer added."
+msgstr ""
+
+#: apps/ktorrent/addpeerwidget.cpp:106
+#, fuzzy
+msgid "Malformed IP address."
+msgstr "端點 IP 位址"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 311
+#: apps/ktorrent/pref.cpp:58 rc.cpp:282
+#, no-c-format
+msgid "Preferences"
+msgstr "喜好設定"
+
+#: apps/ktorrent/pref.cpp:147
+msgid "Download Options"
+msgstr "下載選項"
+
+#: apps/ktorrent/pref.cpp:179 apps/ktorrent/pref.cpp:294
+#, fuzzy
+msgid "The DHT port needs to be different from the UDP tracker port!"
+msgstr "DHT 連接埠需要跟 UDP 追蹤器的連接埠不同。"
+
+#: apps/ktorrent/pref.cpp:216
+msgid "General"
+msgstr "一般"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 16
+#: apps/ktorrent/pref.cpp:216 rc.cpp:57
+#, no-c-format
+msgid "General Options"
+msgstr "一般選項"
+
+#: apps/ktorrent/pref.cpp:283
+msgid ""
+"Cannot lookup %1: %2\n"
+"Please provide a valid IP address or hostname."
+msgstr ""
+"無法找到 %1:%2。\n"
+"請提供合法的 IP 位址或主機名稱。"
+
+#: apps/ktorrent/pref.cpp:411
+msgid "Advanced"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 27
+#: apps/ktorrent/pref.cpp:411 rc.cpp:540
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "掃描資料夾選項"
+
+#: apps/ktorrent/ktorrentview.cpp:132
+msgid "Visible columns"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 16
+#: apps/ktorrent/ktorrentview.cpp:135
+#: plugins/infowidget/infowidgetplugin.cpp:76 rc.cpp:1016
+#, no-c-format
+msgid "Status"
+msgstr "狀態"
+
+#: apps/ktorrent/ktorrentview.cpp:136 plugins/infowidget/peerview.cpp:225
+msgid "Downloaded"
+msgstr "已下載"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 149
+#: apps/ktorrent/ktorrentview.cpp:137 plugins/infowidget/fileview.cpp:48
+#: rc.cpp:24
+#, no-c-format
+msgid "Size"
+msgstr "大小"
+
+#: apps/ktorrent/ktorrentview.cpp:138 plugins/infowidget/peerview.cpp:226
+msgid "Uploaded"
+msgstr "已上傳"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 313
+#: apps/ktorrent/ktorrentview.cpp:139 plugins/infowidget/peerview.cpp:216
+#: rc.cpp:1010
+#, no-c-format
+msgid "Down Speed"
+msgstr "下載速度"
+
+#: apps/ktorrent/ktorrentview.cpp:140 plugins/infowidget/peerview.cpp:217
+msgid "Up Speed"
+msgstr "上傳速度"
+
+#: apps/ktorrent/ktorrentview.cpp:141
+msgid "Time Left"
+msgstr "剩餘時間"
+
+#: apps/ktorrent/ktorrentview.cpp:142
+#, fuzzy
+msgid "Seeders"
+msgstr "傳送者:"
+
+#: apps/ktorrent/ktorrentview.cpp:143
+#, fuzzy
+msgid "Leechers"
+msgstr "接收者:"
+
+#: apps/ktorrent/ktorrentview.cpp:144 plugins/infowidget/fileview.cpp:51
+msgid "% Complete"
+msgstr "% 完成"
+
+#: apps/ktorrent/ktorrentview.cpp:145
+#, fuzzy
+msgid "Share Ratio"
+msgstr "分享比例:"
+
+#: apps/ktorrent/ktorrentview.cpp:146
+#, fuzzy
+msgid "Time Downloaded"
+msgstr "已下載"
+
+#: apps/ktorrent/ktorrentview.cpp:147
+#, fuzzy
+msgid "Time Seeded"
+msgstr "剩餘時間"
+
+#: apps/ktorrent/ktorrentview.cpp:203 apps/ktorrent/ktorrentview.cpp:551
+#: apps/ktorrent/ktorrentview.cpp:877
+#, fuzzy
+msgid "All Torrents %1/%2"
+msgstr "Torrent"
+
+#: apps/ktorrent/ktorrentview.cpp:283
+#, c-format
+msgid ""
+"_n: Cannot start more than 1 download, \n"
+"Cannot start more than %n downloads, "
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:285
+#, fuzzy, c-format
+msgid ""
+"_n: and 1 seed. \n"
+"and %n seeds. "
+msgstr "%n 個端點"
+
+#: apps/ktorrent/ktorrentview.cpp:286 apps/ktorrent/trayicon.cpp:258
+msgid "Go to Settings -> Configure KTorrent, if you want to change the limits."
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:375
+msgid ""
+"The torrent %1 has not finished downloading, do you want to delete the "
+"incomplete data, too?"
+msgstr "Torrent %1 尚未完成下載,您要同時刪除未完成的資料嗎?"
+
+#: apps/ktorrent/ktorrentview.cpp:378
+msgid "Remove Download"
+msgstr "移除下載"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+#, fuzzy
+msgid "Delete Data"
+msgstr "載入後刪除(&G)"
+
+#: apps/ktorrent/ktorrentview.cpp:379
+msgid "Keep Data"
+msgstr ""
+
+#: apps/ktorrent/ktorrentview.cpp:395
+#, fuzzy
+msgid ""
+"You will lose all the downloaded data. Are you sure you want to do this?"
+msgstr "若是您取消選擇檔案。您將失去所有檔案中的資料。您確定要這樣做嗎?"
+
+#: apps/ktorrent/ktorrentview.cpp:631
+#, fuzzy
+msgid "You are already checking the data of the torrent %1 !"
+msgstr "您要下載還是儲存此 torrent?"
+
+#: apps/ktorrent/ktorrentview.cpp:751
+#, fuzzy, c-format
+msgid "Choose download location for %1"
+msgstr "下載圖示"
+
+#: apps/ktorrent/fileselectdlg.cpp:120
+msgid ""
+"You have deselected the following existing files. You will lose all data in "
+"these files, are you sure you want to do this ?"
+msgstr "您已取消選擇以下的檔案。您將失去所有這些檔案的資料。您確定要這樣做嗎?"
+
+#: apps/ktorrent/fileselectdlg.cpp:124
+msgid "Yes, delete the files"
+msgstr "是的,請刪除這些檔案"
+
+#: apps/ktorrent/fileselectdlg.cpp:125
+msgid "No, keep the files"
+msgstr "不要,請保留這些檔案"
+
+#: apps/ktorrent/fileselectdlg.cpp:220
+msgid " short!"
+msgstr ""
+
+#: apps/ktorrent/queuedialog.cpp:73
+msgid "User"
+msgstr "使用者"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 24
+#: apps/ktorrent/queuedialog.cpp:75 rc.cpp:249
+#, no-c-format
+msgid "Queue Manager"
+msgstr "佇列管理員"
+
+#: apps/ktorrent/queuedialog.cpp:305 apps/ktorrent/queuedialog.cpp:326
+msgid "No (private torrent)"
+msgstr "無(私密 Torrent)"
+
+#: apps/ktorrent/trayicon.cpp:90
+#, fuzzy
+msgid ""
+"<table cellpadding='2' cellspacing='2' align='center'>"
+"<tr>"
+"<td><b>Speed:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%1</font></td>"
+"<td>Upload: <font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>Transfer:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>Download: <font color='#1c9a1c'>%3</font></td>"
+"<td>Upload: <font color='#990000'>%4</font></td></tr></table>"
+msgstr ""
+"<center><b>KTorrent</b></center><table cellpadding='2' cellspacing='2' "
+"align='center'>"
+"<tr>"
+"<td><b>速度:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>下載:<font color='#1c9a1c'>%1</font></td>"
+"<td>上傳:<font color='#990000'>%2</font></td></tr>"
+"<tr>"
+"<td><b>傳輸:</b></td>"
+"<td></td></tr>"
+"<tr>"
+"<td>下載:<font color='#1c9a1c'>%3</font></td>"
+"<td>上傳:<font color='#990000'>%4</font></td></tr></table>"
+
+#: apps/ktorrent/trayicon.cpp:147
+msgid "<b>%1</b> has completed downloading.<br>Average speed: %2 DL / %3 UL."
+msgstr "<b>%1</b> 已完成下載。<br>平均速度:%2 下載/%3 上傳。"
+
+#: apps/ktorrent/trayicon.cpp:153 libktorrent/torrent/torrentcontrol.cpp:1366
+msgid "Download completed"
+msgstr "已完成下載"
+
+#: apps/ktorrent/trayicon.cpp:165
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:172 apps/ktorrent/trayicon.cpp:191
+#: libktorrent/torrent/torrentcontrol.cpp:1368
+#, fuzzy
+msgid "Seeding completed"
+msgstr "已完成下載"
+
+#: apps/ktorrent/trayicon.cpp:184
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and has been stopped."
+"<br>Uploaded %3 at an average speed of %4."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:200
+msgid "<b>%1</b> has been stopped with the following error: <br>%2"
+msgstr "<b>%1</b> 已停止,因為發生錯誤:<br>%2"
+
+#: apps/ktorrent/trayicon.cpp:212
+msgid ""
+"Corrupted data has been found in the torrent <b>%1</b>"
+"<br>It would be a good idea to do a data integrity check on the torrent."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:229
+msgid ""
+"<b>%1</b> has reached its maximum share ratio of %2 and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:232
+msgid ""
+"<b>%1</b> has reached its maximum seed time of %2 hours and cannot be enqueued. "
+"Remove the limit manually if you want to continue seeding."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:235
+msgid "Torrent cannot be enqueued."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:243
+#, fuzzy
+msgid "Cannot start <b>%1</b> : <br>"
+msgstr "掃描區塊資料中:"
+
+#: apps/ktorrent/trayicon.cpp:251
+#, c-format
+msgid ""
+"_n: Cannot seed more than 1 torrent. "
+"<br>\n"
+"Cannot seed more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:256
+#, c-format
+msgid ""
+"_n: Cannot download more than 1 torrent. "
+"<br>\n"
+"Cannot download more than %n torrents. "
+"<br>"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:259 apps/ktorrent/trayicon.cpp:263
+msgid "Torrent cannot be started"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:262
+msgid "There is not enough diskspace available."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:277
+msgid ""
+"Your disk is running out of space.<br /><b>%1</b> is being downloaded to '%2'."
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:280
+msgid "Torrent has been stopped.<br />"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:282
+msgid "Device running out of space"
+msgstr ""
+
+#: apps/ktorrent/trayicon.cpp:301
+msgid "Speed limit in KB/s"
+msgstr "速度限制,以 KB/s 為單位"
+
+#: apps/ktorrent/trayicon.cpp:304 apps/ktorrent/trayicon.cpp:306
+#: apps/ktorrent/trayicon.cpp:359
+msgid "Unlimited"
+msgstr "沒有限制"
+
+#: apps/ktorrent/speedlimitsdlg.cpp:36
+#, fuzzy
+msgid "Speed limits for <b>%1</b>:"
+msgstr "速度限制,以 KB/s 為單位"
+
+#: apps/ktupnptest/main.cpp:35
+msgid "A KDE KPart Application"
+msgstr "KDE KPart 應用程式"
+
+#: apps/ktupnptest/main.cpp:51
+msgid "KTUPnPTest"
+msgstr "KTUPnPTest"
+
+#: apps/ktcachecheck/cachechecker.cpp:47 apps/ktcachecheck/cachechecker.cpp:76
+#: libktorrent/torrent/chunkmanager.cpp:207
+#: libktorrent/torrent/chunkmanager.cpp:432
+msgid "Cannot open index file %1 : %2"
+msgstr "無法開啟索引檔 %1:%2"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Frank Weng (a.k.a. Franklin)"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "franklin at goodhorse dot idv dot tw"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Select Which Files You Want to Download"
+msgstr "選擇您要下載的檔案"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 35
+#: rc.cpp:6
+#, fuzzy, no-c-format
+msgid "Download to:"
+msgstr "下載"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 74
+#: rc.cpp:9
+#, no-c-format
+msgid "Group:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 97
+#: rc.cpp:12
+#, fuzzy, no-c-format
+msgid "&User controlled"
+msgstr "使用者控制(&U)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 116
+#: rc.cpp:15
+#, fuzzy, no-c-format
+msgid "Start torrent"
+msgstr "開始 Torrent(&G)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 160
+#: plugins/infowidget/fileview.cpp:49 rc.cpp:27 rc.cpp:1244 rc.cpp:1259
+#: rc.cpp:1349 rc.cpp:1439
+#, no-c-format
+msgid "Download"
+msgstr "下載"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 181
+#: rc.cpp:30
+#, no-c-format
+msgid "Select &All"
+msgstr "全選(&A)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 189
+#: rc.cpp:33
+#, no-c-format
+msgid "Select &None"
+msgstr "全不選(&N)"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 197
+#: rc.cpp:36
+#, no-c-format
+msgid "Invert Selection"
+msgstr "反向選擇"
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 224
+#: rc.cpp:39
+#, no-c-format
+msgid "Disk space"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 260
+#: rc.cpp:42
+#, no-c-format
+msgid "Required disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 268
+#: rc.cpp:45
+#, no-c-format
+msgid "Free disk space:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/fileselectdlgbase.ui line 276
+#: rc.cpp:48
+#, fuzzy, no-c-format
+msgid "After download:"
+msgstr "下載:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 44
+#: rc.cpp:60
+#, no-c-format
+msgid "Encryption"
+msgstr "加密"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 58
+#: rc.cpp:64 rc.cpp:787
+#, no-c-format
+msgid "Use protocol encryption"
+msgstr "使用協定加密"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 64
+#: rc.cpp:68
+#, no-c-format
+msgid ""
+"Protocol encryption is used to prevent ISP's from slowing down bittorrent "
+"connections."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 72
+#: rc.cpp:71 rc.cpp:790
+#, no-c-format
+msgid "Allow unencrypted connections"
+msgstr "允許未加密的連線"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 75
+#: rc.cpp:74
+#, no-c-format
+msgid ""
+"If unchecked, you'll be able to connect only to clients supporting encryption."
+msgstr "如果取消勾選的話,您就只能與支援加密的客戶端連線。"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 88
+#: rc.cpp:80
+#, no-c-format
+msgid ""
+"<b>D</b>istributed <b>H</b>ash <b>T</b>able protocol."
+"<br>Decentralized peers exchange protocol. See manual for more info."
+msgstr ""
+"分散雜湊表(<b>D</b>istributed <b>H</b>ash <b>T</b>able)協定。"
+"<br> 分散式端點交換協定。詳情請參考手冊。"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 99
+#: rc.cpp:83
+#, no-c-format
+msgid "&Use DHT to get additional peers"
+msgstr "使用 DHT 取得額外的端點(&U)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 118
+#: rc.cpp:87
+#, no-c-format
+msgid "UDP port for DHT communication:"
+msgstr "DHT 溝通使用的 UDP 連接埠:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 161
+#: rc.cpp:90
+#, no-c-format
+msgid "Custom IP"
+msgstr "自訂 IP"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 172
+#: rc.cpp:93
+#, fuzzy, no-c-format
+msgid "Se&nd the tracker a custom IP address or hostname"
+msgstr "傳送自訂 IP 或主機名稱給追蹤器(&N)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 188
+#: rc.cpp:96
+#, fuzzy, no-c-format
+msgid "Custom IP address or hostname:"
+msgstr "自訂 IP 或主機名稱:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 205
+#: rc.cpp:99
+#, fuzzy, no-c-format
+msgid "System Tray Icon"
+msgstr "顯示系統匣圖示(&Y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 216
+#: rc.cpp:102
+#, no-c-format
+msgid "Show s&ystem tray icon"
+msgstr "顯示系統匣圖示(&Y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 224
+#: rc.cpp:105
+#, fuzzy, no-c-format
+msgid "Show speed &bar in tray icon"
+msgstr "顯示系統匣圖示(&Y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 232
+#: rc.cpp:108
+#, fuzzy, no-c-format
+msgid "Show system tray popup messages"
+msgstr "顯示系統匣圖示(&Y)"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 251
+#: rc.cpp:112
+#, no-c-format
+msgid "Upload bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 276
+#: rc.cpp:115
+#, no-c-format
+msgid "Download bandwidth (in KB/sec):"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 305
+#: rc.cpp:118
+#, no-c-format
+msgid "Folders"
+msgstr "資料夾"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 324
+#: rc.cpp:121
+#, no-c-format
+msgid "Folder to store temporary files:"
+msgstr "儲存暫存檔的資料夾:"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 342
+#: rc.cpp:124
+#, fuzzy, no-c-format
+msgid "Move completed downloads to:"
+msgstr "不要下載"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 353
+#: rc.cpp:128
+#, no-c-format
+msgid "&Automatically save downloads to:"
+msgstr "自動儲存下載到(&A):"
+
+#. i18n: file ./apps/ktorrent/generalpref.ui line 395
+#: rc.cpp:131
+#, fuzzy, no-c-format
+msgid "Copy .torrent files to:"
+msgstr "torrent 檔案"
+
+#. i18n: file ./apps/ktorrent/ktorrentui.rc line 34
+#: rc.cpp:144
+#, no-c-format
+msgid "Download Toolbar"
+msgstr "下載工具列"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 27
+#: rc.cpp:150
+#, fuzzy, no-c-format
+msgid "Set the speed limits for torrent"
+msgstr "開始 Torrent(&G)"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 51
+#: rc.cpp:153
+#, fuzzy, no-c-format
+msgid "Max upload rate:"
+msgstr "最大上傳速率:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 59
+#: rc.cpp:156
+#, fuzzy, no-c-format
+msgid "Max download rate:"
+msgstr "最大下載速率:"
+
+#. i18n: file ./apps/ktorrent/speedlimitsdlgbase.ui line 97
+#: rc.cpp:159 rc.cpp:162
+#, fuzzy, no-c-format
+msgid "KB/s (0 is no limit)"
+msgstr "KB/秒(0 表示不限制)"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 16
+#: rc.cpp:171
+#, no-c-format
+msgid "Add potential peer"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 35
+#: rc.cpp:174
+#, fuzzy, no-c-format
+msgid "Peer IP:"
+msgstr "端點"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 43
+#: rc.cpp:177 rc.cpp:208
+#, no-c-format
+msgid "127.0.0.1"
+msgstr "127.0.0.1"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 51
+#: rc.cpp:180 rc.cpp:288 rc.cpp:525 rc.cpp:931
+#, no-c-format
+msgid "Port:"
+msgstr "連接埠:"
+
+#. i18n: file ./apps/ktorrent/addpeerwidgetbase.ui line 100
+#: rc.cpp:183
+#, no-c-format
+msgid "Enter peer IP and port."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 16
+#: rc.cpp:193
+#, no-c-format
+msgid "KTorrent Blacklist"
+msgstr "KTorrent 黑名單"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 30
+#: rc.cpp:196
+#, no-c-format
+msgid ""
+"Note: Blacklist applies to current session only. Use save/open to save your "
+"entries or use IPFilter plugin (PeerGuardian)."
+msgstr "注意:黑名單只會套用到目前的工作階段。用「儲存」來儲存,或是用 IPFilter 外掛程式(PeerGuardian)。"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 41
+#: rc.cpp:199
+#, no-c-format
+msgid "Banned Peers"
+msgstr "被拒的端點"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 50
+#: rc.cpp:202
+#, no-c-format
+msgid "Peer IP address"
+msgstr "端點 IP 位址"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 96
+#: rc.cpp:205
+#, no-c-format
+msgid "Add peer:"
+msgstr "新增端點:"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 134
+#: rc.cpp:215
+#, no-c-format
+msgid "Adds a peer to blacklist"
+msgstr "將端點加入黑名單"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 168
+#: rc.cpp:222
+#, no-c-format
+msgid "Removes selected peer from blacklist"
+msgstr "從黑名單中移除所選的端點"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 176
+#: rc.cpp:225
+#, no-c-format
+msgid "C&lear"
+msgstr "清除(&L)"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 182
+#: rc.cpp:228
+#, no-c-format
+msgid "Clears this list"
+msgstr "清除此清單"
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 218
+#: rc.cpp:234
+#, no-c-format
+msgid "Save &As..."
+msgstr "另存為(&A)..."
+
+#. i18n: file ./apps/ktorrent/ipfilterwidgetbase.ui line 224
+#: rc.cpp:237
+#, no-c-format
+msgid "Save this blacklist to use with KTorrent IPFilter plugin"
+msgstr "儲存此黑名單,以便在 KTorrent IPFilter 外掛程式中使用"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 59
+#: rc.cpp:252
+#, no-c-format
+msgid "Maximum downloads:"
+msgstr "最大下載數:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 86
+#: rc.cpp:255
+#, no-c-format
+msgid "Maximum seeds:"
+msgstr "最大 seed 數:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 94
+#: rc.cpp:258
+#, no-c-format
+msgid "Start download on low disk space :"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 102
+#: rc.cpp:261
+#, fuzzy, no-c-format
+msgid "Minimum disk space:"
+msgstr "配置磁碟空間"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 140
+#: rc.cpp:264
+#, fuzzy, no-c-format
+msgid "Don't start"
+msgstr "未開始"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 145
+#: rc.cpp:267
+#, no-c-format
+msgid "Always ask"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 150
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Force start"
+msgstr "未開始"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 208
+#: rc.cpp:273
+#, no-c-format
+msgid "MB"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 236
+#: rc.cpp:276 rc.cpp:279 rc.cpp:312 rc.cpp:315 rc.cpp:324
+#, no-c-format
+msgid "(0 is no limit)"
+msgstr "(0 表示不限制)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 330
+#: rc.cpp:285
+#, no-c-format
+msgid "Maximum download rate:"
+msgstr "最大下載速率:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 346
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Global connection limit:"
+msgstr "全域連線限制"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 354
+#: rc.cpp:294
+#, fuzzy, no-c-format
+msgid "Max seed time:"
+msgstr "分享比例:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 370
+#: rc.cpp:297
+#, no-c-format
+msgid "Maximum connections per torrent:"
+msgstr "每個 torrent 最大連線數:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 397
+#: rc.cpp:300
+#, no-c-format
+msgid "Number of upload slots:"
+msgstr "上傳槽的數量:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 405
+#: rc.cpp:303
+#, no-c-format
+msgid "UDP tracker port:"
+msgstr "UDP 追蹤器連接埠:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 413
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Max share ratio:"
+msgstr "分享比例:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 421
+#: rc.cpp:309
+#, no-c-format
+msgid "Maximum upload rate:"
+msgstr "最大上傳速率:"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 576
+#: rc.cpp:318 rc.cpp:321
+#, no-c-format
+msgid "KB/sec (0 is no limit)"
+msgstr "KB/秒(0 表示不限制)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 651
+#: rc.cpp:327
+#, fuzzy, no-c-format
+msgid "Hours (0 is no limit)"
+msgstr "(0 表示不限制)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 663
+#: rc.cpp:330
+#, no-c-format
+msgid "&Keep seeding after download is finished"
+msgstr "下載完成後仍保留 seed(&K)"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 674
+#: rc.cpp:333
+#, no-c-format
+msgid "Attention"
+msgstr "注意"
+
+#. i18n: file ./apps/ktorrent/downloadpref.ui line 685
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid ""
+"The above ports must also be forwarded if you are behind a router. The UPnP "
+"plugin can do this for you."
+msgstr "若您在路由器後面,則以上的連接埠必須經過轉接。UPnP 外掛程式可以為您做這個工作。"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "KT Queue Dialog"
+msgstr "KT 佇列對話框"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 69
+#: rc.cpp:348 rc.cpp:386 rc.cpp:1107
+#, no-c-format
+msgid "Status:"
+msgstr "狀態:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 85
+#: rc.cpp:351 rc.cpp:389 rc.cpp:1808
+#, no-c-format
+msgid "Tracker:"
+msgstr "追蹤器:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 93
+#: rc.cpp:354 rc.cpp:392 rc.cpp:1805
+#, no-c-format
+msgid "DHT:"
+msgstr "DHT:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 109
+#: rc.cpp:357 rc.cpp:395 rc.cpp:1061
+#, no-c-format
+msgid "Share ratio:"
+msgstr "分享比例:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 117
+#: rc.cpp:360
+#, no-c-format
+msgid "Bytes left:"
+msgstr "剩餘位元組:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 177
+#: rc.cpp:368 rc.cpp:377
+#, no-c-format
+msgid "Torrent"
+msgstr "Torrent"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 188
+#: rc.cpp:371 rc.cpp:380
+#, no-c-format
+msgid "Controlled by"
+msgstr "控制者:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 214
+#: rc.cpp:374
+#, no-c-format
+msgid "Upload&s"
+msgstr "上傳(&S)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 333
+#: rc.cpp:398
+#, no-c-format
+msgid "Uploaded:"
+msgstr "已上傳:"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 486
+#: rc.cpp:406
+#, no-c-format
+msgid "M&ove up"
+msgstr "上移(&O)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 494
+#: rc.cpp:409
+#, no-c-format
+msgid "Move dow&n"
+msgstr "下移(&N)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 519
+#: rc.cpp:412
+#, fuzzy, no-c-format
+msgid "Move to top"
+msgstr "上移(&O)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 530
+#: rc.cpp:416
+#, no-c-format
+msgid "Move to &bottom"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 555
+#: rc.cpp:419
+#, no-c-format
+msgid "&QM Controlled"
+msgstr "佇列管理員控制(&Q)"
+
+#. i18n: file ./apps/ktorrent/queuedlg.ui line 563
+#: rc.cpp:422
+#, no-c-format
+msgid "&User Controlled"
+msgstr "使用者控制(&U)"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 30
+#: rc.cpp:434
+#, no-c-format
+msgid "Paste URL"
+msgstr "貼上網址"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 52
+#: rc.cpp:437 rc.cpp:1104 rc.cpp:1919
+#, no-c-format
+msgid "URL:"
+msgstr "網址:"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 106
+#: rc.cpp:440
+#, no-c-format
+msgid "O&K"
+msgstr "確定(&K)"
+
+#. i18n: file ./apps/ktorrent/pastedlgbase.ui line 114
+#: rc.cpp:443 rc.cpp:675 rc.cpp:1176
+#, no-c-format
+msgid "C&ancel"
+msgstr "取消(&A)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 16
+#: rc.cpp:446
+#, no-c-format
+msgid "Create Torrent"
+msgstr "建立 Torrent"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 38
+#: rc.cpp:449
+#, no-c-format
+msgid "The file or folder of which you want to create a torrent:"
+msgstr "您要建立 Torrent 的檔案或資料夾:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 53
+#: rc.cpp:452
+#, fuzzy, no-c-format
+msgid "You must add at least one tracker or node."
+msgstr "您必須至少加入一個追蹤器。"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 61
+#: rc.cpp:455
+#, no-c-format
+msgid "File Options"
+msgstr "檔案選項"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 80
+#: rc.cpp:458
+#, no-c-format
+msgid "Size of each chunk:"
+msgstr "區塊大小:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 86
+#: rc.cpp:461
+#, no-c-format
+msgid "32"
+msgstr "32"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 91
+#: rc.cpp:464
+#, no-c-format
+msgid "64"
+msgstr "64"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 96
+#: rc.cpp:467
+#, no-c-format
+msgid "128"
+msgstr "128"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 101
+#: rc.cpp:470
+#, no-c-format
+msgid "256"
+msgstr "256"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 106
+#: rc.cpp:473
+#, no-c-format
+msgid "512"
+msgstr "512"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 111
+#: rc.cpp:476
+#, no-c-format
+msgid "1024"
+msgstr "1024"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 116
+#: rc.cpp:479
+#, no-c-format
+msgid "2048"
+msgstr "2048"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 121
+#: rc.cpp:482
+#, no-c-format
+msgid "4096"
+msgstr "4096"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 126
+#: rc.cpp:485
+#, no-c-format
+msgid "8192"
+msgstr "8192"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 138
+#: rc.cpp:488 rc.cpp:633
+#, no-c-format
+msgid "KB"
+msgstr "KB"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 165
+#: rc.cpp:491
+#, no-c-format
+msgid "Start seedin&g the torrent"
+msgstr "開始 Torrent(&G)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 176
+#: rc.cpp:494
+#, no-c-format
+msgid "Decentrali&zed (DHT only)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 184
+#: rc.cpp:497
+#, no-c-format
+msgid "Private torrent (DHT not allowed)"
+msgstr "私密 Torrent(不允許 DHT)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 202
+#: rc.cpp:500
+#, no-c-format
+msgid "Comments:"
+msgstr "註解:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 248
+#: rc.cpp:503
+#, fuzzy, no-c-format
+msgid "&Create"
+msgstr "建立(&A)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 262
+#: rc.cpp:506 rc.cpp:1325
+#, no-c-format
+msgid "Ca&ncel"
+msgstr "取消(&N)"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 275
+#: plugins/infowidget/infowidgetplugin.cpp:214 rc.cpp:509 rc.cpp:1101
+#, no-c-format
+msgid "Trackers"
+msgstr "追蹤器"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 283
+#: rc.cpp:512
+#, no-c-format
+msgid "DHT nodes"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 333
+#: rc.cpp:522
+#, fuzzy, no-c-format
+msgid "Node:"
+msgstr "無"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 385
+#: rc.cpp:528
+#, fuzzy, no-c-format
+msgid "IP or hostname"
+msgstr "自訂 IP 或主機名稱:"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 396
+#: rc.cpp:531 rc.cpp:718 rc.cpp:721
+#, no-c-format
+msgid "Port"
+msgstr "連接埠"
+
+#. i18n: file ./apps/ktorrent/torrentcreatordlgbase.ui line 437
+#: rc.cpp:534
+#, no-c-format
+msgid ""
+"NOTE: Some known good DHT nodes are already inserted. You should probably "
+"insert your own IP address and port too if you plan to seed this torrent."
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 16
+#: rc.cpp:537
+#, fuzzy, no-c-format
+msgid "Advanced Preferences"
+msgstr "搜尋喜好設定"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 46
+#: rc.cpp:543
+#, no-c-format
+msgid "Time left estimation algorithm:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 53
+#: rc.cpp:546 rc.cpp:568
+#, no-c-format
+msgid ""
+"<b>KTorrent algorithm:</b> Default algorithm using combination of other "
+"algorithms based on our tests."
+"<br>\n"
+"<b>Current speed algorithm:</b> Simplest algorithm - BytesLeft/CurrentSpeed"
+"<br>\n"
+"<b>Global average speed algorithm:</b> BytesLeft/AverageSpeed"
+"<br>\n"
+"<b>Window of X algorithm:</b> ET calculated from X speed samples"
+"<br>\n"
+"<b>Moving average algorithm:</b> Moving average speed calculated from X samples"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 64
+#: rc.cpp:556
+#, fuzzy, no-c-format
+msgid "Current speed"
+msgstr "目前的搜尋引擎"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 69
+#: rc.cpp:559
+#, no-c-format
+msgid "Global average speed"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 74
+#: rc.cpp:562
+#, no-c-format
+msgid "Window of X"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 79
+#: rc.cpp:565
+#, no-c-format
+msgid "Moving average"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 98
+#: rc.cpp:575
+#, no-c-format
+msgid "(takes effect after restart)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 125
+#: rc.cpp:578
+#, no-c-format
+msgid "Disa&ble diskspace preallocation"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 141
+#: rc.cpp:581
+#, no-c-format
+msgid "F&ully preallocate diskspace (avoids fragmentation)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 147
+#: rc.cpp:584
+#, no-c-format
+msgid "Basic (slow)"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 152
+#: rc.cpp:587
+#, no-c-format
+msgid "Filesystem specific"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 174
+#: rc.cpp:590
+#, fuzzy, no-c-format
+msgid "Performance"
+msgstr "喜好設定"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 193
+#: rc.cpp:593
+#, no-c-format
+msgid "Memory usage:"
+msgstr "記憶體用量:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 199
+#: rc.cpp:596
+#, no-c-format
+msgid "Low"
+msgstr "低"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 204
+#: rc.cpp:599
+#, no-c-format
+msgid "Medium"
+msgstr "中"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 209
+#: rc.cpp:602
+#, no-c-format
+msgid "High"
+msgstr "高"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 248
+#: rc.cpp:605
+#, no-c-format
+msgid "GUI update interval:"
+msgstr "GUI 更新間隔:"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 254
+#: rc.cpp:608
+#, no-c-format
+msgid "500ms"
+msgstr "500ms"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 259
+#: rc.cpp:611
+#, no-c-format
+msgid "1s"
+msgstr "1s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 264
+#: rc.cpp:614
+#, no-c-format
+msgid "2s"
+msgstr "2s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 269
+#: rc.cpp:617
+#, no-c-format
+msgid "5s"
+msgstr "5s"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 308
+#: rc.cpp:620
+#, no-c-format
+msgid "Fast CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 342
+#: rc.cpp:624
+#, no-c-format
+msgid "Slow CPU"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 354
+#: rc.cpp:627
+#, fuzzy, no-c-format
+msgid "Data Checking"
+msgstr "檢查資料中"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 373
+#: rc.cpp:630
+#, no-c-format
+msgid "During uploading, do &not recheck chunks bigger than"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 430
+#: rc.cpp:636
+#, no-c-format
+msgid "Do a data integrit&y check after"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 449
+#: rc.cpp:639
+#, no-c-format
+msgid "corrupted chunks"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 478
+#: rc.cpp:642
+#, no-c-format
+msgid "Networking"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 505
+#: rc.cpp:645
+#, fuzzy, no-c-format
+msgid "Maximum number of connection setups:"
+msgstr "每個 torrent 的最大連線數(0 表示不限制)"
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 527
+#: rc.cpp:648
+#, no-c-format
+msgid "DSCP for IP packets:"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 570
+#: rc.cpp:651
+#, no-c-format
+msgid "Do not use the KDE pro&xy settings for HTTP tracker connections"
+msgstr ""
+
+#. i18n: file ./apps/ktorrent/advancedpref.ui line 586
+#: rc.cpp:654
+#, fuzzy, no-c-format
+msgid "HTTP tracker proxy:"
+msgstr "UDP 追蹤器連接埠:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 24
+#: rc.cpp:657
+#, no-c-format
+msgid "Scanning data"
+msgstr "掃描資料中"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 38
+#: rc.cpp:660
+#, fuzzy, no-c-format
+msgid "Scanning data of torrent :"
+msgstr "掃描區塊資料中:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 62
+#: rc.cpp:663
+#, no-c-format
+msgid "Number of chunks found :"
+msgstr "找到的區塊數:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 70
+#: rc.cpp:666
+#, no-c-format
+msgid "Number of chunks failed / not downloaded :"
+msgstr "失敗/未下載的區塊數:"
+
+#. i18n: file ./apps/ktorrent/scandlgbase.ui line 97
+#: rc.cpp:669 rc.cpp:672
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./apps/ktupnptest/mainwidget.ui line 54
+#: rc.cpp:678
+#, no-c-format
+msgid "Test"
+msgstr "測試"
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 49
+#: rc.cpp:685
+#, no-c-format
+msgid "textLabel2"
+msgstr ""
+
+#. i18n: file ./libktorrent/labelviewitembase.ui line 65
+#: rc.cpp:688
+#, no-c-format
+msgid "textLabel3"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 10
+#: rc.cpp:691
+#, no-c-format
+msgid "Maximum number of downloads (0 = no limit)"
+msgstr "最大下載數(0 表示不限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 15
+#: rc.cpp:694
+#, no-c-format
+msgid "Maximum number of seeds (0 = no limit)"
+msgstr "最大 seed 數(0 表示不限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 20
+#: rc.cpp:697
+#, no-c-format
+msgid "Start downloads on low disk space?"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 24
+#: rc.cpp:700
+#, no-c-format
+msgid "Maximum number of connections per torrent (0 = no limit)"
+msgstr "每個 torrent 的最大連線數(0 表示不限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 29
+#: rc.cpp:703
+#, no-c-format
+msgid "Maximum number of connections for all torrents (0 = no limit) "
+msgstr "所有 torrent 的最大連線數(0 表示不限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 34
+#: rc.cpp:706
+#, no-c-format
+msgid "Maximum upload speed in KB/sec (0 = no limit)"
+msgstr "最大上傳速度,以 KB/秒 為單位(0 表示不限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 39
+#: rc.cpp:709
+#, no-c-format
+msgid "Maximum download speed in KB/sec (0 = no limit)"
+msgstr "最大下載速度,以 KB/秒為單位(0 表示不限制)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 44
+#: rc.cpp:712
+#, fuzzy, no-c-format
+msgid "Maximum share ratio(0 = no limit)"
+msgstr "已達到最大分享比例限制。"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 49
+#: rc.cpp:715
+#, fuzzy, no-c-format
+msgid "Maximum seed time in hours (0 = no limit)"
+msgstr "已達到最大分享比例限制。"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 66
+#: rc.cpp:724
+#, no-c-format
+msgid "Show a system tray icon"
+msgstr "顯示系統匣圖示"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 70
+#: rc.cpp:727
+#, fuzzy, no-c-format
+msgid "Show speed bar in tray icon"
+msgstr "顯示系統匣圖示(&Y)"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 74
+#: rc.cpp:730
+#, no-c-format
+msgid "Download bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 80
+#: rc.cpp:733
+#, no-c-format
+msgid "Upload bandwidth (in kb/s):"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 86
+#: rc.cpp:736
+#, no-c-format
+msgid "Show popup messages when torrent is finished."
+msgstr "Torrent 完成時顯示彈出訊息。"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 90
+#: rc.cpp:739
+#, no-c-format
+msgid "Keep seeding after download has finished"
+msgstr "下載完成後仍保留 seed"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 94
+#: rc.cpp:742
+#, no-c-format
+msgid "Folder to store temporary files"
+msgstr "暫存檔案的資料夾"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 98
+#: rc.cpp:745
+#, no-c-format
+msgid "Whether to automatically save downloads to saveDir"
+msgstr "是否要自動儲存下載到資料夾"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 102
+#: rc.cpp:748
+#, no-c-format
+msgid "Folder to store downloaded files"
+msgstr "儲存下載檔案的資料夾"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 106
+#: rc.cpp:751
+#, fuzzy, no-c-format
+msgid "Whether to automatically move completed downloads to completedDir"
+msgstr "是否要自動儲存下載到資料夾"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 110
+#: rc.cpp:754
+#, fuzzy, no-c-format
+msgid "Folder to move completed downloaded files to"
+msgstr "儲存下載檔案的資料夾"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 114
+#: rc.cpp:757
+#, fuzzy, no-c-format
+msgid "Whether to automatically copy .torrent files to torrentCopyDir"
+msgstr "是否要自動儲存下載到資料夾"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 118
+#: rc.cpp:760
+#, fuzzy, no-c-format
+msgid "Folder to copy .torrent files to"
+msgstr "暫存檔案的資料夾"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 122
+#: rc.cpp:763
+#, no-c-format
+msgid "Whether to use a custom IP to pass to the tracker"
+msgstr "是否要將自定 IP 傳送給追蹤器"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 126
+#: rc.cpp:766
+#, no-c-format
+msgid "Directory which was used as the last save directory"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 130
+#: rc.cpp:769
+#, no-c-format
+msgid "IP to pass to the tracker"
+msgstr "要傳送給追蹤器的 IP"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 134
+#: rc.cpp:772
+#, no-c-format
+msgid "Memory usage"
+msgstr "記憶體用量"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 138
+#: rc.cpp:775
+#, no-c-format
+msgid "GUI update interval"
+msgstr "GUI 更新間隔"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 142
+#: rc.cpp:778
+#, no-c-format
+msgid "Support for DHT"
+msgstr "支援 DHT"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 146
+#: rc.cpp:781
+#, no-c-format
+msgid "DHT port"
+msgstr "DHT 連接埠"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 152
+#: rc.cpp:784
+#, no-c-format
+msgid "Number of upload slots"
+msgstr "上傳槽的數量"
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 196
+#: rc.cpp:793
+#, no-c-format
+msgid "Columns shown in KTorrentView"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 205
+#: rc.cpp:796
+#, no-c-format
+msgid "ET algorithm"
+msgstr ""
+
+#. i18n: file ./libktorrent/ktorrent.kcfg line 227
+#: rc.cpp:799
+#, no-c-format
+msgid ""
+"When there's no space left to complete download and free diskspace is less than "
+"minDiskSpace, torrent will be stopped."
+msgstr ""
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 16
+#: rc.cpp:802
+#, no-c-format
+msgid "Plugin Manager"
+msgstr "外掛程式管理器"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 48
+#: rc.cpp:805
+#, no-c-format
+msgid "Load"
+msgstr "載入"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 56
+#: rc.cpp:808
+#, no-c-format
+msgid "U&nload"
+msgstr "卸載(&N)"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 64
+#: rc.cpp:811
+#, fuzzy, no-c-format
+msgid "Load &All"
+msgstr "全部載入"
+
+#. i18n: file ./libktorrent/pluginmanagerwidget.ui line 72
+#: rc.cpp:814
+#, fuzzy, no-c-format
+msgid "&Unload All"
+msgstr "全部卸載"
+
+#. i18n: file ./plugins/upnp/ktupnpplugin.kcfg line 10
+#: rc.cpp:817
+#, no-c-format
+msgid "Default UPnP device to use"
+msgstr "預設使用的 UPnP 裝置"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 16
+#: plugins/upnp/upnpplugin.cpp:46 plugins/upnp/upnpprefpage.cpp:31 rc.cpp:820
+#, no-c-format
+msgid "UPnP"
+msgstr "UPnP"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 35
+#: rc.cpp:823
+#, no-c-format
+msgid "Detected devices:"
+msgstr "偵測到的裝置:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 41
+#: rc.cpp:826
+#, no-c-format
+msgid "Device"
+msgstr "裝置"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 52
+#: rc.cpp:829
+#, no-c-format
+msgid "Ports Forwarded"
+msgstr "轉接的連接埠"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 63
+#: rc.cpp:832
+#, fuzzy, no-c-format
+msgid "WAN Connection"
+msgstr "連線:"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 91
+#: rc.cpp:835
+#, fuzzy, no-c-format
+msgid "Forw&ard Ports"
+msgstr "轉接連接埠"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 99
+#: rc.cpp:838
+#, no-c-format
+msgid "Undo Port Forwarding"
+msgstr "復原轉接連接埠"
+
+#. i18n: file ./plugins/upnp/upnpwidget.ui line 124
+#: rc.cpp:841
+#, no-c-format
+msgid "Rescan"
+msgstr "重新掃描"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 9
+#: rc.cpp:844
+#, no-c-format
+msgid "Enable scanning of folder1?"
+msgstr "要開啟掃描資料夾 1 嗎?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 14
+#: rc.cpp:847
+#, no-c-format
+msgid "Enable scanning of folder2?"
+msgstr "要開啟掃描資料夾 2 嗎?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 19
+#: rc.cpp:850
+#, no-c-format
+msgid "Enable scanning of folder3?"
+msgstr "要開啟掃描資料夾 3 嗎?"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 24
+#: rc.cpp:853
+#, no-c-format
+msgid "Folder1 path"
+msgstr "資料夾 1 路徑"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 29
+#: rc.cpp:856
+#, no-c-format
+msgid "Folder2 path"
+msgstr "資料夾 2 路徑"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 34
+#: rc.cpp:859
+#, no-c-format
+msgid "Folder3 path"
+msgstr "資料夾 3 路徑"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 39
+#: rc.cpp:862
+#, no-c-format
+msgid "Whether to open torrent silently or not."
+msgstr "是否要安靜地開啟 torrent。"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 44
+#: rc.cpp:865
+#, no-c-format
+msgid "Delete action checked."
+msgstr "刪除勾選的動作。"
+
+#. i18n: file ./plugins/scanfolder/ktscanfolderplugin.kcfg line 49
+#: rc.cpp:868
+#, no-c-format
+msgid "Move action checked."
+msgstr "移動勾選的動作。"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 16
+#: rc.cpp:871
+#, no-c-format
+msgid "ScanFolder Preferences"
+msgstr "資料夾掃描喜好設定"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 35
+#: rc.cpp:874
+#, no-c-format
+msgid "Scan folder &1"
+msgstr "掃描資料夾 1(&1)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 38
+#: rc.cpp:877 rc.cpp:1480
+#, no-c-format
+msgid "Alt+1"
+msgstr "Alt+1"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 46
+#: rc.cpp:880
+#, no-c-format
+msgid "Scan folder &2"
+msgstr "掃描資料夾 2(&2)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 49
+#: rc.cpp:883 rc.cpp:1471 rc.cpp:1495
+#, no-c-format
+msgid "Alt+2"
+msgstr "Alt+2"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 57
+#: rc.cpp:886
+#, no-c-format
+msgid "Scan folder &3"
+msgstr "掃描資料夾 3(&3)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 60
+#: rc.cpp:889 rc.cpp:1465
+#, no-c-format
+msgid "Alt+3"
+msgstr "Alt+3"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 81
+#: rc.cpp:895
+#, no-c-format
+msgid "Move to \"loaded\" directory &after loading"
+msgstr "載入後移動到「已載入」目錄"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 84
+#: rc.cpp:898
+#, no-c-format
+msgid "Move torrent to \"loaded\" directory after loading it"
+msgstr "載入 torrent 後將 torrent 移動到「已載入」目錄"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 92
+#: rc.cpp:901
+#, no-c-format
+msgid "Open torrents silentl&y"
+msgstr "安靜地開啟 torrent(&Y)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 95
+#: rc.cpp:904
+#, fuzzy, no-c-format
+msgid "Do not show 'Select files to download' dialog"
+msgstr "不要顯示「選擇要下載的檔案」對話框"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 103
+#: rc.cpp:907
+#, no-c-format
+msgid "Delete after loadin&g"
+msgstr "載入後刪除(&G)"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 106
+#: rc.cpp:910
+#, no-c-format
+msgid "Deletes torrent after loading"
+msgstr "載入 torrent 後刪除之"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 116
+#: rc.cpp:913
+#, no-c-format
+msgid "Folders to scan"
+msgstr "要掃描的資料夾"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 151
+#: rc.cpp:916
+#, no-c-format
+msgid "Folder 1:"
+msgstr "資料夾 1:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 162
+#: rc.cpp:919
+#, no-c-format
+msgid "Folder 2:"
+msgstr "資料夾 2:"
+
+#. i18n: file ./plugins/scanfolder/sfprefwidgetbase.ui line 173
+#: rc.cpp:922
+#, no-c-format
+msgid "Folder 3:"
+msgstr "資料夾 3:"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 30
+#: rc.cpp:925 rc.cpp:1895
+#, no-c-format
+msgid "Search Preferences"
+msgstr "搜尋喜好設定"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 41
+#: rc.cpp:928
+#, no-c-format
+msgid "Web Server"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 82
+#: rc.cpp:934
+#, fuzzy, no-c-format
+msgid "Forward port"
+msgstr "轉接連接埠"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 107
+#: rc.cpp:937
+#, no-c-format
+msgid "Session TTL (in sec):"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 142
+#: rc.cpp:940
+#, fuzzy, no-c-format
+msgid "Select interface:"
+msgstr "全不選(&N)"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 173
+#: rc.cpp:943
+#, fuzzy, no-c-format
+msgid "Username:"
+msgstr "使用者"
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 188
+#: rc.cpp:946
+#, no-c-format
+msgid "Change password ..."
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/webinterfacepref.ui line 206
+#: rc.cpp:949
+#, no-c-format
+msgid "Php executable path:"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 10
+#: rc.cpp:953
+#, no-c-format
+msgid "Port number"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 15
+#: rc.cpp:956
+#, fuzzy, no-c-format
+msgid "forward Port"
+msgstr "轉接連接埠"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 20
+#: rc.cpp:959
+#, no-c-format
+msgid "Session time to live"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 24
+#: rc.cpp:962
+#, fuzzy, no-c-format
+msgid "interface skin"
+msgstr "一般選項"
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 28
+#: rc.cpp:965
+#, no-c-format
+msgid "php executable path"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 33
+#: rc.cpp:968
+#, no-c-format
+msgid "username"
+msgstr ""
+
+#. i18n: file ./plugins/webinterface/ktwebinterfaceplugin.kcfg line 37
+#: rc.cpp:971
+#, no-c-format
+msgid "password"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 16
+#: plugins/infowidget/infowidgetplugin.cpp:194 rc.cpp:974 rc.cpp:1046
+#, no-c-format
+msgid "Chunks"
+msgstr "區塊"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 43
+#: rc.cpp:977
+#, no-c-format
+msgid "Total:"
+msgstr "總計:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 81
+#: rc.cpp:981
+#, no-c-format
+msgid "Currently downloading:"
+msgstr "目前下載:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 119
+#: rc.cpp:985
+#, no-c-format
+msgid "Downloaded:"
+msgstr "已下載:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 157
+#: rc.cpp:989
+#, no-c-format
+msgid "Excluded:"
+msgstr "已排除:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 195
+#: rc.cpp:993
+#, no-c-format
+msgid "Left:"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 233
+#: rc.cpp:997
+#, no-c-format
+msgid "Size:"
+msgstr "大小:"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 280
+#: rc.cpp:1001
+#, no-c-format
+msgid "Chunk"
+msgstr "區塊"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 291
+#: rc.cpp:1004
+#, no-c-format
+msgid "Progress"
+msgstr "進度"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 302
+#: rc.cpp:1007
+#, no-c-format
+msgid "Peer"
+msgstr "端點"
+
+#. i18n: file ./plugins/infowidget/chunkdownloadviewbase.ui line 324
+#: rc.cpp:1013
+#, no-c-format
+msgid "Assigned Peers"
+msgstr "指定的端點"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 63
+#: rc.cpp:1022
+#, no-c-format
+msgid "Seeders:"
+msgstr "傳送者:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 71
+#: rc.cpp:1025
+#, no-c-format
+msgid "Leechers:"
+msgstr "接收者:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 129
+#: rc.cpp:1030
+#, no-c-format
+msgid "Average Down Speed:"
+msgstr "平均下載速度:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 177
+#: rc.cpp:1035
+#, no-c-format
+msgid "Average Up Speed:"
+msgstr "平均上傳速度:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 195
+#: rc.cpp:1038 rc.cpp:1111
+#, no-c-format
+msgid "Next update in:"
+msgstr "下次更新時間:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 203
+#: rc.cpp:1041
+#, no-c-format
+msgid "Tracker Status:"
+msgstr "追蹤器狀態:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 332
+#: rc.cpp:1049
+#, no-c-format
+msgid "Parts of the torrent which have been downloaded:"
+msgstr "已下載的 torrent 部份:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 367
+#: rc.cpp:1052
+#, no-c-format
+msgid "Parts of the torrent which are available:"
+msgstr "可用的 torrent 部份:"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 457
+#: rc.cpp:1055
+#, no-c-format
+msgid "Sharing"
+msgstr "分享"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 487
+#: rc.cpp:1058
+#, no-c-format
+msgid ""
+"Your upload will stop when share ratio gets to this value. Zero means no limit."
+msgstr "您的上傳在分享比例大於此值時會停止。0 表示不限制。"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 525
+#: rc.cpp:1064
+#, fuzzy, no-c-format
+msgid "Your upload will stop when you have uploaded for this many hours."
+msgstr "您的上傳在分享比例大於此值時會停止。0 表示不限制。"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 533
+#: rc.cpp:1067
+#, no-c-format
+msgid "Hours"
+msgstr ""
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 543
+#: rc.cpp:1070
+#, fuzzy, no-c-format
+msgid "Ratio limit:"
+msgstr "全域連線限制"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 549
+#: rc.cpp:1074
+#, no-c-format
+msgid "Limit works only in seed mode"
+msgstr "限制在 seed 模式下工作"
+
+#. i18n: file ./plugins/infowidget/statustabbase.ui line 557
+#: rc.cpp:1077
+#, fuzzy, no-c-format
+msgid "Time &limit:"
+msgstr "要限制嗎?(&U)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 37
+#: rc.cpp:1081
+#, fuzzy, no-c-format
+msgid "&Update Tracker"
+msgstr "更新追蹤器(&A)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 40
+#: rc.cpp:1084
+#, no-c-format
+msgid "Minimum update interval - 60 seconds"
+msgstr "最小更新間隔─60 秒"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 48
+#: rc.cpp:1087
+#, fuzzy, no-c-format
+msgid "Add Trac&ker"
+msgstr "新增追蹤器(&R)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 64
+#: rc.cpp:1090
+#, no-c-format
+msgid "Remove Tracker"
+msgstr "移除追蹤器"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 75
+#: rc.cpp:1094
+#, fuzzy, no-c-format
+msgid "Ch&ange Tracker"
+msgstr "變更追蹤器(&N)"
+
+#. i18n: file ./plugins/infowidget/trackerviewbase.ui line 100
+#: rc.cpp:1097
+#, no-c-format
+msgid "Restore Defaults"
+msgstr "還原預設值"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 10
+#: rc.cpp:1115
+#, no-c-format
+msgid "Show peer view tab in main window"
+msgstr "在主視窗顯示端點檢視表"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 14
+#: rc.cpp:1118
+#, no-c-format
+msgid "Show chunk download view tab in main window"
+msgstr "在主視窗顯示區塊檢視表"
+
+#. i18n: file ./plugins/infowidget/ktinfowidgetplugin.kcfg line 18
+#: rc.cpp:1121
+#, no-c-format
+msgid "Show trackers view tab in main window"
+msgstr "在主視窗顯示追蹤器檢視表"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 24
+#: rc.cpp:1124
+#, no-c-format
+msgid "Show list of peers"
+msgstr "顯示端點清單"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 35
+#: rc.cpp:1128
+#, no-c-format
+msgid "Show list of chunks currentl&y downloading"
+msgstr "顯示目前下載的區塊清單(&Y)"
+
+#. i18n: file ./plugins/infowidget/iwpref.ui line 60
+#: rc.cpp:1131
+#, no-c-format
+msgid "Show list of trackers"
+msgstr "顯示追蹤器清單"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 16
+#: rc.cpp:1135
+#, no-c-format
+msgid "IPBlocking Preferences"
+msgstr "IPBlocking 喜好設定"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 47
+#: rc.cpp:1138
+#, fuzzy, no-c-format
+msgid "Select PeerGuardian Filter File "
+msgstr "選擇 PeerGuardian 過濾器檔案"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 58
+#: rc.cpp:1141
+#, no-c-format
+msgid "Use PeerGuardian filter?"
+msgstr "要使用 PeerGuardian 過濾器嗎?"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 77
+#: rc.cpp:1145
+#, no-c-format
+msgid "IP filter file:"
+msgstr "IP 過濾器檔案:"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 85
+#: rc.cpp:1148
+#, no-c-format
+msgid "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+msgstr "http://www.bluetack.co.uk/modules.php?name=Downloads&d_op=getit&lid=8"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 123
+#: rc.cpp:1151
+#, no-c-format
+msgid "Dow&nload/Convert"
+msgstr "下載/轉換(&N)"
+
+#. i18n: file ./plugins/ipfilter/ipblockingpref.ui line 134
+#: rc.cpp:1154
+#, no-c-format
+msgid ""
+"Download PeerGuardian filter from bluetack.co.uk or blocklist.org.\n"
+"NOTE: ZIP file from bluetack.co.uk is supported."
+msgstr ""
+"從 bluetack.co.uk 或 blocklist.org 下載 PeerGuardian 過濾器。\n"
+"注意:支援從 bluetack.co.uk 下載 ZIP 檔。"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 10
+#: rc.cpp:1159
+#, no-c-format
+msgid "Level1 filter url"
+msgstr "第一級過濾器網址"
+
+#. i18n: file ./plugins/ipfilter/ktipfilterplugin.kcfg line 14
+#: rc.cpp:1162
+#, no-c-format
+msgid "Use level1 filter?"
+msgstr "要使用第一級過濾器嗎?"
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 24
+#: plugins/ipfilter/convertdialog.cpp:155 rc.cpp:1165
+#, no-c-format
+msgid "Converting..."
+msgstr "轉換中..."
+
+#. i18n: file ./plugins/ipfilter/convert_dlg.ui line 41
+#: rc.cpp:1168
+#, fuzzy, no-c-format
+msgid ""
+"Click on the 'convert' button to start converting antip2p file. NOTE: This "
+"process could take a while even on fast machines and during that time you will "
+"not be able to use KTorrent."
+msgstr "按下「轉換」鍵開始轉換 antip2p 檔。注意:即使在快的機器上,這個過程可能也要一陣子,而這段時間您將無法使用 KTorrent。"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 27
+#: rc.cpp:1179
+#, no-c-format
+msgid "Update"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 46
+#: rc.cpp:1182 rc.cpp:1268
+#, no-c-format
+msgid "Update charts every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 71
+#: rc.cpp:1185
+#, fuzzy, no-c-format
+msgid "GUI updates"
+msgstr "GUI 更新間隔"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 92
+#: rc.cpp:1188 rc.cpp:1271
+#, no-c-format
+msgid "Gather data every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 120
+#: rc.cpp:1191
+#, no-c-format
+msgid "miliseconds"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 135
+#: rc.cpp:1194
+#, fuzzy, no-c-format
+msgid "Maximum"
+msgstr "最大 seed 數:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 154
+#: rc.cpp:1197
+#, fuzzy, no-c-format
+msgid "Maximum speed scale mode:"
+msgstr "最大 seed 數:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 165
+#: rc.cpp:1203
+#, no-c-format
+msgid "Exact"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 175
+#: rc.cpp:1206
+#, no-c-format
+msgid "See 'What's this' for more help"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 180
+#: rc.cpp:1209
+#, no-c-format
+msgid ""
+"Set maximum value on OY scale as:\n"
+"- Top: Globally achieved maximum speed\n"
+"- Exact: Maximum achieved speed visible on chart"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 192
+#: rc.cpp:1214 rc.cpp:1247
+#, fuzzy, no-c-format
+msgid "Peers speed"
+msgstr "端點"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 211
+#: rc.cpp:1217
+#, fuzzy, no-c-format
+msgid "Peers speed:"
+msgstr "端點"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 222
+#: rc.cpp:1220
+#, no-c-format
+msgid "update every"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 244
+#: rc.cpp:1223
+#, no-c-format
+msgid "chart data updates"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 254
+#: rc.cpp:1226
+#, no-c-format
+msgid "Gathering data about many connected peers can be CPU consuming."
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 267
+#: rc.cpp:1229
+#, fuzzy, no-c-format
+msgid "Peers connections"
+msgstr "連線:"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 270
+#: rc.cpp:1232
+#, no-c-format
+msgid "Large values can obscure charts of connected peers"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 289
+#: rc.cpp:1235
+#, fuzzy, no-c-format
+msgid "Show seeders in swarms"
+msgstr "顯示系統匣圖示(&Y)"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 297
+#: rc.cpp:1238
+#, no-c-format
+msgid "Show leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 309
+#: rc.cpp:1241
+#, no-c-format
+msgid "Measurements count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 392
+#: rc.cpp:1250 rc.cpp:1265
+#, fuzzy, no-c-format
+msgid "Upload"
+msgstr "上傳"
+
+#. i18n: file ./plugins/stats/sprefwgt.ui line 424
+#: rc.cpp:1253
+#, fuzzy, no-c-format
+msgid "Connections"
+msgstr "連線:"
+
+#. i18n: file ./plugins/stats/statsspdwgt.ui line 40
+#: plugins/infowidget/infowidgetplugin.cpp:173 rc.cpp:1262 rc.cpp:1304
+#, no-c-format
+msgid "Peers"
+msgstr "端點"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 18
+#: rc.cpp:1274
+#, no-c-format
+msgid "Toggle peers speed charts"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 22
+#: rc.cpp:1277
+#, no-c-format
+msgid "Interval between getting data about peers speed"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 26
+#: rc.cpp:1280
+#, no-c-format
+msgid "Toggle drawing of leechers in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 30
+#: rc.cpp:1283
+#, no-c-format
+msgid "Toggle drawing of seeders in swarms"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 35
+#: rc.cpp:1286
+#, fuzzy, no-c-format
+msgid "Download mesurments count"
+msgstr "下載 torrent"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 39
+#: rc.cpp:1289
+#, no-c-format
+msgid "Peers speed mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 43
+#: rc.cpp:1292
+#, no-c-format
+msgid "Upload mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 47
+#: rc.cpp:1295
+#, fuzzy, no-c-format
+msgid "Connections mesurments count"
+msgstr "連線訊息旗標"
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 51
+#: rc.cpp:1298
+#, no-c-format
+msgid "DHT mesurments count"
+msgstr ""
+
+#. i18n: file ./plugins/stats/ktstatsplugin.kcfg line 56
+#: rc.cpp:1301
+#, no-c-format
+msgid "OY axis max mode"
+msgstr ""
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 16
+#: rc.cpp:1310
+#, no-c-format
+msgid "Import an existing download"
+msgstr "匯入已存在的下載"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 49
+#: rc.cpp:1313
+#, no-c-format
+msgid "Torrent:"
+msgstr "Torrent:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 63
+#: rc.cpp:1316
+#, no-c-format
+msgid "Data:"
+msgstr "資料:"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 95
+#: rc.cpp:1319
+#, no-c-format
+msgid ""
+"Please specify the torrent and the data already downloaded for that torrent."
+msgstr "請指定 torrent 及該 torrent 已下載的資料。"
+
+#. i18n: file ./plugins/partfileimport/importdlgbase.ui line 133
+#: rc.cpp:1322
+#, no-c-format
+msgid "&Import"
+msgstr "匯入(&I)"
+
+#. i18n: file ./plugins/rssfeed/ktrssfeedplugin.kcfg line 10
+#: rc.cpp:1328
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "新增預設(&L)"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 18
+#: rc.cpp:1331
+#, no-c-format
+msgid "Rss Feeds"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 36
+#: rc.cpp:1334
+#, fuzzy, no-c-format
+msgid "Feeds"
+msgstr "傳送者:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 78
+#: rc.cpp:1337
+#, no-c-format
+msgid "De&lete"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 86
+#: rc.cpp:1340 rc.cpp:1382 rc.cpp:1392
+#, no-c-format
+msgid "&New"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 117
+#: rc.cpp:1343
+#, fuzzy, no-c-format
+msgid "&URL"
+msgstr "網址"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 139
+#: rc.cpp:1346
+#, no-c-format
+msgid "Articles"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 216
+#: rc.cpp:1353
+#, no-c-format
+msgid "Auto&refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 242
+#: rc.cpp:1356
+#, no-c-format
+msgid "I&gnore TTL"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 270
+#: rc.cpp:1359
+#, no-c-format
+msgid "Refresh"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 299
+#: rc.cpp:1363 rc.cpp:1395
+#, no-c-format
+msgid "&Title"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 323
+#: rc.cpp:1366
+#, no-c-format
+msgid "Keep Articles (days)"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 347
+#: rc.cpp:1369 rc.cpp:1398
+#, no-c-format
+msgid "&Active"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 362
+#: rc.cpp:1372
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "IP 過濾器"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 389
+#: rc.cpp:1375
+#, fuzzy, no-c-format
+msgid "Accept Filters"
+msgstr "所有檔案"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 440
+#: rc.cpp:1385
+#, no-c-format
+msgid "Reject Filters"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 557
+#: rc.cpp:1401
+#, no-c-format
+msgid "Regular Expressions"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 587
+#: rc.cpp:1404
+#, no-c-format
+msgid "Treat as &Series"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 624
+#: rc.cpp:1407
+#, fuzzy, no-c-format
+msgid "Process"
+msgstr "進度"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 643
+#: rc.cpp:1411
+#, no-c-format
+msgid "Series Criteria"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 679
+#: rc.cpp:1414
+#, no-c-format
+msgid "Match Without Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 713
+#: rc.cpp:1418
+#, no-c-format
+msgid "Max Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 739
+#: rc.cpp:1421
+#, fuzzy, no-c-format
+msgid "Max Season"
+msgstr "最大比例:"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 758
+#: rc.cpp:1424
+#, no-c-format
+msgid "Min Season"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 782
+#: rc.cpp:1427
+#, no-c-format
+msgid "Min Episode"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 814
+#: rc.cpp:1430
+#, no-c-format
+msgid "Test te&xt"
+msgstr ""
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 840
+#: rc.cpp:1433
+#, fuzzy, no-c-format
+msgid "Te&st"
+msgstr "測試"
+
+#. i18n: file ./plugins/rssfeed/rssfeedwidget.ui line 858
+#: rc.cpp:1436
+#, fuzzy, no-c-format
+msgid "Filter Matches"
+msgstr "資料夾 1 路徑"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 28
+#: rc.cpp:1447
+#, no-c-format
+msgid "Bandwidth scheduler"
+msgstr "頻寬排程器"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 50
+#: rc.cpp:1450
+#, no-c-format
+msgid "Left click category"
+msgstr "左邊點擊類別"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 61
+#: rc.cpp:1453
+#, no-c-format
+msgid "Categor&y 1"
+msgstr "類別 1(&Y)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 157
+#: rc.cpp:1456 rc.cpp:1483
+#, no-c-format
+msgid "T&urn off"
+msgstr "關閉(&U)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 165
+#: rc.cpp:1459 rc.cpp:1486
+#, no-c-format
+msgid "&Normal"
+msgstr "一般(&N)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 195
+#: rc.cpp:1462
+#, no-c-format
+msgid "Category &3"
+msgstr "類別 3(&3)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 206
+#: rc.cpp:1468 rc.cpp:1492
+#, no-c-format
+msgid "Category &2"
+msgstr "類別 2(&2)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 219
+#: rc.cpp:1474
+#, no-c-format
+msgid "Right click category"
+msgstr "右邊點擊類別"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 230
+#: rc.cpp:1477
+#, no-c-format
+msgid "Category &1"
+msgstr "類別 1(&1)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 367
+#: rc.cpp:1489
+#, no-c-format
+msgid "&Category 3"
+msgstr "類別 3(&C)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 390
+#: rc.cpp:1498
+#, no-c-format
+msgid "Categories"
+msgstr "類別"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 401
+#: rc.cpp:1501
+#, no-c-format
+msgid "<b>1. Category</b>"
+msgstr "<b>1. 類別</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 409
+#: rc.cpp:1504
+#, no-c-format
+msgid "<b>3. Category</b>"
+msgstr "<b>3. 類別</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 425
+#: rc.cpp:1507 rc.cpp:1516 rc.cpp:1525
+#, no-c-format
+msgid "download:"
+msgstr "下載:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 441
+#: rc.cpp:1510 rc.cpp:1519 rc.cpp:1528
+#, no-c-format
+msgid "upload:"
+msgstr "上傳:"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 457
+#: rc.cpp:1513 rc.cpp:1522 rc.cpp:1531
+#, no-c-format
+msgid "KB/s *"
+msgstr "KB/秒 *"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 567
+#: rc.cpp:1534
+#, no-c-format
+msgid "<b>2. Category</b>"
+msgstr "<b>2. 類別</b>"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 626
+#: rc.cpp:1538
+#, no-c-format
+msgid "* zero means no limit"
+msgstr "* 0 表示不限制"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 672
+#: rc.cpp:1541
+#, no-c-format
+msgid "Save to file"
+msgstr "儲存至檔案"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 680
+#: rc.cpp:1544
+#, no-c-format
+msgid "&Load from file"
+msgstr "從檔案載入(&L)"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 688
+#: rc.cpp:1547
+#, no-c-format
+msgid "Reset schedule"
+msgstr "重設排程"
+
+#. i18n: file ./plugins/scheduler/bwspage.ui line 751
+#: rc.cpp:1550
+#, no-c-format
+msgid "O&k"
+msgstr "確定(&K)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 16
+#: rc.cpp:1559
+#, no-c-format
+msgid "Scheduler Plugin Pref Page"
+msgstr "排程外掛程式喜好設定"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 27
+#: rc.cpp:1562
+#, no-c-format
+msgid "Use &bandwidth scheduler?"
+msgstr "要使用頻寬排程器嗎?(&B)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 35
+#: plugins/scheduler/schedulerplugin.cpp:59 rc.cpp:1565
+#, no-c-format
+msgid "Bandwidth Scheduler"
+msgstr "頻寬排程器"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 46
+#: rc.cpp:1568
+#, no-c-format
+msgid "Use colors instead of pi&xmaps?"
+msgstr "要使用顏色取代像素圖嗎?(&X)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 54
+#: rc.cpp:1571
+#, no-c-format
+msgid "(Recommended for slower systems)"
+msgstr "(在較慢的系統上建議使用)"
+
+#. i18n: file ./plugins/scheduler/schedulerpage.ui line 62
+#: rc.cpp:1574
+#, no-c-format
+msgid "Edit s&chedule"
+msgstr "編輯排程(&C)"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 10
+#: rc.cpp:1577
+#, no-c-format
+msgid "Enable bandwidth scheduler?"
+msgstr "要開啟頻寬排程器嗎?"
+
+#. i18n: file ./plugins/scheduler/ktschedulerplugin.kcfg line 14
+#: rc.cpp:1580
+#, no-c-format
+msgid "Use colors instead of pixmaps?"
+msgstr "要使用顏色取代像素圖嗎?"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 10
+#: rc.cpp:1583
+#, no-c-format
+msgid "Use rich log text"
+msgstr "使用 rich text 紀錄"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 15
+#: rc.cpp:1586
+#, no-c-format
+msgid "General info messages flag"
+msgstr "一般資訊訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 19
+#: rc.cpp:1589
+#, no-c-format
+msgid "Connections messages flag"
+msgstr "連線訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 23
+#: rc.cpp:1592
+#, no-c-format
+msgid "DHT messages flag"
+msgstr "DHT 訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 27
+#: rc.cpp:1595
+#, no-c-format
+msgid "Tracker info messages flag"
+msgstr "追蹤器訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 31
+#: rc.cpp:1598
+#, no-c-format
+msgid "Disk IO info messages flag"
+msgstr "磁碟 IO 資訊訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 35
+#: rc.cpp:1601
+#, no-c-format
+msgid "IPFilter plugin messages flag"
+msgstr "IP 過濾器外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 39
+#: rc.cpp:1604
+#, no-c-format
+msgid "Search plugin messages flag"
+msgstr "搜尋外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 43
+#: rc.cpp:1607
+#, no-c-format
+msgid "PartFileImport plugin messages flag"
+msgstr "PartFileImport 外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 47
+#: rc.cpp:1610
+#, no-c-format
+msgid "InfoWidget plugin messages flag"
+msgstr "資訊元件外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 51
+#: rc.cpp:1613
+#, no-c-format
+msgid "UPnP plugin messages flag"
+msgstr "UPnp 外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 55
+#: rc.cpp:1616
+#, no-c-format
+msgid "ScanFolder plugin messages flag"
+msgstr "掃描資料夾外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 59
+#: rc.cpp:1619
+#, no-c-format
+msgid "Scheduler plugin messages flag"
+msgstr "排程器外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 63
+#: rc.cpp:1622
+#, fuzzy, no-c-format
+msgid "RSS plugin messages flag"
+msgstr "搜尋外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/ktlogviewerplugin.kcfg line 67
+#: rc.cpp:1625
+#, fuzzy, no-c-format
+msgid "WebInterface plugin messages flag"
+msgstr "IP 過濾器外掛程式訊息旗標"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 16
+#: plugins/logviewer/logprefpage.cpp:31 rc.cpp:1628
+#, no-c-format
+msgid "LogViewer Options"
+msgstr "紀錄顯示器選項"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 44
+#: libktorrent/pluginmanagerprefpage.cpp:63 rc.cpp:1631
+#, no-c-format
+msgid "Plugins"
+msgstr "外掛程式"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 53
+#: rc.cpp:1634 rc.cpp:1652 rc.cpp:1670 rc.cpp:1691 rc.cpp:1706 rc.cpp:1724
+#: rc.cpp:1745 rc.cpp:1763 rc.cpp:1778 rc.cpp:1811 rc.cpp:1826 rc.cpp:1841
+#: rc.cpp:1859 rc.cpp:1874
+#, no-c-format
+msgid "All"
+msgstr "全部"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 58
+#: rc.cpp:1637 rc.cpp:1655 rc.cpp:1673 rc.cpp:1694 rc.cpp:1709 rc.cpp:1727
+#: rc.cpp:1748 rc.cpp:1766 rc.cpp:1781 rc.cpp:1814 rc.cpp:1829 rc.cpp:1844
+#: rc.cpp:1862 rc.cpp:1877
+#, no-c-format
+msgid "Debug"
+msgstr "除錯"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 63
+#: rc.cpp:1640 rc.cpp:1658 rc.cpp:1676 rc.cpp:1697 rc.cpp:1712 rc.cpp:1730
+#: rc.cpp:1751 rc.cpp:1769 rc.cpp:1784 rc.cpp:1817 rc.cpp:1832 rc.cpp:1847
+#: rc.cpp:1865 rc.cpp:1880
+#, no-c-format
+msgid "Notice"
+msgstr "注意"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 68
+#: rc.cpp:1643 rc.cpp:1661 rc.cpp:1679 rc.cpp:1700 rc.cpp:1715 rc.cpp:1733
+#: rc.cpp:1754 rc.cpp:1772 rc.cpp:1787 rc.cpp:1820 rc.cpp:1835 rc.cpp:1850
+#: rc.cpp:1868 rc.cpp:1883
+#, no-c-format
+msgid "Important"
+msgstr "重要"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 73
+#: rc.cpp:1646 rc.cpp:1664 rc.cpp:1682 rc.cpp:1703 rc.cpp:1718 rc.cpp:1736
+#: rc.cpp:1757 rc.cpp:1775 rc.cpp:1790 rc.cpp:1823 rc.cpp:1838 rc.cpp:1853
+#: rc.cpp:1871 rc.cpp:1886
+#, no-c-format
+msgid "None"
+msgstr "無"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 85
+#: rc.cpp:1649
+#, no-c-format
+msgid "IPFilter:"
+msgstr "IP 過濾器:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 126
+#: rc.cpp:1667
+#, no-c-format
+msgid "Search:"
+msgstr "搜尋:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 167
+#: rc.cpp:1685
+#, no-c-format
+msgid "UPnP:"
+msgstr "UPnP:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 178
+#: rc.cpp:1688
+#, no-c-format
+msgid "ScanFolder:"
+msgstr "掃描資料夾:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 249
+#: rc.cpp:1721
+#, no-c-format
+msgid "Scheduler:"
+msgstr "排程器:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 290
+#: rc.cpp:1739
+#, no-c-format
+msgid "PartFileImport:"
+msgstr "PartFileImport:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 301
+#: rc.cpp:1742
+#, no-c-format
+msgid "InfoWidget:"
+msgstr "資訊元件:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 342
+#: rc.cpp:1760
+#, no-c-format
+msgid "RSS plugin:"
+msgstr ""
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 413
+#: rc.cpp:1793
+#, fuzzy, no-c-format
+msgid "WebInterface plugin:"
+msgstr "一般選項"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 426
+#: rc.cpp:1796
+#, no-c-format
+msgid "System"
+msgstr "系統"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 437
+#: rc.cpp:1799
+#, no-c-format
+msgid "General:"
+msgstr "一般:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 445
+#: rc.cpp:1802
+#, no-c-format
+msgid "Connections:"
+msgstr "連線:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 559
+#: rc.cpp:1856
+#, no-c-format
+msgid "Disk I/O:"
+msgstr "磁碟 I/O:"
+
+#. i18n: file ./plugins/logviewer/logprefwidgetbase.ui line 640
+#: rc.cpp:1892
+#, no-c-format
+msgid "Use rich te&xt for log"
+msgstr "使用 rich text 來紀錄(&X)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 41
+#: rc.cpp:1898
+#, no-c-format
+msgid "External Browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 52
+#: rc.cpp:1901
+#, no-c-format
+msgid "Open searches in external browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 60
+#: rc.cpp:1904 rc.cpp:1955
+#, no-c-format
+msgid "Use default browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/searchpref.ui line 79
+#: rc.cpp:1908
+#, fuzzy, no-c-format
+msgid "Custom browser path:"
+msgstr "自訂 IP"
+
+#. i18n: file ./plugins/search/searchpref.ui line 116
+#: rc.cpp:1912
+#, no-c-format
+msgid "Search Engines"
+msgstr "搜尋引擎"
+
+#. i18n: file ./plugins/search/searchpref.ui line 143
+#: rc.cpp:1916
+#, no-c-format
+msgid "Search engine name:"
+msgstr "搜尋引擎名稱:"
+
+#. i18n: file ./plugins/search/searchpref.ui line 187
+#: rc.cpp:1922
+#, no-c-format
+msgid "&Add"
+msgstr "新增(&A)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 195
+#: rc.cpp:1925
+#, no-c-format
+msgid "Engines"
+msgstr "引擎"
+
+#. i18n: file ./plugins/search/searchpref.ui line 206
+#: rc.cpp:1928
+#, no-c-format
+msgid "URL"
+msgstr "網址"
+
+#. i18n: file ./plugins/search/searchpref.ui line 257
+#: rc.cpp:1934
+#, no-c-format
+msgid "R&emove All"
+msgstr "全部移除(&E)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 282
+#: rc.cpp:1937
+#, no-c-format
+msgid "Add Defau&lt"
+msgstr "新增預設(&L)"
+
+#. i18n: file ./plugins/search/searchpref.ui line 290
+#: rc.cpp:1940
+#, fuzzy, no-c-format
+msgid "Update From Internet"
+msgstr "從網際網路更新"
+
+#. i18n: file ./plugins/search/searchbar.ui line 53
+#: plugins/search/searchplugin.cpp:50 plugins/search/searchtab.cpp:48
+#: rc.cpp:1946
+#, no-c-format
+msgid "Search"
+msgstr "搜尋"
+
+#. i18n: file ./plugins/search/searchbar.ui line 78
+#: rc.cpp:1949
+#, no-c-format
+msgid "Search engine:"
+msgstr "搜尋引擎:"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 10
+#: rc.cpp:1952
+#, no-c-format
+msgid "Current search engine"
+msgstr "目前的搜尋引擎"
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 19
+#: rc.cpp:1958
+#, no-c-format
+msgid "Use custom browser"
+msgstr ""
+
+#. i18n: file ./plugins/search/ktsearchplugin.kcfg line 23
+#: rc.cpp:1961
+#, no-c-format
+msgid "Custom browser executable path"
+msgstr ""
+
+#: libktorrent/interfaces/functions.cpp:35
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: libktorrent/interfaces/functions.cpp:37
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: libktorrent/interfaces/functions.cpp:39
+msgid "%1 KB"
+msgstr "%1 KB"
+
+#: libktorrent/interfaces/functions.cpp:41
+msgid "%1 B"
+msgstr "%1 B"
+
+#: libktorrent/interfaces/functions.cpp:47
+msgid "%1 KB/s"
+msgstr "%1 KB/秒"
+
+#: libktorrent/interfaces/functions.cpp:58
+#, c-format
+msgid ""
+"_n: 1 day \n"
+"%n days "
+msgstr "%n 天"
+
+#: libktorrent/interfaces/filetreeitem.cpp:77
+#: plugins/infowidget/iwfiletreediritem.cpp:148
+#: plugins/infowidget/iwfiletreeitem.cpp:120
+msgid "Yes, First"
+msgstr "是的,優先"
+
+#: libktorrent/interfaces/filetreeitem.cpp:80
+#: plugins/infowidget/iwfiletreediritem.cpp:152
+#: plugins/infowidget/iwfiletreeitem.cpp:123
+msgid "Yes, Last"
+msgstr "是的,最後"
+
+#: libktorrent/util/log.cpp:103
+msgid "Cannot open log file %1 : %2"
+msgstr "無法開啟紀錄檔 %1:%2"
+
+#: libktorrent/util/file.cpp:87
+msgid "Cannot write to %1 : %2"
+msgstr "無法寫入 %1:%2"
+
+#: libktorrent/util/file.cpp:101
+#, c-format
+msgid "Cannot read from %1"
+msgstr "無法從 %1 讀取"
+
+#: libktorrent/util/fileops.cpp:78
+msgid "Cannot create directory %1: %2"
+msgstr "無法建立目錄 %1:%2"
+
+#: libktorrent/util/fileops.cpp:92
+msgid "Cannot symlink %1 to %2: %3"
+msgstr "無法建立指向 %2 的符號連結 %1:%3"
+
+#: libktorrent/util/fileops.cpp:108
+msgid "Cannot move %1 to %2: %3"
+msgstr "無法將 %1 移動到 %2:%3"
+
+#: libktorrent/util/fileops.cpp:124 libktorrent/util/fileops.cpp:140
+msgid "Cannot copy %1 to %2: %3"
+msgstr "無法將 %1 複製到 %2:%3"
+
+#: libktorrent/util/fileops.cpp:232
+msgid "Cannot delete %1: %2"
+msgstr "無法刪除 %1:%2"
+
+#: libktorrent/util/fileops.cpp:251
+msgid "Cannot create %1: %2"
+msgstr "無法建立 %1: %2"
+
+#: libktorrent/util/fileops.cpp:272
+msgid "Cannot calculate the filesize of %1: %2"
+msgstr "無法計算 %1 的檔案大小:%2"
+
+#: libktorrent/util/fileops.cpp:289
+#, c-format
+msgid "Cannot calculate the filesize : %2"
+msgstr "無法計算檔案大小:%2"
+
+#: libktorrent/torrent/cachefile.cpp:95 libktorrent/util/fileops.cpp:317
+#: libktorrent/util/fileops.cpp:346 libktorrent/util/fileops.cpp:405
+#: plugins/partfileimport/importdialog.cpp:257
+msgid "Cannot open %1 : %2"
+msgstr "無法開啟 %1:%2"
+
+#: libktorrent/util/fileops.cpp:367 libktorrent/util/fileops.cpp:373
+#: libktorrent/util/fileops.cpp:376 libktorrent/util/fileops.cpp:391
+#, c-format
+msgid "Cannot expand file : %1"
+msgstr "無法展開檔案:%1"
+
+#: libktorrent/util/fileops.cpp:393
+#, fuzzy
+msgid "Cannot expand file"
+msgstr "無法展開檔案 %1"
+
+#: libktorrent/util/fileops.cpp:426
+#, c-format
+msgid "Cannot seek in file : %1"
+msgstr "無法在檔案內尋找(seek):%1"
+
+#: libktorrent/util/mmapfile.cpp:166
+msgid "Cannot write beyond end of the mmap buffer!"
+msgstr "無法寫到 mmap 暫存器之外!"
+
+#: libktorrent/pluginmanagerprefpage.cpp:54
+msgid "%1<br>Status: <b>%2</b><br>Author: %3"
+msgstr ""
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Loaded"
+msgstr "已載入"
+
+#: libktorrent/pluginmanagerprefpage.cpp:55
+msgid "Not loaded"
+msgstr "未載入"
+
+#: libktorrent/pluginmanagerprefpage.cpp:63
+msgid "Plugin Options"
+msgstr "外掛程式選項"
+
+#: libktorrent/migrate/ccmigrate.cpp:119 libktorrent/migrate/ccmigrate.cpp:125
+#: libktorrent/torrent/multifilecache.cpp:595
+#: libktorrent/torrent/multifilecache.cpp:673
+msgid "Cannot open file %1 : %2"
+msgstr "無法開啟檔案 %1:%2"
+
+#: libktorrent/migrate/migrate.cpp:45
+msgid "The directory %1 does not exist"
+msgstr "目錄 %1 不存在"
+
+#: libktorrent/torrent/bdecoder.cpp:62
+#, c-format
+msgid "Illegal token: %1"
+msgstr "不合法的記號:%1"
+
+#: libktorrent/torrent/bdecoder.cpp:83
+msgid "Decode error"
+msgstr "解碼錯誤"
+
+#: libktorrent/torrent/bdecoder.cpp:144 libktorrent/torrent/bdecoder.cpp:189
+msgid "Unexpected end of input"
+msgstr "非預期的輸入結束"
+
+#: libktorrent/torrent/bdecoder.cpp:164 libktorrent/torrent/bdecoder.cpp:198
+msgid "Cannot convert %1 to an int"
+msgstr "無法轉換 %1 成整數"
+
+#: libktorrent/torrent/bdecoder.cpp:203
+msgid "Torrent is incomplete!"
+msgstr "Torrent 不完整!"
+
+#: libktorrent/torrent/torrent.cpp:63 libktorrent/torrent/torrent.cpp:116
+#: libktorrent/torrent/torrent.cpp:139 libktorrent/torrent/torrent.cpp:147
+#: libktorrent/torrent/torrent.cpp:154 libktorrent/torrent/torrent.cpp:158
+#: libktorrent/torrent/torrent.cpp:165 libktorrent/torrent/torrent.cpp:178
+#: libktorrent/torrent/torrent.cpp:182 libktorrent/torrent/torrent.cpp:195
+#: libktorrent/torrent/torrent.cpp:204 libktorrent/torrent/torrent.cpp:216
+#: libktorrent/torrent/torrent.cpp:223 libktorrent/torrent/torrent.cpp:229
+#: libktorrent/torrent/torrent.cpp:236 libktorrent/torrent/torrent.cpp:242
+#: libktorrent/torrent/torrent.cpp:258 libktorrent/torrent/torrent.cpp:304
+#: libktorrent/torrent/torrent.cpp:310 libktorrent/torrent/torrent.cpp:313
+#: libktorrent/torrent/torrent.cpp:316
+msgid "Corrupted torrent!"
+msgstr "已損毀的 Torrent!"
+
+#: libktorrent/torrent/torrent.cpp:76
+msgid "Torrent has no announce or nodes field"
+msgstr "Torrent 中沒有宣告或節點的欄位"
+
+#: libktorrent/torrent/torrent.cpp:103
+msgid " Unable to open torrent file %1 : %2"
+msgstr "無法開啟 Torrent 檔案 %1:%2"
+
+#: libktorrent/torrent/announcelist.cpp:58
+#: libktorrent/torrent/announcelist.cpp:64 libktorrent/torrent/torrent.cpp:281
+#: libktorrent/torrent/torrent.cpp:287
+msgid "Parse Error"
+msgstr "剖析錯誤"
+
+#: libktorrent/torrent/torrentcontrol.cpp:508
+#, fuzzy, c-format
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file.\n"
+"%1"
+msgstr "載入 torrent 時發生錯誤。Torrent 可能已損毀,或不是 torrent 檔案。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:537
+msgid ""
+"An error occurred while loading the torrent. The torrent is probably corrupt or "
+"is not a torrent file."
+msgstr "載入 torrent 時發生錯誤。Torrent 可能已損毀,或不是 torrent 檔案。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:546
+#, fuzzy
+msgid "Unable to create %1 : %2"
+msgstr "無法開啟 Torrent 檔案 %1:%2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:562
+#, fuzzy
+msgid ""
+"You are already downloading this torrent %1, the list of trackers of both "
+"torrents has been merged."
+msgstr "您已經下載此 torrent,兩個 torrent 的追蹤器清單已合併。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:566
+#, fuzzy, c-format
+msgid "You are already downloading the torrent %1"
+msgstr "您要下載還是儲存此 torrent?"
+
+#: libktorrent/torrent/torrentcontrol.cpp:672
+msgid "Cannot migrate %1 : %2"
+msgstr "無法移動 %1:%2"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1273
+msgid ""
+"The torrent %1 was started with a previous version of KTorrent. To make sure "
+"this torrent still works with this version of KTorrent, we will migrate this "
+"torrent. You will be asked for a location to save the torrent to. If you press "
+"cancel, we will select your home directory."
+msgstr ""
+"Torrent %1 已由前一個版本的 KTorrent 啟動。為了確定此 torrent 在目前版本仍可運作,我們將會移動此 "
+"torrent。您將會被詢問要把此 torrent 儲存到哪個位置。如果您按下「取消」,我們會使用您的家目錄。"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1278
+msgid "Select Folder to Save To"
+msgstr "選擇要儲存到哪個資料夾"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1364
+msgid "Not started"
+msgstr "未開始"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1370
+msgid "Seeding"
+msgstr "傳送中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1372
+msgid "Downloading"
+msgstr "下載中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1374
+msgid "Stalled"
+msgstr "暫停"
+
+#: libktorrent/torrent/peersourcemanager.cpp:152
+#: libktorrent/torrent/torrentcontrol.cpp:1376
+msgid "Stopped"
+msgstr "已停止"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1378
+msgid "Error: "
+msgstr "錯誤:"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1380
+msgid "Allocating diskspace"
+msgstr "配置磁碟空間"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1382
+msgid "Queued"
+msgstr "已送進佇列"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1384
+msgid "Checking data"
+msgstr "檢查資料中"
+
+#: libktorrent/torrent/torrentcontrol.cpp:1386
+msgid "Stopped. No space left on device."
+msgstr ""
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy
+msgid ""
+"You don't have enough disk space to download this torrent. Are you sure you "
+"want to continue?"
+msgstr "若是您取消選擇檔案。您將失去所有檔案中的資料。您確定要這樣做嗎?"
+
+#: libktorrent/torrent/queuemanager.cpp:135
+#, fuzzy, c-format
+msgid "Insufficient disk space for %1"
+msgstr "配置磁碟空間"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid ""
+"Torrent \"%1\" has reached its maximum share ratio. Ignore the limit and start "
+"seeding anyway?"
+msgstr "Torrent %1 已達到最大分享比例。要忽略此限制並開始傳送嗎?"
+
+#: libktorrent/torrent/queuemanager.cpp:157
+msgid "Maximum share ratio limit reached."
+msgstr "已達到最大分享比例限制。"
+
+#: libktorrent/torrent/queuemanager.cpp:236
+#: libktorrent/torrent/queuemanager.cpp:760
+msgid "Error stopping torrent %1 : %2"
+msgstr "停止 torrent %1 時發生錯誤:%2"
+
+#: libktorrent/torrent/queuemanager.cpp:742
+msgid "Error starting torrent %1 : %2"
+msgstr "啟動 torrent %1 時發生錯誤:%2"
+
+#: libktorrent/torrent/peersourcemanager.cpp:458
+msgid "Announcing"
+msgstr ""
+
+#: libktorrent/torrent/peerid.cpp:203
+msgid "Unknown client"
+msgstr "未知的客戶端"
+
+#: libktorrent/torrent/chunkdownload.cpp:339
+#, c-format
+msgid ""
+"_n: 1 peer\n"
+"%n peers"
+msgstr "%n 個端點"
+
+#: libktorrent/torrent/dndfile.cpp:108
+msgid "Cannot create file %1 : %2"
+msgstr "無法建立檔案 %1:%2"
+
+#: libktorrent/torrent/dndfile.cpp:175
+#, c-format
+msgid "Failed to write first chunk to DND file : %1"
+msgstr "寫入第一個區塊到 DND 檔時失敗:%1"
+
+#: libktorrent/torrent/dndfile.cpp:233
+#, c-format
+msgid "Failed to write last chunk to DND file : %1"
+msgstr "寫入最後一個區塊到 DND 檔時失敗:%1"
+
+#: libktorrent/torrent/cachefile.cpp:121 libktorrent/torrent/cachefile.cpp:220
+#: libktorrent/torrent/cachefile.cpp:382 libktorrent/torrent/cachefile.cpp:448
+msgid "Cannot open %1 for writing : readonly filesystem"
+msgstr ""
+
+#: libktorrent/torrent/cachefile.cpp:240
+#, fuzzy
+msgid "Cannot expand file %1 : %2"
+msgstr "無法展開檔案:%1"
+
+#: libktorrent/torrent/cachefile.cpp:242
+#, fuzzy
+msgid "Cannot expand file %1 : incomplete write"
+msgstr "無法展開檔案 %1"
+
+#: libktorrent/torrent/cachefile.cpp:255
+#, c-format
+msgid "Cannot expand file %1"
+msgstr "無法展開檔案 %1"
+
+#: libktorrent/torrent/cachefile.cpp:351
+#, c-format
+msgid "Error : Reading past the end of the file %1"
+msgstr "錯誤:讀取超過檔案 %1 的尾端"
+
+#: libktorrent/torrent/cachefile.cpp:361
+#, c-format
+msgid "Error reading from %1"
+msgstr "從 %1 讀取時發生錯誤"
+
+#: libktorrent/torrent/cachefile.cpp:403
+msgid "Error writing to %1 : %2"
+msgstr "寫入 %1 時發生錯誤:%2"
+
+#: libktorrent/torrent/cachefile.cpp:407
+#, c-format
+msgid "Error writing to %1"
+msgstr "寫入 %1 時發生錯誤"
+
+#: libktorrent/torrent/cachefile.cpp:475
+#: libktorrent/torrent/multifilecache.cpp:657
+#, c-format
+msgid "Cannot preallocate diskspace : %1"
+msgstr "無法預先配置磁碟空間:%1"
+
+#: libktorrent/torrent/udptrackersocket.cpp:62
+msgid "Cannot bind to udp port %1 or the 10 following ports."
+msgstr "無法使用 UDP 連接埠 %1 或接下來的十個連接埠。"
+
+#: libktorrent/torrent/httptracker.cpp:260
+#: libktorrent/torrent/httptracker.cpp:280
+#: libktorrent/torrent/httptracker.cpp:320
+#: libktorrent/torrent/httptracker.cpp:399
+#, fuzzy
+msgid "Invalid response from tracker"
+msgstr "不合法的回應"
+
+#: libktorrent/torrent/httptracker.cpp:273
+#, fuzzy
+msgid "Invalid data from tracker"
+msgstr "不合法的回應"
+
+#: libktorrent/torrent/httptracker.cpp:415
+#, fuzzy
+msgid "Invalid tracker URL"
+msgstr "不合法的回應"
+
+#: libktorrent/torrent/torrentcreator.cpp:123
+#: libktorrent/torrent/torrentcreator.cpp:239
+#: libktorrent/torrent/torrentcreator.cpp:277
+msgid "Cannot open file %1: %2"
+msgstr "無法開啟檔案 %1:%2"
+
+#: libktorrent/torrent/torrentcreator.cpp:339
+#, c-format
+msgid "Cannot create index file: %1"
+msgstr "無法建立索引檔:%1"
+
+#: libktorrent/datachecker/singledatachecker.cpp:50
+msgid "Cannot open file : %1 : %2"
+msgstr "無法開啟檔案 %1:%2"
+
+#: plugins/upnp/upnpplugin.cpp:46
+msgid "Uses UPnP to automatically forward ports on your router"
+msgstr "使用 UPnP 自動轉接路由器上的連接埠"
+
+#: plugins/upnp/upnprouter.cpp:418 plugins/upnp/upnprouter.cpp:431
+msgid "Cannot find port forwarding service in the device's description!"
+msgstr "在裝置描述中無法找到連接埠轉接服務。"
+
+#: plugins/upnp/upnpprefpage.cpp:31
+msgid "UPnP Devices"
+msgstr "UPnP 裝置"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:49
+msgid "Automatically scans directories for torrent files and loads them."
+msgstr "自動掃描目錄中的 torrent 檔並載入。"
+
+#: plugins/scanfolder/scanfolderplugin.cpp:52
+#, fuzzy
+msgid "Scan Folder"
+msgstr "掃描資料夾"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder"
+msgstr "掃描資料夾"
+
+#: plugins/scanfolder/scanfolderprefpage.cpp:34
+msgid "ScanFolder Options"
+msgstr "掃描資料夾選項"
+
+#: plugins/scanfolder/scanfolder.cpp:150 plugins/scanfolder/scanfolder.cpp:188
+#: plugins/scanfolder/scanfolder.cpp:189
+msgid "loaded"
+msgstr "已載入"
+
+#: plugins/scanfolder/scanfolderprefpagewidget.cpp:73
+#, fuzzy
+msgid ""
+"ScanFolder - Folder %1: Invalid URL or folder does not exist. Please, choose a "
+"valid directory."
+msgstr "資料夾掃描 - 資料夾 %1:不合法的資料夾名稱,或資料夾可能不存在。請選擇一個正確的目錄。"
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+msgid "WebInterface"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefpage.cpp:27
+#, fuzzy
+msgid "WebInterface Options"
+msgstr "一般選項"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:70
+msgid "Php executable is not in default path, please enter the path manually"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:106
+msgid "Please enter a new password for the web interface."
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:116
+msgid "%1 exists and it is executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:120
+#, fuzzy
+msgid "%1 does not exist"
+msgstr "目錄 %1 不存在"
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:124
+msgid "%1 is not executable"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:128
+msgid "%1 is a directory"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceprefwidget.cpp:132
+msgid "%1 is not php executable path"
+msgstr ""
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+#, fuzzy
+msgid "Web Interface"
+msgstr "一般選項"
+
+#: plugins/webinterface/webinterfaceplugin.cpp:44
+msgid "Allow to control ktorrent through browser"
+msgstr ""
+
+#: plugins/infowidget/fileview.cpp:57
+msgid "Download First"
+msgstr "優先下載"
+
+#: plugins/infowidget/fileview.cpp:58
+msgid "Download Normally"
+msgstr "正常下載"
+
+#: plugins/infowidget/fileview.cpp:59
+msgid "Download Last"
+msgstr "最後下載"
+
+#: plugins/infowidget/fileview.cpp:62
+#, fuzzy
+msgid "Delete File(s)"
+msgstr "所有檔案"
+
+#: plugins/infowidget/fileview.cpp:204
+#: plugins/infowidget/iwfiletreeitem.cpp:71
+#: plugins/infowidget/iwfiletreeitem.cpp:103
+msgid "Available"
+msgstr "可使用"
+
+#: plugins/infowidget/fileview.cpp:206
+#: plugins/infowidget/iwfiletreeitem.cpp:75
+#: plugins/infowidget/iwfiletreeitem.cpp:107
+msgid "Pending"
+msgstr "未定"
+
+#: plugins/infowidget/fileview.cpp:343
+#, fuzzy
+msgid ""
+"_n: You will lose all data in this file, are you sure you want to do this ?\n"
+"You will lose all data in these files, are you sure you want to do this ?"
+msgstr "您已取消選擇以下的檔案。您將失去所有這些檔案的資料。您確定要這樣做嗎?"
+
+#: plugins/infowidget/statustab.cpp:55
+#, fuzzy
+msgid "No limit"
+msgstr "要限制嗎?(&U)"
+
+#: plugins/infowidget/infowidgetplugin.cpp:51
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Info Widget"
+msgstr "資訊元件"
+
+#: plugins/infowidget/infowidgetplugin.cpp:52
+msgid ""
+"Shows additional information about a download. Like which chunks have been "
+"downloaded, how many seeders and leechers ..."
+msgstr "顯示關於下載的額外資訊。例如哪些區塊已下載,有多少傳送者與接受者等等。"
+
+#: plugins/infowidget/trackerview.cpp:71
+msgid "Cannot add a tracker to a private torrent."
+msgstr "無法在私密 torrent 中加入追蹤器"
+
+#: plugins/infowidget/trackerview.cpp:96
+msgid "Cannot remove torrent default tracker."
+msgstr "無法移除 torrent 預設追蹤器。"
+
+#: plugins/infowidget/trackerview.cpp:214
+msgid "You cannot add trackers to a private torrent"
+msgstr "您無法在私密 torrent 中加入追蹤器"
+
+#: plugins/infowidget/peerview.cpp:213
+msgid "IP"
+msgstr "IP"
+
+#: plugins/infowidget/peerview.cpp:214
+msgid "Country"
+msgstr "國家"
+
+#: plugins/infowidget/peerview.cpp:215
+msgid "Client"
+msgstr "客戶端"
+
+#: plugins/infowidget/peerview.cpp:218
+msgid "Choked"
+msgstr "已阻塞"
+
+#: plugins/infowidget/peerview.cpp:219
+msgid "Snubbed"
+msgstr "已停止"
+
+#: plugins/infowidget/peerview.cpp:220
+msgid "Availability"
+msgstr "可用性"
+
+#: plugins/infowidget/peerview.cpp:222
+msgid "Score"
+msgstr "分數"
+
+#: plugins/infowidget/peerview.cpp:223
+msgid "Upload Slot"
+msgstr "上傳槽"
+
+#: plugins/infowidget/peerview.cpp:224
+msgid "Requests"
+msgstr "要求"
+
+#: plugins/infowidget/peerview.cpp:249
+msgid ""
+"_: to kick\n"
+"Kick peer"
+msgstr ""
+
+#: plugins/infowidget/peerview.cpp:250
+#, fuzzy
+msgid ""
+"_: to ban\n"
+"Ban peer"
+msgstr "阻擋端點"
+
+#: plugins/infowidget/availabilitychunkbar.cpp:32
+msgid ""
+"<img src=\"available_color\">&nbsp; - Available Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Unavailable Chunks"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; 可用的區塊"
+"<br><img src=\"unavailable_color\">&nbsp; 不可用的區塊"
+"<br><img src=\"excluded_color\">&nbsp; 被排除的區塊"
+
+#: plugins/infowidget/infowidgetprefpage.cpp:34
+msgid "Information Widget Options"
+msgstr "資訊元件選項"
+
+#: plugins/infowidget/chunkbar.cpp:98
+msgid ""
+"<img src=\"available_color\">&nbsp; - Downloaded Chunks"
+"<br><img src=\"unavailable_color\">&nbsp; - Chunks to Download"
+"<br><img src=\"excluded_color\">&nbsp; - Excluded Chunks"
+msgstr ""
+"<img src=\"available_color\">&nbsp; 已下載的區塊"
+"<br><img src=\"unavailable_color\">&nbsp; 要下載的區塊"
+"<br><img src=\"excluded_color\">&nbsp; 被排除的區塊"
+
+#: plugins/ipfilter/convertdialog.cpp:81
+msgid "Convert"
+msgstr "轉換"
+
+#: plugins/ipfilter/convertdialog.cpp:102
+msgid "Loading txt file..."
+msgstr "載入文字檔中..."
+
+#: plugins/ipfilter/convertdialog.cpp:103
+msgid "Please wait..."
+msgstr "請稍候..."
+
+#: plugins/ipfilter/convertdialog.cpp:194
+msgid "File converted."
+msgstr "檔案已轉換。"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Could not load filter:"
+msgstr "無法載入過濾器:"
+
+#: plugins/ipfilter/convertdialog.cpp:199
+msgid "Bad filter file. It may be corrupted or has a bad format."
+msgstr "壞掉的過濾器檔案。也許已損毀,或格式不正確。"
+
+#: plugins/ipfilter/ipfilterplugin.cpp:43
+msgid "Filters out unwanted peers based on their IP address"
+msgstr ""
+
+#: plugins/ipfilter/ipfilterplugin.cpp:46
+#, fuzzy
+msgid "IP Filter"
+msgstr "IP 過濾器"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:70
+#: plugins/ipfilter/ipblockingprefpage.cpp:94
+msgid "Status: Loaded and running."
+msgstr "狀態:已載入並執行中。"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:76
+#: plugins/ipfilter/ipblockingprefpage.cpp:99
+msgid "Status: Not loaded."
+msgstr "狀態:未載入。"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:96
+msgid ""
+"Status: <font color=\"#ff0000\">Filter file not found.</font> "
+"Download and convert filter file."
+msgstr "狀態:<font color=\"#ff0000\">找不到過濾器檔案。</font>下載並轉換過濾器檔案。"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+msgid "Selected file already exists, do you want to download it again?"
+msgstr "選擇的檔案已存在,您要再下載一次嗎?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:117
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid "File Exists"
+msgstr "檔案已存在"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:194
+msgid ""
+"Filter file (level1.dat) already exists, do you want to convert it again?"
+msgstr "過濾器檔案(level1.dat)已存在。您要再轉換一次嗎?"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter"
+msgstr "IPBlocking 過濾器"
+
+#: plugins/ipfilter/ipblockingprefpage.cpp:223
+msgid "IPBlocking Filter Options"
+msgstr "IPBlocking 過濾器選項"
+
+#: plugins/stats/StatsPluginPrefs.cc:25 plugins/stats/statsplugin.cc:29
+#, fuzzy
+msgid "Statistics"
+msgstr "狀態"
+
+#: plugins/stats/StatsPluginPrefs.cc:25
+msgid "Statistics options"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:49
+#, fuzzy
+msgid "Leechers connected"
+msgstr "連線:"
+
+#: plugins/stats/StatsCon.cc:50
+#, fuzzy
+msgid "Leechers in swarms"
+msgstr "顯示系統匣圖示(&Y)"
+
+#: plugins/stats/StatsCon.cc:51
+#, fuzzy
+msgid "Seeders connected"
+msgstr "連線:"
+
+#: plugins/stats/StatsCon.cc:52
+#, fuzzy
+msgid "Seeders in swarms"
+msgstr "顯示系統匣圖示(&Y)"
+
+#: plugins/stats/StatsCon.cc:53
+#, fuzzy
+msgid "Average connected leechers per torrent"
+msgstr "每個 torrent 最大連線數:"
+
+#: plugins/stats/StatsCon.cc:54
+#, fuzzy
+msgid "Average connected seeders per torrent"
+msgstr "每個 torrent 最大連線數:"
+
+#: plugins/stats/StatsCon.cc:55
+msgid "Average connected leechers per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:56
+msgid "Average connected seeders per running torrent"
+msgstr ""
+
+#: plugins/stats/StatsCon.cc:61
+#, fuzzy
+msgid "Nodes"
+msgstr "無"
+
+#: plugins/stats/StatsCon.cc:62
+#, fuzzy
+msgid "Tasks"
+msgstr "追蹤器"
+
+#: plugins/stats/statsplugin.cc:29
+msgid "Shows transfers statistics"
+msgstr ""
+
+#: plugins/stats/statsplugin.cc:67
+#, fuzzy
+msgid "Speed statistics"
+msgstr "速度限制,以 KB/s 為單位"
+
+#: plugins/stats/statsplugin.cc:68
+#, fuzzy
+msgid "Connection statistics"
+msgstr "連線:"
+
+#: plugins/stats/StatsSpd.cc:57 plugins/stats/StatsSpd.cc:58
+#, fuzzy
+msgid "Current"
+msgstr "Torrent"
+
+#: plugins/stats/StatsSpd.cc:60 plugins/stats/StatsSpd.cc:61
+msgid "Average"
+msgstr ""
+
+#: plugins/stats/StatsSpd.cc:63 plugins/stats/StatsSpd.cc:64
+#, fuzzy
+msgid "Limit"
+msgstr "要限制嗎?(&U)"
+
+#: plugins/stats/StatsSpd.cc:71
+#, fuzzy
+msgid "Average from leecher"
+msgstr "平均下載速度:"
+
+#: plugins/stats/StatsSpd.cc:72
+#, fuzzy
+msgid "Average to leecher"
+msgstr "平均下載速度:"
+
+#: plugins/stats/StatsSpd.cc:73
+#, fuzzy
+msgid "Average from seeder"
+msgstr "平均下載速度:"
+
+#: plugins/stats/StatsSpd.cc:74
+#, fuzzy
+msgid "From leechers"
+msgstr "接收者:"
+
+#: plugins/stats/StatsSpd.cc:75
+#, fuzzy
+msgid "From seeders"
+msgstr "資料夾"
+
+#: plugins/stats/ChartDrawer.cc:419
+msgid "Legend"
+msgstr ""
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "Torrent files"
+msgstr "Torrent 檔案"
+
+#: plugins/partfileimport/importdialog.cpp:50
+msgid "All files"
+msgstr "所有檔案"
+
+#: plugins/partfileimport/importdialog.cpp:100
+#, c-format
+msgid "Cannot verify data : %1"
+msgstr "無法檢查資料:%1"
+
+#: plugins/partfileimport/importdialog.cpp:207
+#: plugins/partfileimport/importdialog.cpp:243
+#, c-format
+msgid "Cannot load the torrent file : %1"
+msgstr "無法載入 torrent 檔案:%1"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:43
+msgid "Imports partially or fully downloaded torrents from other clients"
+msgstr "從其他客戶端匯入部份或全部的已下載 torrent"
+
+#: plugins/partfileimport/partfileimportplugin.cpp:56
+msgid "Import existing download"
+msgstr "匯入已存在的下載"
+
+#: plugins/rssfeed/rss/testlibrss.cpp:14
+msgid "URL of feed"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedplugin.cpp:48
+#, fuzzy
+msgid ""
+"Automatically scans RSS feeds for torrent matching regular expressions and "
+"loads them."
+msgstr "自動掃描目錄中的 torrent 檔並載入。"
+
+#: plugins/rssfeed/rssfeedplugin.cpp:51 plugins/rssfeed/rssfeedplugin.cpp:68
+msgid "RSS Feeds"
+msgstr ""
+
+#: plugins/rssfeed/rsslinkdownloader.cpp:45
+#: plugins/rssfeed/rsslinkdownloader.cpp:183
+#, c-format
+msgid "Failed to find and download a valid torrent for %1"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Title"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78
+msgid "Description"
+msgstr "描述"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:78 plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Link"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Season"
+msgstr "最大比例:"
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+msgid "Episode"
+msgstr ""
+
+#: plugins/rssfeed/rssfeedmanager.cpp:87
+#, fuzzy
+msgid "Time"
+msgstr "剩餘時間"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler"
+msgstr "排程器"
+
+#: plugins/scheduler/schedulerprefpage.cpp:35
+msgid "Scheduler plugin options"
+msgstr "排程器外掛程式選項"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "MON"
+msgstr "週一"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "TUE"
+msgstr "週二"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "WED"
+msgstr "週三"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "THU"
+msgstr "週四"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "FRI"
+msgstr "週五"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SAT"
+msgstr "週六"
+
+#: plugins/scheduler/bwswidget.cpp:45
+msgid "SUN"
+msgstr "週日"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:165
+msgid "Schedule saved."
+msgstr "排程已儲存。"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:174
+msgid "File not found."
+msgstr "找不到檔案。"
+
+#: plugins/scheduler/bwsprefpagewidget.cpp:208
+msgid "Schedule loaded."
+msgstr "排程已載入。"
+
+#: plugins/scheduler/schedulerplugin.cpp:56
+msgid "Bandwidth scheduling plugin"
+msgstr "頻寬排程外掛程式"
+
+#: plugins/scheduler/schedulerplugin.cpp:97
+#: plugins/scheduler/schedulerplugin.cpp:137
+msgid "Open Bandwidth Scheduler"
+msgstr "開啟頻寬排程器"
+
+#: plugins/scheduler/schedulerplugin.cpp:130
+msgid ""
+"Bandwidth scheduler is disabled. Go to Preferences->Scheduler to enable it."
+msgstr "頻寬排程器已關閉。請到「喜好設定」>「排程器」來開啟。"
+
+#: plugins/logviewer/logprefpage.cpp:31
+msgid "LogViewer"
+msgstr "紀錄檢視器"
+
+#: plugins/logviewer/logviewerplugin.cpp:44
+#: plugins/logviewer/logviewerplugin.cpp:58
+#, fuzzy
+msgid "Log Viewer"
+msgstr "紀錄檢視器"
+
+#: plugins/logviewer/logviewerplugin.cpp:45
+msgid "Displays ktorrent logging output"
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:52
+#, fuzzy
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. "
+"<br> Then copy the URL in the addressbar after the search is finished, and "
+"paste it here."
+"<br>"
+"<br>Searching for %1 on Google for example, will result in "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8. "
+"<br> If you add this URL here, ktorrent can search using Google."
+msgstr ""
+"使用您的瀏覽器,在您要新增的搜尋引擎上搜尋字串 %1(大寫)。然後將網址列中的網址複製過來並貼到這裡。"
+"<br> 例如,在 Google 上搜尋 %2,會變成 "
+"http://www.google.com/search?q=FOOBAR&ie=UTF-8&oe=UTF-8 。如果您將此網址貼到這裡,KTorrent "
+"就可以使用 Google 搜尋。"
+
+#: plugins/search/searchprefpage.cpp:57
+msgid ""
+"Use your web browser to search for the string %1 (capital letters) on the "
+"search engine you want to add. Use the resulting URL below."
+msgstr ""
+
+#: plugins/search/searchprefpage.cpp:124
+msgid "You must enter the search engine's name and URL"
+msgstr "您必須輸入搜尋引擎的名稱與網址。"
+
+#: plugins/search/searchprefpage.cpp:137
+msgid ""
+"A search engine with the same name already exists. Please use a different name."
+msgstr "此搜尋引擎已存在。請用不同的名稱。"
+
+#: plugins/search/searchprefpage.cpp:146
+msgid ""
+"Bad URL. You should search for FOOBAR with your Internet browser and copy/paste "
+"the exact URL here."
+msgstr "錯誤的網址。您應該在您的瀏覽器上搜尋 FOOBAR 並剪貼網址到這裡。"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid ""
+"_: a noun\n"
+"Search"
+msgstr "搜尋"
+
+#: plugins/search/searchprefpage.cpp:247
+msgid "Search Engine Options"
+msgstr "搜尋引擎選項"
+
+#: plugins/search/searchwidget.cpp:178
+msgid "Searching for %1..."
+msgstr "搜尋 %1 中..."
+
+#: plugins/search/searchwidget.cpp:209
+msgid "torrent files"
+msgstr "torrent 檔案"
+
+#: plugins/search/searchwidget.cpp:267
+msgid "Search finished"
+msgstr "搜尋完成"
+
+#: plugins/search/searchtab.cpp:65
+#, fuzzy
+msgid " Engine: "
+msgstr "引擎"
+
+#: plugins/search/searchplugin.cpp:51
+msgid "Search for torrents on several popular torrent search engines"
+msgstr "在幾個常用的 torrent 搜尋引擎中搜尋 torrents"
+
+#: plugins/search/htmlpart.cpp:165
+msgid "Do you want to download or save the torrent?"
+msgstr "您要下載還是儲存此 torrent?"
+
+#: plugins/search/htmlpart.cpp:166
+msgid "Download Torrent"
+msgstr "下載 torrent"
+
+#: plugins/search/htmlpart.cpp:167
+msgid ""
+"_: to download\n"
+"Download"
+msgstr "下載"
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid "Zeroconf"
+msgstr ""
+
+#: plugins/zeroconf/zeroconfplugin.cpp:41
+msgid ""
+"Finds peers running ktorrent on the local network to share torrents with"
+msgstr ""
+
+#~ msgid "Cannot load chunk %1"
+#~ msgstr "無法載入區塊 %1"
+
+#, fuzzy
+#~ msgid "Alt+X"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "TrackerViewBase"
+#~ msgstr "追蹤器"
+
+#, fuzzy
+#~ msgid "Alt+N"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+S"
+#~ msgstr "Alt+1"
+
+#~ msgid "Country locator for InfoWidget plugin. Flags are taken from http://flags.blogpotato.de/ so thanks to them too."
+#~ msgstr "資訊元件外掛程式的國家定位器。國旗是參考 http://flags.blogpotato.de/ 在此一併致謝。"
+
+#~ msgid "You must add at least one tracker."
+#~ msgstr "您必須至少加入一個追蹤器。"
+
+#, fuzzy
+#~ msgid "DownloadPref"
+#~ msgstr "已下載"
+
+#, fuzzy
+#~ msgid "Alt+K"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+B"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+U"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+A"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+L"
+#~ msgstr "Alt+1"
+
+#~ msgid "Max ratio:"
+#~ msgstr "最大比例:"
+
+#~ msgid "Name"
+#~ msgstr "名稱"
+
+#~ msgid "Author"
+#~ msgstr "作者"
+
+#~ msgid "IP filter plugin, filters out unwanted peers"
+#~ msgstr "IP 過濾器外掛程式,過濾不要的端點"
+
+#~ msgid "Shows logging output in a widget"
+#~ msgstr "顯示紀錄輸出。"
+
+#, fuzzy
+#~ msgid "Download \"Proper\" ReReleases"
+#~ msgstr "已完成下載"
+
+#~ msgid "Tracker URL:"
+#~ msgstr "追蹤器網址:"
+
+#~ msgid "Tracker status:"
+#~ msgstr "追蹤器狀態:"
+
+#~ msgid "Specified udp port (%1) is unavailable or in use by another application. KTorrent is bound to port %2."
+#~ msgstr "指定的 UDP 連接埠(%1)無法使用,或是正被其他的應用程式使用中。KTorrent 改使用連接埠 %2。"
+
+#, fuzzy
+#~ msgid "Select folder for data of %1"
+#~ msgstr "選擇要儲存到哪個資料夾"
+
+#~ msgid "Downloads %1/%2"
+#~ msgstr "下載 %1/%2"
+
+#~ msgid "Uploads %1/%2"
+#~ msgstr "上傳 %1/%2"
+
+#, fuzzy
+#~ msgid "Search Engine:"
+#~ msgstr "搜尋引擎"
+
+#, fuzzy
+#~ msgid "Torrents"
+#~ msgstr "Torrent"
+
+#~ msgid "Tracker"
+#~ msgstr "追蹤器"
+
+#, fuzzy
+#~ msgid "St&atus"
+#~ msgstr "狀態"
+
+#~ msgid "You need to have default save directory selected to load torrents silently."
+#~ msgstr "您必須選擇預設的儲存目錄才能安靜地載入 torrent。"
+
+#, fuzzy
+#~ msgid "Alt+Y"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "InfoWidgetBase"
+#~ msgstr "資訊元件:"
+
+#~ msgid "Show \"torrent finished\" popup messages"
+#~ msgstr "顯示「Torrent 已完成」的訊息嗎"
+
+#~ msgid "Secure connection with other clients. May also help if your ISP is shaping your traffic."
+#~ msgstr "與其它客戶端進行安全連線。如果您的 ISP 在「整頓」您的交通時可能有幫助。"
+
+#, fuzzy
+#~ msgid "Tracker request timed out"
+#~ msgstr "追蹤器狀態:"
+
+#, fuzzy
+#~ msgid "Alt+G"
+#~ msgstr "Alt+1"
+
+#, fuzzy
+#~ msgid "Alt+Z"
+#~ msgstr "Alt+1"
+
+#~ msgid "finished"
+#~ msgstr "已完成"
+
+#~ msgid "Cannot bind to port %1 or the 10 following ports."
+#~ msgstr "無法使用連接埠 %1 或是接下來的十個連接埠。"
+
+#, fuzzy
+#~ msgid "You will lose all data in the deselected file(s), are you sure you want to do this ?"
+#~ msgstr "若是您取消選擇檔案。您將失去所有檔案中的資料。您確定要這樣做嗎?"
+
+#, fuzzy
+#~ msgid "Search engines"
+#~ msgstr "搜尋引擎"
+
+#, fuzzy
+#~ msgid "Download Completed"
+#~ msgstr "已完成下載"
+
+#, fuzzy
+#~ msgid "Seeding Completed"
+#~ msgstr "已完成下載"
+
+#~ msgid "Completed"
+#~ msgstr "已完成"
+
+#~ msgid "If you deselect a directory, you will lose all the data off all files in this directory. Are you sure you want to do this ?"
+#~ msgstr "若是您取消選取目錄,您將失去目錄中所有檔案的資料。您確定要這樣做嗎?"
+
+#~ msgid "Torrent moved to download panel"
+#~ msgstr "Torrent 已移到下載面板"
+
+#~ msgid "<b>%1</b> torrent has been moved to download panel."
+#~ msgstr "<b>%1</b> torrent 已被移到下載面板。"
+
+#, fuzzy
+#~ msgid "Alt+C"
+#~ msgstr "Alt+1"
+
+#~ msgid "Unreachable"
+#~ msgstr "無法到達"
+
+#~ msgid "Parse error"
+#~ msgstr "剖析錯誤"
+
+#, fuzzy
+#~ msgid "SearchBar"
+#~ msgstr "搜尋"
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 download. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n downloads. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr "無法啟動 %n 個以上的下載工作。請到「設定」>「設定 KTorrent」中改變此限制。"
+
+#~ msgid ""
+#~ "_n: Cannot start more than 1 seed. Go to Settings -> Configure KTorrent, if you want to change the limit.\n"
+#~ "Cannot start more than %n seeds. Go to Settings -> Configure KTorrent, if you want to change the limit."
+#~ msgstr "無法啟動 %n 個以上的 seed。請到「設定」>「設定 KTorrent」中改變此限制。"
diff --git a/utests/Makefile.am b/utests/Makefile.am
new file mode 100644
index 0000000..eb25f53
--- /dev/null
+++ b/utests/Makefile.am
@@ -0,0 +1,12 @@
+INCLUDES = -I$(srcdir)/../libktorrent -I$(srcdir)/.. $(all_includes)
+METASOURCES = AUTO
+noinst_HEADERS = unittest.h testrunner.h upnpparsedescriptiontest.h \
+ upnpparseresponsetest.h dhtmsgparsetest.h biginttest.h rc4test.h difflehellmantest.h
+bin_PROGRAMS = ktutester
+ktutester_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+ktutester_SOURCES = unittest.cpp testrunner.cpp main.cpp \
+ upnpparsedescriptiontest.cpp upnpparseresponsetest.cpp dhtmsgparsetest.cpp biginttest.cpp \
+ rc4test.cpp difflehellmantest.cpp
+ktutester_LDADD = ../plugins/upnp/libktupnp.la \
+ ../libktorrent/libktorrent.la
+KDE_CXXFLAGS = $(USE_EXCEPTIONS) $(USE_RTTI)
diff --git a/utests/biginttest.cpp b/utests/biginttest.cpp
new file mode 100644
index 0000000..fc8f105
--- /dev/null
+++ b/utests/biginttest.cpp
@@ -0,0 +1,82 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdio.h>
+#include <mse/bigint.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "biginttest.h"
+
+using namespace bt;
+using namespace mse;
+
+namespace utest
+{
+
+ BigIntTest::BigIntTest() : UnitTest("BigIntTest")
+ {}
+
+
+ BigIntTest::~BigIntTest()
+ {}
+
+ static void PrintBigInt(BigInt & b)
+ {
+ Uint8 buf[10];
+ memset(buf,0,10);
+ b.toBuffer(buf,10);
+ for (Uint32 i = 0;i < 10;i++)
+ {
+ Out() << QString("0x%1 ").arg(buf[i],0,16);
+ }
+ Out() << endl;
+ }
+
+ bool BigIntTest::doTest()
+ {
+ Out() << "First test : " << endl;
+ BigInt a("0x1E");
+ BigInt b("0x42");
+ BigInt c("0xFFFFEE");
+ BigInt d = BigInt::powerMod(a,b,c);
+ PrintBigInt(a);
+ PrintBigInt(b);
+ PrintBigInt(c);
+ PrintBigInt(d);
+ Out() << "Second test : " << endl;
+ Uint8 test[] = {0xAB,0x12,0x34,0xE4,0xF6};
+ a = BigInt::fromBuffer(test,5);
+ PrintBigInt(a);
+ Uint8 foobar[5];
+ a.toBuffer(foobar,5);
+ for (Uint32 i = 0;i < 5;i++)
+ {
+ Out() << QString("0x%1 ").arg(foobar[i],0,16);
+ }
+ Out() << endl;
+ Out() << "Third test" << endl;
+ a = BigInt("0xABCD1234");
+ PrintBigInt(a);
+ a.toBuffer(foobar,4);
+ c = BigInt::fromBuffer(foobar,4);
+ PrintBigInt(c);
+ return true;
+ }
+
+}
diff --git a/utests/biginttest.h b/utests/biginttest.h
new file mode 100644
index 0000000..2e4073b
--- /dev/null
+++ b/utests/biginttest.h
@@ -0,0 +1,42 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTBIGINTTEST_H
+#define UTESTBIGINTTEST_H
+
+#include "unittest.h"
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class BigIntTest : public UnitTest
+ {
+ public:
+ BigIntTest();
+ virtual ~BigIntTest();
+
+ virtual bool doTest();
+ };
+
+}
+
+#endif
diff --git a/utests/dhtmsgparsetest.cpp b/utests/dhtmsgparsetest.cpp
new file mode 100644
index 0000000..44e0338
--- /dev/null
+++ b/utests/dhtmsgparsetest.cpp
@@ -0,0 +1,108 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <torrent/bdecoder.h>
+#include <torrent/bnode.h>
+#include <kademlia/rpcmsg.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "dhtmsgparsetest.h"
+
+using namespace dht;
+using namespace bt;
+
+namespace utest
+{
+
+
+ DHTMsgParseTest::DHTMsgParseTest() : UnitTest("DHTMsgParseTest")
+ {}
+
+
+ DHTMsgParseTest::~DHTMsgParseTest()
+ {}
+
+ bool DHTMsgParseTest::doTest(const QString & data,int method)
+ {
+ QByteArray bdata(data.length());
+
+ for (int i = 0;i < data.length();i++)
+ {
+ bdata[i] = data[i];
+ }
+
+ BDecoder bdec(bdata,false);
+
+ BNode* n = bdec.decode();
+ if (n->getType() != BNode::DICT)
+ {
+ delete n;
+ Out() << "Packet does not contain a dictionary" << endl;
+ return false;
+ }
+
+ MsgBase* msg = MakeRPCMsgTest((BDictNode*)n,(dht::Method)method);
+ if (!msg)
+ {
+ delete n;
+ Out() << "Error parsing message : " << endl;
+ return false;
+ }
+ delete msg;
+ delete n;
+ return true;
+ }
+
+
+
+ bool DHTMsgParseTest::doTest()
+ {
+
+ QString test_str[] = {
+ "d1:rd2:id20:####################5:token20:####################6:valuesl6:######6:######6:######6:######6:######6:######6:######6:######ee1:t1:#1:y1:re",
+
+ "d1:ad2:id20:####################9:info_hash20:####################e1:q9:get_peers1:t1:#1:y1:qe",
+
+ "d1:rd2:id20:####################5:nodes208:################################################################################################################################################################################################################5:token20:####################e1:t1:#1:y1:re",
+
+ QString::null
+ };
+
+ int types[] = {dht::GET_PEERS,dht::NONE,dht::GET_PEERS};
+
+ int i = 0;
+ while (!test_str[i].isNull())
+ {
+ // read and decode the packet
+ if (!doTest(test_str[i],types[i]))
+ {
+ Out() << "Testing packet " << i << " : Failed" << endl;
+ return false;
+ }
+ else
+ {
+ Out() << "Testing packet " << i << " : OK" << endl;
+ }
+ i++;
+ }
+
+ return true;
+ }
+
+}
diff --git a/utests/dhtmsgparsetest.h b/utests/dhtmsgparsetest.h
new file mode 100644
index 0000000..c88ec72
--- /dev/null
+++ b/utests/dhtmsgparsetest.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTDHTMSGPARSETEST_H
+#define UTESTDHTMSGPARSETEST_H
+
+#include <unittest.h>
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class DHTMsgParseTest : public UnitTest
+ {
+ public:
+ DHTMsgParseTest();
+ virtual ~DHTMsgParseTest();
+
+ virtual bool doTest();
+ private:
+ bool doTest(const QString & data,int method);
+ };
+
+}
+
+#endif
diff --git a/utests/difflehellmantest.cpp b/utests/difflehellmantest.cpp
new file mode 100644
index 0000000..b261d5a
--- /dev/null
+++ b/utests/difflehellmantest.cpp
@@ -0,0 +1,58 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdio.h>
+#include <mse/bigint.h>
+#include <mse/functions.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "difflehellmantest.h"
+
+using namespace bt;
+using namespace mse;
+
+namespace utest
+{
+
+ DiffleHellmanTest::DiffleHellmanTest()
+ : UnitTest("DiffleHellman")
+ {}
+
+
+ DiffleHellmanTest::~DiffleHellmanTest()
+ {}
+
+
+ bool DiffleHellmanTest::doTest()
+ {
+ BigInt xa,ya,xb,yb;
+ mse::GeneratePublicPrivateKey(xa,ya);
+ mse::GeneratePublicPrivateKey(xb,yb);
+ mse::DumpBigInt("Xa",xa);
+ mse::DumpBigInt("Ya",ya);
+ mse::DumpBigInt("Xb",xb);
+ mse::DumpBigInt("Yb",yb);
+
+ mse::DumpBigInt("Sa",mse::DHSecret(xa,yb));
+ mse::DumpBigInt("Sb",mse::DHSecret(xb,ya));
+ return true;
+ }
+
+}
diff --git a/utests/difflehellmantest.h b/utests/difflehellmantest.h
new file mode 100644
index 0000000..c065894
--- /dev/null
+++ b/utests/difflehellmantest.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTDIFFLEHELLMANTEST_H
+#define UTESTDIFFLEHELLMANTEST_H
+
+#include "unittest.h"
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class DiffleHellmanTest : public UnitTest
+ {
+ public:
+ DiffleHellmanTest();
+
+ ~DiffleHellmanTest();
+
+ virtual bool doTest();
+
+ };
+
+}
+
+#endif
diff --git a/utests/main.cpp b/utests/main.cpp
new file mode 100644
index 0000000..7618cac
--- /dev/null
+++ b/utests/main.cpp
@@ -0,0 +1,52 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <libktorrent/util/log.h>
+#include <libktorrent/torrent/globals.h>
+#include "testrunner.h"
+#include "upnpparsedescriptiontest.h"
+#include "upnpparseresponsetest.h"
+#include "dhtmsgparsetest.h"
+#include "biginttest.h"
+#include "rc4test.h"
+#include "difflehellmantest.h"
+
+using namespace kt;
+using namespace bt;
+using namespace utest;
+
+
+
+int main(int argc,char** argv)
+{
+ Globals::instance().setDebugMode(true);
+ Globals::instance().initLog("ktutester.log");
+ TestRunner tr;
+ tr.addTest(new UPnPParseDescriptionTest());
+ tr.addTest(new UPnPParseResponseTest());
+ tr.addTest(new DHTMsgParseTest());
+ tr.addTest(new BigIntTest());
+ tr.addTest(new RC4Test());
+ tr.addTest(new DiffleHellmanTest());
+ tr.doAllTests();
+ Globals::cleanup();
+ return 0;
+}
diff --git a/utests/rc4test.cpp b/utests/rc4test.cpp
new file mode 100644
index 0000000..ef5e7c4
--- /dev/null
+++ b/utests/rc4test.cpp
@@ -0,0 +1,95 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <stdio.h>
+#include <mse/rc4encryptor.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "rc4test.h"
+
+using namespace bt;
+using namespace mse;
+
+namespace utest
+{
+
+ RC4Test::RC4Test() : UnitTest("RC4")
+ {}
+
+
+ RC4Test::~RC4Test()
+ {}
+
+
+ bool RC4Test::doTest()
+ {
+ bool ret1 = firstTest();
+ bool ret2 = secondTest();
+ return ret1 && ret2;
+ }
+
+ bool RC4Test::firstTest()
+ {
+ Out() << "First RC4 test" << endl;
+ SHA1Hash a = SHA1Hash::generate((Uint8*)"keyA",4);
+ SHA1Hash b = SHA1Hash::generate((Uint8*)"keyB",4);
+
+ RC4Encryptor as(b,a);
+ RC4Encryptor bs(a,b);
+ char* test = "Dit is een test";
+ int tlen = strlen(test);
+ Uint8* dec = (Uint8*)as.encrypt((Uint8*)test,tlen);
+ bs.decrypt(dec,tlen);
+ if (memcmp(dec,test,tlen) == 0)
+ {
+ Out() << "Test succesfull" << endl;
+ Out() << QString(test) << endl;
+ Out() << QString((char*)dec) << endl;
+ return true;
+ }
+ else
+ {
+ Out() << "Test not succesfull" << endl;
+ Out() << QString(test) << endl;
+ Out() << QString((char*)dec) << endl;
+ return false;
+ }
+ }
+
+ bool RC4Test::secondTest()
+ {
+ Out() << "Second RC4 test" << endl;
+ Uint8 output[100];
+ Uint8 result[] = {0xbb,0xf3,0x16, 0xe8 , 0xd9, 0x40, 0xaf,0x0a ,0xd3 };
+ // RC4( "Key", "Plaintext" ) == "bbf316e8 d940af0a d3"
+ char* key = "Key";
+ char* pt = "Plaintext";
+ RC4 enc((const Uint8*)key,3);
+ enc.process((const Uint8*)pt,output,strlen(pt));
+
+ for (Uint32 i = 0;i < strlen(pt);i++)
+ {
+ if (output[i] != result[i])
+ return false;
+ }
+
+ return true;
+ }
+
+}
diff --git a/utests/rc4test.h b/utests/rc4test.h
new file mode 100644
index 0000000..b92afae
--- /dev/null
+++ b/utests/rc4test.h
@@ -0,0 +1,46 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTRC4TEST_H
+#define UTESTRC4TEST_H
+
+#include "unittest.h"
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class RC4Test : public UnitTest
+ {
+ public:
+ RC4Test();
+ virtual ~RC4Test();
+
+ virtual bool doTest();
+
+ private:
+ bool firstTest();
+ bool secondTest();
+ };
+
+}
+
+#endif
diff --git a/utests/testrunner.cpp b/utests/testrunner.cpp
new file mode 100644
index 0000000..d518c17
--- /dev/null
+++ b/utests/testrunner.cpp
@@ -0,0 +1,76 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <util/log.h>
+#include <util/error.h>
+#include <torrent/globals.h>
+#include "testrunner.h"
+
+using namespace bt;
+
+namespace utest
+{
+
+ TestRunner::TestRunner()
+ {
+ tests.setAutoDelete(true);
+ }
+
+
+ TestRunner::~TestRunner()
+ {}
+
+ void TestRunner::addTest(UnitTest* ut)
+ {
+ tests.append(ut);
+ }
+
+ void TestRunner::doAllTests()
+ {
+ int succes = 0;
+ int failure = 0;
+ QPtrList<UnitTest>::iterator i = tests.begin();
+ while (i != tests.end())
+ {
+ Out() << "======================" << endl;
+ UnitTest* t = *i;
+ bool res = false;
+ try
+ {
+ res = t->doTest();
+ }
+ catch (bt::Error & err)
+ {
+ Out() << "Caught Error : " << err.toString() << endl;
+ res = false;
+ }
+ bt::Out() << "Doing test " << t->getName() << " : " << (res ? "SUCCES" : "FAILURE") << endl;
+ if (res)
+ succes++;
+ else
+ failure++;
+ i++;
+ }
+
+ Out() << "======================" << endl;
+ Out() << "Summary : " << endl;
+ Out() << "\t" << succes << " succesfull tests" << endl;
+ Out() << "\t" << failure << " failed tests" << endl;
+ }
+}
diff --git a/utests/testrunner.h b/utests/testrunner.h
new file mode 100644
index 0000000..c4e7623
--- /dev/null
+++ b/utests/testrunner.h
@@ -0,0 +1,45 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTTESTRUNNER_H
+#define UTESTTESTRUNNER_H
+
+#include <qptrlist.h>
+#include "unittest.h"
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class TestRunner
+ {
+ QPtrList<UnitTest> tests;
+ public:
+ TestRunner();
+ virtual ~TestRunner();
+
+ void addTest(UnitTest* ut);
+ void doAllTests();
+ };
+
+}
+
+#endif
diff --git a/utests/unittest.cpp b/utests/unittest.cpp
new file mode 100644
index 0000000..458ff8b
--- /dev/null
+++ b/utests/unittest.cpp
@@ -0,0 +1,33 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 "unittest.h"
+
+namespace utest
+{
+
+ UnitTest::UnitTest(const QString & name) : name(name)
+ {}
+
+
+ UnitTest::~UnitTest()
+ {}
+
+
+}
diff --git a/utests/unittest.h b/utests/unittest.h
new file mode 100644
index 0000000..6fd46d8
--- /dev/null
+++ b/utests/unittest.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTUNITTEST_H
+#define UTESTUNITTEST_H
+
+#include <qstring.h>
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+
+ Base class for all unit tests
+ */
+ class UnitTest
+ {
+ QString name;
+ public:
+ UnitTest(const QString & name);
+ virtual ~UnitTest();
+
+ QString getName() const {return name;}
+
+ virtual bool doTest() = 0;
+ };
+
+}
+
+#endif
diff --git a/utests/upnpparsedescriptiontest.cpp b/utests/upnpparsedescriptiontest.cpp
new file mode 100644
index 0000000..bbccfdd
--- /dev/null
+++ b/utests/upnpparsedescriptiontest.cpp
@@ -0,0 +1,433 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <qfile.h>
+#include <plugins/upnp/upnprouter.h>
+#include <plugins/upnp/upnpdescriptionparser.h>
+#include <util/fileops.h>
+#include <util/error.h>
+#include <util/log.h>
+#include <torrent/globals.h>
+#include "upnpparsedescriptiontest.h"
+
+using namespace kt;
+using namespace bt;
+
+namespace utest
+{
+ static char* test_data1 = "<?xml version=\"1.0\"?>\n"
+ "<root xmlns=\"urn:schemas-upnp-org:device-1-0\">\n"
+ "<specVersion>\n"
+ "<major>1</major>\n"
+ "<minor>0</minor>\n"
+ "</specVersion>\n"
+ "<URLBase>http://192.168.0.1:5678</URLBase>\n"
+ "<device>\n"
+ "<deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>\n"
+ "<presentationURL>http://192.168.0.1:80</presentationURL>\n"
+ "<friendlyName>D-Link Router</friendlyName>\n"
+ "<manufacturer>D-Link</manufacturer>\n"
+ "<manufacturerURL>http://www.dlink.com</manufacturerURL>\n"
+ "<modelDescription>Internet Access Router</modelDescription>\n"
+ "<modelName>D-Link Router</modelName>\n"
+ "<UDN>uuid:upnp-InternetGatewayDevice-1_0-12345678900001</UDN>\n"
+ "<UPC>123456789001</UPC>\n"
+ "<serviceList>\n"
+ "<service>\n"
+ "<serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType>\n"
+ "<serviceId>urn:upnp-org:serviceId:L3Forwarding1</serviceId>\n"
+ "<controlURL>/Layer3Forwarding</controlURL>\n"
+ "<eventSubURL>/Layer3Forwarding</eventSubURL>\n"
+ "<SCPDURL>/Layer3Forwarding.xml</SCPDURL>\n"
+ "</service>\n"
+ "</serviceList>\n"
+ "<deviceList>\n"
+ "<device>\n"
+ "<deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>\n"
+ "<friendlyName>WANDevice</friendlyName>\n"
+ "<manufacturer>D-Link</manufacturer>\n"
+ "<manufacturerURL>http://www.dlink.com</manufacturerURL>\n"
+ "<modelDescription>Internet Access Router</modelDescription>\n"
+ "<modelName>D-Link Router</modelName>\n"
+ "<modelNumber>1</modelNumber>\n"
+ "<modelURL>http://support.dlink.com</modelURL>\n"
+ "<serialNumber>12345678900001</serialNumber>\n"
+ "<UDN>uuid:upnp-WANDevice-1_0-12345678900001</UDN>\n"
+ "<UPC>123456789001</UPC>\n"
+ "<serviceList>\n"
+ "<service>\n"
+ "<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>\n"
+ "<serviceId>urn:upnp-org:serviceId:WANCommonInterfaceConfig</serviceId>\n"
+ "<controlURL>/WANCommonInterfaceConfig</controlURL>\n"
+ "<eventSubURL>/WANCommonInterfaceConfig</eventSubURL>\n"
+ "<SCPDURL>/WANCommonInterfaceConfig.xml</SCPDURL>\n"
+ "</service>\n"
+ "</serviceList>\n"
+ "<deviceList>\n"
+ "<device>\n"
+ "<deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>\n"
+ "<friendlyName>WAN Connection Device</friendlyName>\n"
+ "<manufacturer>D-Link</manufacturer>\n"
+ "<manufacturerURL>http://www.dlink.com</manufacturerURL>\n"
+ "<modelDescription>Internet Access Router</modelDescription>\n"
+ "<modelName>D-Link Router</modelName> \n"
+ "<modelNumber>1</modelNumber>\n"
+ "<modelURL>http://support.dlink.com</modelURL>\n"
+ "<serialNumber>12345678900001</serialNumber>\n"
+ "<UDN>uuid:upnp-WANConnectionDevice-1_0-12345678900001</UDN>\n"
+ "<UPC>123456789001</UPC>\n"
+ "<serviceList>\n"
+ "<service>\n"
+ "<serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>\n"
+ "<serviceId>urn:upnp-org:serviceId:WANIPConnection</serviceId> \n"
+ "<controlURL>/WANIPConnection</controlURL>\n"
+ "<eventSubURL>/WANIPConnection</eventSubURL>\n"
+ "<SCPDURL>/WANIPConnection.xml</SCPDURL>\n"
+ "</service>\n"
+ "</serviceList>\n"
+ "</device>\n"
+ "</deviceList>\n"
+ "</device>\n"
+ "</deviceList>\n"
+ "</device>\n"
+ "</root>";
+
+ static const char* test_data2 = "<?xml version=\"1.0\"?> \n"
+ "<root xmlns=\"urn:schemas-upnp-org:device-1-0\"> \n"
+ "<specVersion> \n"
+ "<major>1</major> \n"
+ "<minor>0</minor> \n"
+ "</specVersion> \n"
+ "<URLBase>http://192.168.1.1:52869</URLBase> \n"
+ "<device> \n"
+ "<deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType> \n"
+ "<friendlyName>DLINK Internet Gateway Device</friendlyName> \n"
+ "<manufacturer>DLINK</manufacturer> \n"
+ "<manufacturerURL>http://www.dlink.com</manufacturerURL> \n"
+ "<modelName>DLINK IGD</modelName> \n"
+ "<UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN> \n"
+ "<iconList> \n"
+ "<icon> \n"
+ "<mimetype>image/gif</mimetype> \n"
+ "<width>118</width> \n"
+ "<height>119</height> \n"
+ "<depth>8</depth> \n"
+ "<url>/ligd.gif</url> \n"
+ "</icon> \n"
+ "</iconList> \n"
+ "<serviceList> \n"
+ "<service> \n"
+ "<serviceType>urn:schemas-microsoft-com:service:OSInfo:1</serviceType> \n"
+ "<serviceId>urn:microsoft-com:serviceId:OSInfo1</serviceId> \n"
+ "<controlURL>/upnp/control/OSInfo1</controlURL> \n"
+ "<eventSubURL>/upnp/event/OSInfo1</eventSubURL> \n"
+ "<SCPDURL>/gateinfoSCPD.xml</SCPDURL> \n"
+ "</service> \n"
+ "</serviceList> \n"
+ "<deviceList> \n"
+ "<device> \n"
+ "<deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType> \n"
+ "<friendlyName>WANDevice</friendlyName> \n"
+ "<manufacturer>DLINK</manufacturer> \n"
+ "<manufacturerURL>http://www.dlink.com</manufacturerURL> \n"
+ "<modelDescription>WAN Device on DLINK IGD</modelDescription> \n"
+ "<modelName>DLINK IGD</modelName> \n"
+ "<modelNumber>0.92</modelNumber> \n"
+ "<modelURL>http://www.dlink.com</modelURL> \n"
+ "<serialNumber>0.92</serialNumber> \n"
+ "<UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN> \n"
+ "<UPC>DLINK IGD</UPC> \n"
+ "<serviceList> \n"
+ "<service> \n"
+ "<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType> \n"
+ "<serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId> \n"
+ "<controlURL>/upnp/control/WANCommonIFC1</controlURL> \n"
+ "<eventSubURL>/upnp/control/WANCommonIFC1</eventSubURL> \n"
+ "<SCPDURL>/gateicfgSCPD.xml</SCPDURL> \n"
+ "</service> \n"
+ "</serviceList> \n"
+ "<deviceList> \n"
+ "<device> \n"
+ "<deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType> \n"
+ "<friendlyName>WANConnectionDevice</friendlyName> \n"
+ "<manufacturer>DLINK</manufacturer> \n"
+ "<manufacturerURL>http://www.dlink.com</manufacturerURL> \n"
+ "<modelDescription>WanConnectionDevice on DLINK IGD</modelDescription> \n"
+ "<modelName>DLINK IGD</modelName> \n"
+ "<modelNumber>0.92</modelNumber> \n"
+ "<modelURL>http://www.dlink.com</modelURL> \n"
+ "<serialNumber>0.92</serialNumber> \n"
+ "<UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN> \n"
+ "<UPC>DLINK IGD</UPC> \n"
+ "<serviceList> \n"
+ "<service> \n"
+ "<serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType> \n"
+ "<serviceId>urn:upnp-org:serviceId:WANIPConn1</serviceId> \n"
+ "<controlURL>/upnp/control/WANIPConn1</controlURL> \n"
+ "<eventSubURL>/upnp/control/WANIPConn1</eventSubURL> \n"
+ "<SCPDURL>/gateconnSCPD.xml</SCPDURL> \n"
+ "</service> \n"
+ "</serviceList> \n"
+ "</device> \n"
+ "</deviceList> \n"
+ "</device> \n"
+ "</deviceList> \n"
+ "<presentationURL>http://192.168.1.1/</presentationURL> \n"
+ "</device> \n"
+ "</root> ";
+
+ static const char* test_data3 = "<?xml version=\"1.0\"?> \
+ <root xmlns=\"urn:schemas-upnp-org:device-1-0\"> \
+ <specVersion> \
+ <major>1</major> \
+ <minor>0</minor> \
+ </specVersion> \
+ <URLBase>http://192.168.0.5:5431/</URLBase> \
+ <device> \
+ <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType> \
+ <presentationURL>http://192.168.0.5:80/</presentationURL> \
+ <friendlyName>Dynalink Wireless ADSL Router</friendlyName> \
+ <manufacturer>Danalink</manufacturer> \
+ <manufacturerURL>http://www.dynalink.co.nz/</manufacturerURL> \
+ <modelDescription>Broadcom single-chip ADSL router</modelDescription> \
+ <modelName>BCM6345+BCM4306</modelName> \
+ <modelNumber>1.0</modelNumber> \
+ <modelURL>http://www.dynalink.co.nz/</modelURL> \
+ <UDN>uuid:10740000-0000-1000-b710-107c0032dca6</UDN> \
+ <serviceList> \
+ <service> \
+ <serviceType>urn:schemas-upnp-org:service:Layer3Forwarding:1</serviceType> \
+ <serviceId>urn:upnp-org:serviceId:Layer3Forwarding:11</serviceId> \
+ <controlURL>/uuid:10740000-0000-1000-b710-107c0032dca6/Layer3Forwarding:1</controlURL> \
+ <eventSubURL>/uuid:10740000-0000-1000-b710-107c0032dca6/Layer3Forwarding:1</eventSubURL> \
+ <SCPDURL>/dynsvc/Layer3Forwarding:1.xml</SCPDURL> \
+ </service> \
+ </serviceList> \
+ <deviceList> \
+ <device> \
+ <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType> \
+ <friendlyName>urn:schemas-upnp-org:device:WANDevice:1</friendlyName> \
+ <manufacturer>Danalink</manufacturer> \
+ <manufacturerURL>http://www.dynalink.co.nz/</manufacturerURL> \
+ <modelDescription>Broadcom single-chip ADSL router</modelDescription> \
+ <modelName>BCM6345+BCM4306</modelName> \
+ <modelNumber>1.0</modelNumber> \
+ <modelURL>http://www.dynalink.co.nz/</modelURL> \
+ <UDN>uuid:10740000-0000-1000-b710-107c0132dca6</UDN> \
+ <serviceList> \
+ <service> \
+ <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType> \
+ <serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId> \
+ <controlURL>/uuid:10740000-0000-1000-b710-107c0132dca6/WANCommonInterfaceConfig:1</controlURL> \
+ <eventSubURL>/uuid:10740000-0000-1000-b710-107c0132dca6/WANCommonInterfaceConfig:1</eventSubURL> \
+ <SCPDURL>/dynsvc/WANCommonInterfaceConfig:1.xml</SCPDURL> \
+ </service> \
+ </serviceList> \
+ <deviceList> \
+ <device> \
+ <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType> \
+ <friendlyName>urn:schemas-upnp-org:device:WANConnectionDevice:1</friendlyName> \
+ <manufacturer>Danalink</manufacturer> \
+ <manufacturerURL>http://www.dynalink.co.nz/</manufacturerURL> \
+ <modelDescription>Broadcom single-chip ADSL router</modelDescription> \
+ <modelName>BCM6345+BCM4306</modelName> \
+ <modelNumber>1.0</modelNumber> \
+ <modelURL>http://www.dynalink.co.nz/</modelURL> \
+ <UDN>uuid:10740000-0000-1000-b710-107c0232dca6</UDN> \
+ <serviceList> \
+ <service> \
+ <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> \
+ <serviceId>urn:upnp-org:serviceId:WANPPPConn1</serviceId> \
+ <controlURL>/uuid:10740000-0000-1000-b710-107c0232dca6/WANPPPConnection:1</controlURL> \
+ <eventSubURL>/uuid:10740000-0000-1000-b710-107c0232dca6/WANPPPConnection:1</eventSubURL> \
+ <SCPDURL>/dynsvc/WANPPPConnection:1.xml</SCPDURL> \
+ </service> \
+ </serviceList> \
+ </device> \
+ </deviceList> \
+ </device> \
+ </deviceList> \
+ </device> \
+ </root> ";
+
+ const char* test_data4 = "<?xml version=\"1.0\"?> \
+ <root xmlns=\"urn:schemas-upnp-org:device-1-0\"> \
+ <specVersion> \
+ <major>1</major> \
+ <minor>0</minor> \
+ </specVersion> \
+ <URLBase>http://192.168.1.1:2869</URLBase> \
+ <device> \
+ <deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType> \
+ <friendlyName>OpenWrt Linux Internet Gateway Device</friendlyName> \
+ <manufacturer>OpenWrt Project</manufacturer> \
+ <manufacturerURL>http://www.openwrt.org</manufacturerURL> \
+ <modelName>WRT54G(S)</modelName> \
+ <UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN> \
+ <iconList> \
+ <icon> \
+ <mimetype>image/gif</mimetype> \
+ <width>118</width> \
+ <height>119</height>\
+ <depth>8</depth> \
+ <url>/ligd.gif</url> \
+ </icon> \
+ </iconList> \
+ <serviceList> \
+ <service> \
+ <serviceType>urn:schemas-microsoft-com:service:OSInfo:1</serviceType> \
+ <serviceId>urn:microsoft-com:serviceId:OSInfo1</serviceId> \
+ <controlURL>/upnp/control/OSInfo1</controlURL> \
+ <eventSubURL>/upnp/event/OSInfo1</eventSubURL> \
+ <SCPDURL>/gateinfoSCPD.xml</SCPDURL> \
+ </service> \
+ </serviceList> \
+ <deviceList> \
+ <device> \
+ <deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType> \
+ <friendlyName>WANDevice</friendlyName> \
+ <manufacturer>OpenWrt Project</manufacturer> \
+ <manufacturerURL>http://www.openwrt.org</manufacturerURL> \
+ <modelDescription>WAN Device on OpenWrt Router</modelDescription> \
+ <modelName>WRT54G(S)</modelName> \
+ <modelNumber>1.0</modelNumber> \
+ <modelURL>http://www.linksys.com</modelURL> \
+ <serialNumber>XXXXXXXXXX</serialNumber> \
+ <UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN> \
+ <UPC>Linux IGD</UPC> \
+ <serviceList> \
+ <service> \
+ <serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType> \
+ <serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId> \
+ <controlURL>/upnp/control/WANCommonIFC1</controlURL> \
+ <eventSubURL>/upnp/control/WANCommonIFC1</eventSubURL> \
+ <SCPDURL>/gateicfgSCPD.xml</SCPDURL> \
+ </service> \
+ </serviceList> \
+ <deviceList> \
+ <device> \
+ <deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType> \
+ <friendlyName>WANConnectionDevice</friendlyName> \
+ <manufacturer>OpenWrt Project</manufacturer> \
+ <manufacturerURL>http://www.openwrt.org</manufacturerURL> \
+ <modelDescription>WanConnectionDevice on OpenWrt Router</modelDescription> \
+ <modelName>WRT54G(S)</modelName> \
+ <modelNumber>1.0</modelNumber> \
+ <modelURL>http://www.linksys.com</modelURL> \
+ <serialNumber>XXXXXXXXXX</serialNumber> \
+ <UDN>uuid:75802409-bccb-40e7-8e6c-fa095ecce13e</UDN> \
+ <UPC>Linux IGD</UPC> \
+ <serviceList> \
+ <service> \
+ <serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType> \
+ <serviceId>urn:upnp-org:serviceId:WANIPConn1</serviceId> \
+ <controlURL>/upnp/control/WANIPConn1</controlURL> \
+ <eventSubURL>/upnp/control/WANIPConn1</eventSubURL> \
+ <SCPDURL>/gateconnSCPD.xml</SCPDURL> \
+ </service> \
+ </serviceList> \
+ </device> \
+ </deviceList> \
+ </device> \
+ </deviceList> \
+ <presentationURL>http://192.168.1.1/</presentationURL> \
+ </device> \
+ </root> ";
+
+
+ UPnPParseDescriptionTest::UPnPParseDescriptionTest() : UnitTest("UPnPParseDescriptionTest")
+ {}
+
+
+ UPnPParseDescriptionTest::~UPnPParseDescriptionTest()
+ {}
+
+ bool UPnPParseDescriptionTest::doParse(const char* data,bool forward_test)
+ {
+ QString fn = "/tmp/UPnPParseDescriptionTest";
+ QFile fptr(fn);
+ if (!fptr.open(IO_WriteOnly))
+ {
+ Out() << "Cannot open " << fn << " : " << fptr.errorString() << endl;
+ return false;
+ }
+ fptr.writeBlock(data,strlen(data));
+ fptr.close();
+
+ kt::UPnPRouter router(QString::null,"http://foobar.com");
+ kt::UPnPDescriptionParser dp;
+
+ if (!dp.parse(fn,&router))
+ {
+ bt::Delete(fn,true);
+ return false;
+ }
+ else
+ {
+ Out() << "Succesfully parsed the UPnP contents" << endl;
+ bt::Delete(fn,true);
+ if (forward_test)
+ {
+ try
+ {
+ Out() << "Attempting to forward port 9999" << endl;
+ router.forward(net::Port(9999,net::TCP,true));
+ }
+ catch (Error & e)
+ {
+ Out() << "Error forwarding : "<< e.toString() << endl;
+ return false;
+ }
+ }
+ // router.debugPrintData();
+ return true;
+ }
+ }
+
+ bool UPnPParseDescriptionTest::doTest()
+ {
+ bool ret = true;
+ if (!doParse(test_data1,false))
+ {
+ Out() << "Test data 1 failed" << endl;
+ ret = false;
+ }
+
+ if (!doParse(test_data2,false))
+ {
+ Out() << "Test data 2 failed" << endl;
+ ret = false;
+ }
+
+ if (!doParse(test_data3,false))
+ {
+ Out() << "Test data 3 failed" << endl;
+ ret = false;
+ }
+
+ if (!doParse(test_data4,false))
+ {
+ Out() << "Test data 4 failed" << endl;
+ ret = false;
+ }
+
+ return ret;
+ }
+
+}
diff --git a/utests/upnpparsedescriptiontest.h b/utests/upnpparsedescriptiontest.h
new file mode 100644
index 0000000..29d4e1e
--- /dev/null
+++ b/utests/upnpparsedescriptiontest.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTUPNPPARSEDESCRIPTIONTEST_H
+#define UTESTUPNPPARSEDESCRIPTIONTEST_H
+
+#include <unittest.h>
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class UPnPParseDescriptionTest : public UnitTest
+ {
+ public:
+ UPnPParseDescriptionTest();
+ virtual ~UPnPParseDescriptionTest();
+
+ virtual bool doTest();
+ private:
+ bool doParse(const char* data,bool forward_test);
+ };
+
+}
+
+#endif
diff --git a/utests/upnpparseresponsetest.cpp b/utests/upnpparseresponsetest.cpp
new file mode 100644
index 0000000..0198ec7
--- /dev/null
+++ b/utests/upnpparseresponsetest.cpp
@@ -0,0 +1,66 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 <plugins/upnp/upnprouter.h>
+#include <plugins/upnp/upnpdescriptionparser.h>
+#include <plugins/upnp/upnpmcastsocket.h>
+#include "upnpparseresponsetest.h"
+
+using namespace kt;
+using namespace bt;
+
+namespace utest
+{
+
+ UPnPParseResponseTest::UPnPParseResponseTest() : UnitTest("UPnPParseResponseTest")
+ {}
+
+
+ UPnPParseResponseTest::~UPnPParseResponseTest()
+ {}
+
+
+ bool UPnPParseResponseTest::doTest()
+ {
+ static const char* test_ps = "M-SEARCH * HTTP/1.1\r\n"
+ "HOST: 239.255.255.250:1900\r\n"
+ "ST:urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n"
+ "MAN:\"ssdp:discover\"\r\n"
+ "MX:3\r\n"
+ "HTTP/1.1 200 OK\r\n"
+ "CACHE-CONTROL: max-age=1800\r\n"
+ "DATE: Mon, 13 Mar 2006 19:55:10 GMT \r\n"
+ "EXT:\r\n"
+ "LOCATION: http://192.168.1.1:52869/gatedesc.xml\r\n"
+ "SERVER: Linux/2.4.17_mvl21-malta-mips_fp_le, UPnP/1.0, Intel SDK for UPnP devices /1.2\r\n"
+ "ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n"
+ "USN: uuid:75802409-bccb-40e7-8e6c-fa095ecce13e::urn:schemas-upnp-org:device:InternetGatewayDevice:1\r\n\r\n";
+
+ UPnPMCastSocket mcast;
+ UPnPRouter* r = mcast.parseResponse(QCString(test_ps));
+ if (r)
+ {
+ delete r;
+ return true;
+ }
+
+ return false;
+ }
+
+}
diff --git a/utests/upnpparseresponsetest.h b/utests/upnpparseresponsetest.h
new file mode 100644
index 0000000..5186fd5
--- /dev/null
+++ b/utests/upnpparseresponsetest.h
@@ -0,0 +1,44 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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 UTESTUPNPPARSERESPONSETEST_H
+#define UTESTUPNPPARSERESPONSETEST_H
+
+#include <unittest.h>
+
+namespace utest
+{
+
+ /**
+ @author Joris Guisson <joris.guisson@gmail.com>
+ */
+ class UPnPParseResponseTest : public UnitTest
+ {
+ public:
+ UPnPParseResponseTest();
+
+ ~UPnPParseResponseTest();
+
+ virtual bool doTest();
+
+ };
+
+}
+
+#endif